基于discord.js的工单类机器人开发求助:角色检测与值班设置
Discord工单机器人:值班集合+求助私信实现方案
嘿,我来帮你搞定这个需求!下面是基于discord.js v14的完整实现思路和代码示例,适配你要的「角色检测+值班集合+求助私信」核心功能:
第一步:基础准备
首先确保你已经初始化了discord.js项目,并且在Discord开发者平台给机器人开启了必要的意图(Guilds、GuildMessages、MessageContent、GuildMembers),这些是读取消息、获取成员角色的前提。
第二步:核心逻辑实现
1. 初始化全局变量
我们用一个Set来存储值班成员的ID(自动去重,避免重复加入),同时定义Helper角色的ID(用ID比角色名更可靠,防止改名失效):
const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent, GatewayIntentBits.GuildMembers ] }); // 存储值班成员ID的集合 const onDutyMembers = new Set(); // 替换成你服务器中Helper角色的实际ID const HELPER_ROLE_ID = '123456789012345678';
2. 处理+onduty指令(值班签到)
这个指令需要完成角色权限检测和加入值班集合两个核心动作:
client.on('messageCreate', async (message) => { // 忽略机器人自己发的消息 if (message.author.bot) return; // 处理+onduty指令 if (message.content === '+onduty') { // 禁止在私信里发指令(因为没法检测服务器角色) if (!message.member) { return message.reply('请在服务器频道内发送此指令哦!'); } // 检测用户是否拥有Helper角色 const hasPermission = message.member.roles.cache.has(HELPER_ROLE_ID); if (!hasPermission) { return message.reply('抱歉,只有拥有Helper角色的成员才能设置值班!'); } // 检查是否已经在值班队列中 if (onDutyMembers.has(message.author.id)) { return message.reply('你已经处于值班状态啦,不用重复签到~'); } // 加入值班集合 onDutyMembers.add(message.author.id); message.reply('成功加入值班队列!现在会收到用户的求助私信啦 🎉'); return; }
3. 处理+help指令(发起求助)
当用户发送这个指令时,遍历值班集合,给每个符合条件的成员发私信:
// 处理+help指令 if (message.content.startsWith('+help')) { // 先检查有没有值班成员 if (onDutyMembers.size === 0) { return message.reply('目前没有值班的Helper,请稍后再尝试哦!'); } // 提取用户的具体求助内容(去掉+help前缀) const helpContent = message.content.slice(5).trim() || '未提供具体求助内容'; // 给每个值班成员发送私信 for (const userId of onDutyMembers) { try { const helper = await client.users.fetch(userId); await helper.send(`📩 新的求助消息:\n来自用户:${message.author.tag}\n内容:${helpContent}`); } catch (error) { // 处理发送失败的情况(比如用户关闭了私信) console.error(`无法给用户 ${userId} 发送私信:`, error); message.reply(`⚠️ 无法联系到值班成员 <@${userId}>,可能对方关闭了私信功能`); } } message.reply('已通知所有值班的Helper,他们会尽快回复你的!'); return; } }); // 登录机器人 client.login('你的机器人Token');
额外优化建议
- 可以添加
+offduty指令,让值班成员退出集合,代码类似+onduty,把add换成delete即可; - 把角色ID、机器人Token放到环境变量里(用
dotenv包),避免硬编码泄露敏感信息; - 如果需要持久化值班集合(机器人重启后不丢失),可以把数据存在JSON文件或者数据库里;
- 可以给
+help指令添加频道限制,比如只能在指定的求助频道使用。
内容的提问来源于stack exchange,提问作者Ross
相关产品推荐
相关产品推荐

