Discord.js 机器人上线时如何在所有已加入服务器发送启动消息?
实现Discord机器人启动时全服务器同步版本更新日志的方案
现有代码的核心问题
- 事件触发逻辑完全偏离需求:原有代码将推送逻辑绑定在
message事件下,既不符合discord.js的事件绑定语法规范,也无法实现“机器人启动初始化完成、切换为在线状态时自动触发推送”的核心目标 - 流程缺失:没有遍历机器人已加入所有服务器的逻辑,无法满足多服务器同步推送的要求
- 语法错误:原有发送内容的字符串未正确闭合,直接运行会触发脚本报错
正确实现逻辑
- 选用匹配需求的触发事件:使用discord.js内置的
ready事件作为推送触发源,该事件会在机器人完成全量网关连接、资源加载、状态切换为在线时自动执行 - 全量遍历接入服务器:通过客户端实例的
guilds.cache属性获取当前所有已加入的公会列表 - 权限适配:为每个服务器自动匹配具备发送权限的可推送频道(优先选择服务器自带的系统频道),规避权限不足导致的推送失败
- 结构化推送内容:将版本基础信息、新增指令、移除指令、节点运行数据整合为统一格式的通知文本
可直接复用的示例代码
const { Client, GatewayIntentBits } = require('discord.js'); // 初始化客户端,加载运行必需的权限意图 const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages ] }); // 绑定机器人就绪触发事件 client.on('ready', async () => { // 组装更新日志通知内容 const updateNotice = ` Bot Name: My Bot Bot Version: 1.0.0 Owner: Rega! --- 本次版本更新内容: [新增指令] - /help 全量指令查询入口 - /ping 机器人响应延迟检测 [移除指令] - 临时测试版 /echo 调试指令 配套运行数据:当前节点平均指令响应延迟210ms,内存占用126MB `; // 逐服务器执行推送 for (const guild of client.guilds.cache.values()) { try { // 获取服务器默认系统频道 const targetChannel = guild.systemChannel; // 跳过无目标频道的服务器 if (!targetChannel) continue; // 校验机器人在当前频道的发送权限 const sendPermission = targetChannel.permissionsFor(guild.members.me)?.has('SendMessages'); if (!sendPermission) continue; // 发送更新通知 await targetChannel.send(updateNotice); } catch (err) { console.log(`${guild.name} 推送失败:${err.message}`); } } }); // 执行机器人登录 client.login('你的机器人鉴权Token');
内容的提问来源于stack exchange,提问作者Chaturya inc
相关产品推荐
相关产品推荐

