Discord SDK如何仅向指令所在服务器的所有频道发送消息
解决方案
核心修改逻辑是放弃遍历客户端全局的频道缓存,改为从指令触发的消息对象中获取当前所在服务器的频道列表,仅遍历该服务器的频道即可。
具体修改步骤
- 你现有逻辑外层的消息事件回调中一定可以拿到触发指令的
message对象,直接调用该对象的guild属性即可获取指令触发所在的服务器实例 - 将原代码中
client.channels.cache.forEach替换为message.guild.channels.cache.forEach,即可限定遍历范围为当前服务器 - 额外补充边界判断:避免指令在私聊频道触发时报错,以及避免机器人无对应频道发消息权限时报错
修改后可直接运行的代码
else if(command == 'snd'){ if(suffix == 'all'){ // 过滤私聊触发的场景 if(!message.guild) return; message.guild.channels.cache.forEach( channel => { // 仅向有权限发送消息的文本频道发消息 if(channel.type == "GUILD_TEXT" && channel.permissionsFor(client.user).has("SEND_MESSAGES")) { channel.send(sParameter[1]) } }); } }
原代码中
client.channels.cache存储的是机器人加入的所有服务器的所有频道,所以会出现跨服务器发消息的问题,message.guild.channels.cache仅存储当前触发服务器的频道列表,符合你的需求。
内容的提问来源于stack exchange,提问作者Conta
相关产品推荐
相关产品推荐

