运行.say命令时Discord Bot无响应排查(已匹配指定角色ID)
Discord Bot .say命令无响应问题排查
核心问题分析
- 逻辑判断完全颠倒:代码里的
if(!message.member.roles.cache.some(...))是指没有指定角色的用户才会进入命令执行分支,你本身拥有该角色,所以代码直接跳过了.say的逻辑,自然没任何响应。 - 频道ID无效:日志频道ID里混了字母
s(100704202s2756065411),Discord频道ID是纯数字,这个错误会导致发送日志失败,你没看到报错可能是没开启Bot的错误日志。 - 命令匹配逻辑太死板:
message.content === '.say'要求输入必须完全等于.say,如果输入.say 你好这种带内容的命令根本触发不了,应该用startsWith匹配前缀。 - setTimeout参数错误:把延时时间写成了字符串
'50',虽然JS会自动转换,但规范上应该用数字类型。
修复后的代码
client.on('message', async message => { // 忽略机器人自身消息 if(message.author.bot) return; // 判断用户拥有指定角色才允许执行命令 if(message.member.roles.cache.some(r => r.id === '1007043154182160466')){ // 匹配以.say开头的命令 if (message.content.startsWith('.say')) { // 提取命令后的内容 const SayMessage = message.content.slice(4).trim(); // 50ms后删除用户发送的命令消息 setTimeout(() => message.delete(), 50); // 在当前频道发送内容 message.channel.send(SayMessage); // 修正频道ID为纯数字,发送日志消息 client.channels.cache.get('1007042022756065411') .send(`${SayMessage} **from** **${message.author.username}** (${message.author})`); } } else { // 无权限用户发送命令时添加⛔反应 message.react('⛔'); } });
额外排查点
- 确认Bot在服务器内拥有发送消息和删除消息的权限。
- 如果Bot仍无法获取角色数据,尝试用
await message.member.fetch()强制加载成员角色缓存,避免数据未加载的问题。
内容的提问来源于stack exchange,提问作者rat
相关产品推荐
相关产品推荐

