如何在discord.js中终止循环避免刷屏 实现每位成员仅接收1条消息
刷屏问题根因
你当前的代码存在嵌套遍历逻辑错误:外层遍历机器人加入的所有服务器,内层始终固定遍历触发命令的消息所在服务器的成员列表,有多少个服务器,就会给同一个成员重复发送多少次消息,最终导致刷屏。
修复方案
根据你的需求选择对应修改方案即可实现每位成员仅收到1条消息:
方案1:仅给当前触发命令的服务器成员发消息
直接删除外层的全服务器遍历即可:
message.channel.send(message.guild.name) message.guild.members.cache.forEach(member => { if (member.id != client.user.id && !member.user.bot) { member.send(`testing`).catch(e => console.error(`Couldn't DM member ${member.user.tag}`)); } });
方案2:给机器人加入的所有服务器的成员发消息
将内层遍历的message.guild改为外层遍历到的当前服务器即可:
client.guilds.cache.forEach(guild => { message.channel.send(guild.name) guild.members.cache.forEach(member => { if (member.id != client.user.id && !member.user.bot) { member.send(`testing`).catch(e => console.error(`Couldn't DM member ${member.user.tag}`)); } }); });
额外防重复优化
可增加去重集合彻底避免极端场景下的重复发送:
const sentMemberIds = new Set() client.guilds.cache.forEach(guild => { message.channel.send(guild.name) guild.members.cache.forEach(member => { if (member.id != client.user.id && !member.user.bot && !sentMemberIds.has(member.id)) { sentMemberIds.add(member.id) member.send(`testing`).catch(e => console.error(`Couldn't DM member ${member.user.tag}`)); } }); });
注意:Discord平台对批量主动私信用户的行为有严格风控限制,高频发送容易导致账号被限制功能甚至封禁,建议仅用于必要的通知场景。
内容的提问来源于stack exchange,提问作者Mr.Unknown
相关产品推荐
相关产品推荐

