Discord.js机器人重复消息命令故障求助:输入指定次数后仅发送一次消息
问题分析与解决方案
嘿,我一眼就瞅出问题所在啦!你当前代码里的核心错误是用错了方法——message.channel.messages.fetch()是用来获取频道历史消息的,和重复发送消息完全不搭边。所以不管你传入多少数字,它只会执行一次message.channel.send(),自然达不到重复发送的效果。
修正后的代码
我给你调整了代码逻辑,用循环来实现指定次数的消息发送,同时还加了小延迟避免触发Discord的发送速率限制:
async execute(message, args) { // 检查是否提供了次数参数 if(!args[1]) return message.channel.send("`Command Usage:\n-rqplay (amount)`"); const amount = parseInt(args[1]); // 验证是否为有效数字 if(isNaN(amount)) return message.channel.send("Please enter an actual number idiot :rolling_eyes:"); // 限制发送次数范围 if(amount > 15) return message.channel.send("I don't want to send that many messages :nauseated_face:"); if(amount < 1) return message.reply("Bro come on, are you this stupid?"); // 循环发送指定次数的消息 for(let i = 0; i < amount; i++) { await message.channel.send('@everyone play'); // 500毫秒延迟,避免刷屏触发限制 await new Promise(resolve => setTimeout(resolve, 500)); } }
关键改动说明
- 替换错误方法:移除了无用的
messages.fetch()调用,改用for循环控制发送次数 - 参数类型转换:把
args[1]字符串转成整数amount,避免后续比较时的隐式类型问题 - 添加速率控制:加入500毫秒延迟,防止短时间内大量发送消息被Discord限制
- 修正拼写小错误:把
are this stupid改成了are you this stupid,语法更通顺
额外提示
如果觉得循环加await的方式不够高效,也可以用Promise.all批量处理发送请求,但记得同样要注意速率限制:
// 另一种实现方式:用Promise.all批量发送 const sendPromises = Array.from({length: amount}, () => message.channel.send('@everyone play').then(() => new Promise(resolve => setTimeout(resolve, 500)) ) ); await Promise.all(sendPromises);
内容的提问来源于stack exchange,提问作者Ethan
相关产品推荐
相关产品推荐

