You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:07:02