You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:55:00