跳转至

事件与操作

Discord 运行操作面:反应与在线状态唤醒、机器人在线状态、网关代理、配置写入以及 PluralKit。

事件与操作

反应通知

每个服务器的反应通知模式(guilds.<id>.reactionNotifications):

  • off
  • own(默认)
  • all
  • allowlist(使用 guilds.<id>.users)

反应事件会被转换为系统事件,并附加到路由的 Discord 会话。

在线状态事件

当人类成员从离线转为在线时,让服务器加入路由代理唤醒:

{
  channels: {
    discord: {
      intents: { presence: true },
      guilds: {
        "111111111111111111": {
          presenceEvents: {
            channelId: "222222222222222222",
            users: ["333333333333333333"], // optional; further narrow channel viewers
            reconnectSuppressSeconds: 300, // optional; new-session quiet window (0 disables)
            burstLimit: 8, // optional; max events per burst window
            burstWindowSeconds: 60, // optional; sliding burst-detection window
          },
        },
      },
    },
  },
}

presenceEvents 要求为路由代理启用心跳,并在 Discord Developer Portal 的应用 Bot 页面启用特权 Presence Intent。OpenClaw 会从每个完整的 GUILD_CREATE 快照中初始化当前在线成员,路由观察到的离线到在线转换,并且将稍后针对未观察到的成员的首次在线信号视为新可用。该成员可能在快照之后上线或加入,因此该事件不会断言确切的先前状态。只有能够查看 channelId 的人类成员才有资格:频道和公开线程需要在频道或父频道上具有 View Channel,而私密线程还要求成员身份或 Manage Threads。users 可以进一步缩小该受众范围。OpenClaw 会忽略机器人和未变化的在线状态,并在 Gateway 重启之间持久化每个用户八小时的冷却时间。当 Discord 建立新的 Gateway 会话并发送 READY 时,OpenClaw 会在服务器在线状态重建期间抑制持续 reconnectSuppressSeconds(默认 300,0 禁用)的在线状态派生事件,因此重新观察到的成员无法逐一唤醒代理。它还会对每个服务器成功入队的事件进行速率限制,限制为每 burstWindowSeconds 滑动窗口(默认 60)内 burstLimit 个事件(默认 8),并记录每个服务器的一次抑制事件。恢复的会话不会被当作新会话。Discord 对超过 75,000 名成员的服务器限制快照;在此情况下,OpenClaw 要求在问候之前收到明确的离线更新。系统事件携带不可变的用户、服务器和频道 ID,而不嵌入可变的显示名称。代理决定是否以及如何问候。

在线状态配置
当你设置状态或活动字段,或启用自动在线状态时,会应用在线状态更新。

仅状态:
{
  channels: {
    discord: {
      status: "idle",
    },
  },
}
活动(设置 `activity` 时,自定义状态是默认活动类型):
{
  channels: {
    discord: {
      activity: "Focus time",
      activityType: 4,
    },
  },
}
直播:
{
  channels: {
    discord: {
      activity: "Live coding",
      activityType: 1,
      activityUrl: "https://twitch.tv/openclaw",
    },
  },
}
活动类型映射:

- 0:正在玩
- 1:直播(需要 `activityUrl`;`activityUrl` 反过来要求 `activityType: 1`)
- 2:正在听
- 3:正在看
- 4:自定义(使用活动文本作为状态文本;表情符号可选)
- 5:正在比赛

自动在线状态(运行时健康信号):
{
  channels: {
    discord: {
      autoPresence: {
        enabled: true,
        intervalMs: 30000,
        minUpdateIntervalMs: 15000,
      },
    },
  },
}
自动在线状态将运行时可用性映射到 Discord 状态:健康 => online,降级或未知 => idle,耗尽或不可用 => dnd。默认值:`intervalMs` 30000,`minUpdateIntervalMs` 15000(必须小于或等于 `intervalMs`)。
配置写入
由频道发起的配置写入默认启用。这会影响 `/config set|unset` 流程(当命令功能启用时)。

禁用:
{
  channels: {
    discord: {
      configWrites: false,
    },
  },
}
网关代理
使用 `channels.discord.proxy` 将 Discord 网关 WebSocket 流量和启动时 REST 查询(应用 ID + 允许列表解析)通过 HTTP(S) 代理路由。
Discord 网关 WebSocket 代理是显式的;WebSocket 连接不会从 Gateway 进程继承环境代理环境变量。当配置了 `channels.discord.proxy` 时,启动时 REST 查询会使用此代理。
{
  channels: {
    discord: {
      proxy: "http://proxy.example:8080",
    },
  },
}
按账户覆盖:
{
  channels: {
    discord: {
      accounts: {
        primary: {
          proxy: "http://proxy.example:8080",
        },
      },
    },
  },
}
PluralKit 支持
启用 PluralKit 解析,将代理消息映射到系统成员身份:
{
  channels: {
    discord: {
      pluralkit: {
        enabled: true,
        token: "pk_live_...", // optional; needed for private systems
      },
    },
  },
}
说明:

- 允许列表可以使用 `pk:<memberId>`
- 仅当 `channels.discord.dangerouslyAllowNameMatching: true` 时,成员显示名称才按名称/slug 匹配
- 查询会使用原始消息 ID 查询 PluralKit API
- 如果查询失败,代理消息会被视为机器人消息并丢弃,除非 `allowBots` 允许它们通过

你是一名专业的技术文档翻译人员。请将用户的 Markdown 翻译成简体中文。

规则: - 保持所有代码块、行内代码、URL、HTML 标签和 Markdown 结构不变。仅翻译正文文本(以及引用块 / 列表项 / 表格单元格中的正文)。 - 不要翻译代码标识符、命令、文件路径、API 名称或品牌/产品名称(例如 Ollama、Docker、GPU、REST、JSON、Token、Prompt、Claude Code)。 - 保留标题级别;对于每个标题,通过 attr_list 添加其原始英文锚点,例如 "## Install Guide" -> "## 安装指南 {#install-guide}"(slug = 由原始英文标题的小写单词用连字符连接而成)。 - 仅输出翻译后的 Markdown,不要前言,不要用代码围栏包裹整个输出。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw