如何避免添加Bot时触发Discord的GuildRoleCreate事件?
解决方法
跳过Bot加入时触发的GuildRoleCreate事件
Bot加入服务器时自动生成的角色就是它自己的服务器角色,直接判断这个角色是不是当前Bot的角色就行:
client.on('guildRoleCreate', (role) => { // 检查该角色是否是当前Bot在服务器里的最高权限角色(也就是自动创建的那个) if (role.guild.members.me.roles.highest.id === role.id) { return; } // 这里写你的正常业务逻辑 });
跳过Bot被踢出时触发的GuildRoleDelete事件
Bot被踢时删除的就是它自己的角色,有两种判断方式:
方式1:通过角色名称判断(简单直接)
client.on('guildRoleDelete', (role) => { if (role.name === client.user.username) { return; } // 正常业务逻辑 });
方式2:提前记录角色ID(更准确,避免重名问题)
如果担心服务器里有和Bot同名的角色,可以在Bot加入服务器时把自己的角色ID存起来,删除时匹配:
// 用Map存储每个服务器对应的Bot角色ID const botRoleMap = new Map(); // Bot加入服务器时记录角色ID client.on('guildCreate', (guild) => { const botHighestRole = guild.members.me.roles.highest; botRoleMap.set(guild.id, botHighestRole.id); }); // 处理角色删除事件 client.on('guildRoleDelete', (role) => { const savedBotRoleId = botRoleMap.get(role.guild.id); if (savedBotRoleId === role.id) { botRoleMap.delete(role.guild.id); // 清理已失效的记录 return; } // 正常业务逻辑 });
为什么你之前的代码没用?
你之前的代码是去获取操作执行者的成员对象,但Bot自动创建/删除角色的操作是Discord系统触发的,根本没有所谓的"executor"用户,所以你的判断条件永远不会触发,自然没用。
内容的提问来源于stack exchange,提问作者Oğulcan Ketenci
相关产品推荐
相关产品推荐

