Discord 频道扩展
AgentOS 的双向 Discord 消息通过 discord.js。 。 。 .
它提供什么
discordChannelSendMessagediscordChannelSendMediadiscordChannelcreateWebhookSender,在Discord webhook上贴出一个纯文本的帖子,没有bot,也没有不和.js(见 Webhook 发送者(中文(简体) )
运行时间状态
- 这是全程频道节目.
- 频道保持选入,因为它们可以连接,民意调查,或接收网络呼声.
- 打开它
createCuratedManifest({ channels: ['discord'] })或自定义扩展列表.
需要的秘密
discord.botToken
直接信件和未提及服务器信件
3个选项决定哪个消息到达主机,哪个包到达Discord. 每个都回到一个环境变量,然后到一个默认,使包的行为保持其一贯的:
| 选项 | 环境变量 | 数值 | 默认 |
|---|---|---|---|
directMessages | DISCORD_DIRECT_MESSAGES | ignore, (中文(简体) ), accept | ignore |
channelMessages | DISCORD_CHANNEL_MESSAGES | delayed, (中文(简体) ), immediate | delayed |
apiBase | DISCORD_API_BASE | rEST API 的基础地址 | 不合情理,j是属于自己的, https://discord.com/api |
createExtensionPack({
options: { botToken, directMessages: 'accept', channelMessages: 'immediate' },
});
directMessages。 。 。 . 与 ignore,包会丢掉每个直接消息(它的默认意图不要求Discord为他们),直接消息中发送的斜线命令会回答"在服务器频道(而不是DMs)中利用我". 与 accept,该包添加 DirectMessages 在登录时意图达到它的意图,默认或默认的意图 intents 选项名称,并打开不协调。 js's (英语) Channel 部分。 Discord只根据这一意图向一个机器人发出直接信息(网关意图),这个标准意图不需要在开发者门户网站中切换,直接消息的内容到达时没有特权消息内容的意图. 不和.js 将信件丢入它没有缓存的频道, 除非 Channel 部分内容在播放,第一个来自任何人的直接信息都在这样的频道中。 每一个直接消息然后立即到达主机,与 conversationType: 'direct',而直接发送的消息中的斜线命令会像在服务器频道中一样运行.
无 DISCORD_GUILD_ID 在Discord的默认上下文中, 包在全球登记其斜线命令, 就像它总是一样, 包括任何与它共享服务器的人与机器人直接通信。 与 DISCORD_GUILD_ID 设置它在服务器中注册它们,Discord在服务器中单独提供服务器的命令,从不直接发送消息(Discord)应用程序命令) (中文(简体) ). 所以说 DISCORD_GUILD_ID 财务报告和审定财务报表 accept,该包还在全球注册同样的命令与 BOT_DM 单独上下文互动背景:它们与bot一起出现在直接消息中,服务器不列出每个命令两次. 与 ignore 财务报告和审定财务报表 DISCORD_GUILD_ID,命令单独到服务器。 同步会创建或编辑命令, 并且永远不会删除命令, 所以命令更早 accept 直接信件已登记,在切换到 ignore,而运行一个消息的直接信息被回答"在服务器频道(而不是DMs)中利用我". 以后没有开始 DISCORD_GUILD_ID,或服务器同步失败并倒回全局指令的服务器,将每个这样的命令Discord的默认上下文(服务器,带bot的直接信件,以及其他直接和组消息)回放: Discord的编辑只更改它给出的字段(编辑全局应用程序命令)),所以一个不命名上下文的编辑会将其从每个服务器中省出.
channelMessages。 。 。 . 这决定了服务器消息会发生什么,既未提及机器人,也未回复. 提及或答复总是同时到达主办方. 与 delayed,包会将这样的消息丢入信息通道(#tech-news, (中文(简体) ), #world-news 以及其它的适配器列表),或者当它打开一个问候词或填充词时,是五个字符或更少,或者是一个孤独的自定义的emoji或链接. 它持有任何其他的两分钟,当其他人先在该频道张贴时,它就会放弃。 与 immediate,每个这样的消息都会同时到达主机,没有被丢弃,持有或取消. 主机的输入护栏再看到每个bot能读到的信息,由代理商决定是否回答. 每个消息都是转动,所以在繁忙的服务器上 immediate 花费一个模型调用每一个张贴在机器人可以读取的信息.
apiBase。 。 。 . 这变成了不和。 Js's (英语) rest.api,而网关地址来自 GET /gateway/bot 那里,因为它来自迪斯科德。 测试指向一个站立的Discord.
未知值为 directMessages 或者说 channelMessages,在选项或环境中,由于给设置取名出错而失败了包的创建,因此一个错误的拼接策略从未作为默认运行. 环境值是修剪的,无论如何.
被拒绝的机器人标志
当Discord拒绝bot 令牌时,适配器会发出一个 error 每次服务开始时的事件,服务停止:
adapter.on((event) => {
if (event.data?.code === 'auth_failed') {
// event.data is { code: 'auth_failed', channel: 'discord' }: ask for a new token.
}
}, ['error']);
Discord以三种方式拒绝一个符号,每个符号都算:
- 登录失败与不协调 。 js's (英语)
TokenInvalid错误, 因为网关查找( e)GET /gateway/bot回答401;开始以这个错误拒绝; - a 使用bot 令牌回答401(发送、取回、斜线命令同步)的 REST 呼叫; 交互响应使用相互作用本身的令牌而不计数;
- 网关以代码 4004 关闭会话, 认证失败; 不和. js 之后不会重新连接 .
事件命名频道, 并带有没有符号和信件文本 。 当包激活时拒绝一个令牌, 在主机订阅前被拒绝, 所以一个订阅的处理器 error 事件结束后,它会得到一次, 就在它订阅之后。 服务会写一个警告. DiscordService 曝光情况 tokenRejected 财务报告和审定财务报表 onTokenRejected(handler),且包输出 CHANNEL_AUTH_FAILED_CODE 财务报告和审定财务报表 isDiscordTokenRejected(err),它表示来自不和.js的错误是否是一个被拒绝的bot符号(一个交互器上的401或者一个webhook自己的路径不是).
服务器出错(500和上)或被丢弃的连接不是被拒绝的符号: REST客户端重复了5xx3次,如不和.js一样,频道持续运行.
Discord 以 401 拒绝时的斜线命令同步启动后, 就会以该错误拒绝开始; 与 DISCORD_GUILD_ID 设置,同步不会继续到全局命令。 如果同步因任何其他原因而失败, 服务会写出一个警告, 并且启动时没有它的斜线命令 .
Webhook 发送者
包裹通过两种方式到达了Discord. 机器人客户端( O)DiscordService,适配器和上面的工具) 登录一个bot 令牌,并服务频道 一个代理谈话进入. createWebhookSender 通过 Webhook 的 URL 将纯文本发布到一个频道,用于产品员工的提示:没有bot和登录. 它的代码没有从不和.js中调用,也没有启动客户端,尽管导入软件包的根仍然会装入不和.js,这是bot客户端需要的.
import { createWebhookSender } from '@framers/agentos-ext-channel-discord';
// The URL is a secret the product reads from its secret store at build time.
const alerts = createWebhookSender({ url: webhookUrl, timeoutMs: 5_000, logger });
const answer = await alerts.post({ content: 'A request has waited 30 minutes.', signal });
if (answer.outcome === 'sent') {
// answer.deliveryId is the id of the message Discord created.
} else if (answer.outcome === 'retry') {
// Post again after answer.afterMs.
} else {
// answer.kind is 'status' (answer.status names it), 'no_answer' or 'refused'.
}
每个邮件都发送 POST <url>?wait=true 与 Content-Type: application/json 和身体的颜色 { "content": "...", "allowed_mentions": { "parse": [] } }它发送不 username 或者说 avatar_url,所以webhook自己的名字和图片显示.
wait=true让Discord在消息解答前等待保存,并返回所创建的消息. 没有它,没有保存的信件返回不错误(执行 Webhook) (中文(简体) ).content是信件的文本, 最多2000个字符(执行 Webhook) (中文(简体) ). 发件人拒绝空帖,或者在任何请求之前拒绝一个超过2000个字符.allowed_mentions: { parse: [] }压制信件中的每一个引用: Discord 解析其任何用户,角色,@everyone或者说@here提及(允许引用) (中文(简体) ). Discord 建议allowed_mentions在webhook的帖子上执行 Webhook) (中文(简体) ).- A 429个 携带着JSON尸体
retry_after是等待的秒数,Discord请客户端等待Retry-After页眉或该字段( e)费率限制) (中文(简体) ). - 没有遵循方向 . 301 或 302 之后的 POST 成为一个没有身体的获取(获取, HTTP 直接获取),而且一个网点的 URL 返回网点对象(将 Webhook 与 Token 连接(b) 其国家
id将读取为创建的信息,尽管没有发布。 一个3xx是failed及其地位.http://discord.com以 301 回答一个 Webhook POSThttps://,所以 URL 开始于https://。 。 。 .
post 决断三个答案之一,决不放弃:
| 答复 | 何时 |
|---|---|
{ outcome: 'sent', deliveryId } | a 2xx,其身体为所创造的信息; deliveryId 这是它的 id |
{ outcome: 'retry', afterMs, status: 429 } | a 429; afterMs 是尸体的吗 retry_after,否则 Retry-After 标题, 否则30秒 |
{ outcome: 'retry', afterMs: 5_000, status } | a 2xx 在其体内无信息(204,或无信息) id这篇文章未经证实 |
{ outcome: 'failed', status, kind: 'status' } | 任何其它状态,包含重定向 |
{ outcome: 'failed', status: null, kind: 'no_answer' } | 网络故障、超时或呼叫者 signal 中止 |
{ outcome: 'failed', status: null, kind: 'refused' } | 内容为空或超过2000个字符,在任何请求之前被拒绝 |
一个期限, timeoutMs (默认为5,000起),覆盖整个交换, 身体的读取包括: 其标题立即来自一个从未结束的身体 no_answer来电者 signal (一个收发箱的债权期限,比如)加入这个最后期限,一个已经中止的信号不会发出什么信号. 一个错误状态在给出答案后立即结束请求,因此一个永远不结束的错误正体没有连接. 复试是呼叫者的:发送者每通呼叫一次发帖.
Webhook URL携带了webhook的符文,所以发件人视之为秘密. 它以无答、无出错和无日志行的形式出现;发送者通过 logger 选项 warn,为 discord_webhook 与 { outcome: 'no_answer' },而一个向那里投掷的日志会改变任何答案。 A 类 url 这不是有效的 URL 制作 createWebhookSender 丢出一个 TypeError 将价值排除在外.
真相来源
manifest.json定义导出的工具和消息通道描述符.src/包含适配器和工具执行.
释放
新版本发表于 架设层/剂-外延 由 GitHub Actions 通过 npm 信任的出版, 并附有出处声明 .