Discord.js V14:实现8ball命令后自动回复用户任意消息
解决Discord.js V14中8ball命令触发后自动回复所有用户消息的问题
首先,你的原始代码存在两处关键错误,需要先修正:
- 随机数计算错误:
Math.floor(Math.random()*message.length)应改为Math.floor(Math.random()*messages.length),要基于预设回复数组的长度生成随机索引 - 回复内容错误:
message.reply(message[rnd])应改为message.reply(messages[rnd]),需从预设的回复数组中取值
要实现「触发8ball命令后,用户发任何内容都自动回复」的需求,核心是跟踪触发命令的用户,对其后续所有消息自动发送随机回复。具体实现如下:
实现步骤
- 用集合维护处于自动回复状态的用户ID,避免干扰其他用户
- 当用户发送
8ball命令时,将其ID加入集合,告知进入自动回复模式 - 全局监听消息,对集合内用户的所有消息自动发送随机回复,同时支持退出命令
完整修正代码
// 存储正在使用8ball自动回复的用户ID const active8ballUsers = new Set(); client.on('messageCreate', async (message) => { // 忽略机器人自身发送的消息,避免循环回复 if (message.author.bot) return; // 触发8ball自动回复模式 if (message.content.trim() === '8ball') { active8ballUsers.add(message.author.id); await message.reply('已进入8ball自动回复模式,你发任何内容我都会随机回复~ 发送"exit8ball"可退出'); return; } // 退出自动回复模式 if (message.content.trim() === 'exit8ball' && active8ballUsers.has(message.author.id)) { active8ballUsers.delete(message.author.id); await message.reply('已退出8ball自动回复模式'); return; } // 对处于自动回复状态的用户发送随机回复 if (active8ballUsers.has(message.author.id)) { const replies = [ '**NO**', '**YES**', '**MAYBE**', '**NEVER**', '**ASK AGAIN**', '**YES DEFINITELY.**', '**DONT COUNT ON IT**', '**BETTER NOT TELL YOU NOW**', '**MY REPLY IS NO**', '**YOU MAY RELY ON IT**', '**AS I SEE IT, YES**' ]; const randomIndex = Math.floor(Math.random() * replies.length); await message.reply(replies[randomIndex]); } });
代码说明
active8ballUsers集合用于精准跟踪需要自动回复的用户,不会影响其他正常聊天的用户- 增加
exit8ball命令,让用户可以主动结束自动回复模式 - 修正了原代码中随机数生成和回复内容的错误,确保随机回复功能正常运行
内容的提问来源于stack exchange,提问作者MAD_CRAZY
相关产品推荐
相关产品推荐

