discord.py中on_message事件内校验触发用户是否持有Admin角色的实现方法
Discord机器人on_message模式管理员角色校验实现代码
可直接运行的完整示例
import discord from discord.ext import commands # 替换为你的机器人令牌 TOKEN = "你的机器人令牌" # 配置机器人Intents,必须开启对应权限才能正常获取角色、读取消息 intents = discord.Intents.default() intents.message_content = True intents.members = True client = commands.Bot(command_prefix=".", intents=intents) @client.event async def on_ready(): print(f"机器人已登录,当前身份:{client.user}") @client.event async def on_message(message): # 忽略机器人自身发送的消息,避免循环触发 if message.author.bot: return # 重置指令示例 if message.content == ".admin reset": # 立即删除触发消息,避免被其他用户查看 await message.delete() # 校验用户是否持有Admin角色 is_admin = any(role.name == "Admin" for role in message.author.roles) if is_admin: await message.channel.send("正在重置服务...") # 此处写入你的重置业务逻辑 else: await message.channel.send("你没有管理员权限,无法执行该指令") # 关停指令示例 if message.content == ".admin shutdown": await message.delete() is_admin = any(role.name == "Admin" for role in message.author.roles) if is_admin: await message.channel.send("正在关停机器人...") await client.close() else: await message.channel.send("你没有管理员权限,无法执行该指令") # 禁言指令示例,可按相同格式扩展其他指令 if message.content.startswith(".admin mute"): await message.delete() is_admin = any(role.name == "Admin" for role in message.author.roles) if not is_admin: await message.channel.send("你没有管理员权限,无法执行该指令") return if len(message.mentions) == 0: await message.channel.send("请@要禁言的目标用户") return target_user = message.mentions[0] # 示例为禁言10分钟,可自行调整时长 await target_user.timeout(discord.utils.utcnow() + discord.timedelta(minutes=10)) await message.channel.send(f"已禁言用户{target_user.mention}10分钟") client.run(TOKEN)
注意事项
- 你提供的初始示例代码存在两处错误:首先
user.roles是属性不是方法,不需要加()调用;其次roles列表存储的是角色对象而非字符串,必须比对role.name才能正常判断角色是否存在 - 必须在Discord开发者后台开启机器人的
Server Members Intent和Message Content Intent权限,否则无法正常获取用户角色和读取消息内容 - 其他管理员指令可按照相同格式扩展,复用角色校验逻辑即可
内容的提问来源于stack exchange,提问作者PstasDev
相关产品推荐
相关产品推荐

