Discord Bot开发:如何避免kick/ban指令误踢自身与机器人
Discord Bot 防误踢/误封禁校验实现方案
不需要硬编码你的ID来实现,通过discord.py内置的对象属性即可完成通用校验,逻辑如下:
需要新增的校验规则
- 禁止操作机器人自身:判断被操作成员的ID是否等于机器人账号ID
member.id == bot.user.id - 禁止操作指令调用者(也就是你自己):判断被操作成员是否等于指令发送者
member == ctx.author,你已经添加了@commands.is_owner()装饰器,只有所有者能调用指令,所以该判断可以完全避免你误操作自己
修改后的完整代码
@bot.command() @commands.is_owner() async def kick(ctx, member:discord.Member = None, *, reason="You smell bozo."): if member == None: await ctx.reply("*Check your arguments!*\n```/kick @MEMBER REASON(optional)```") return # 新增防误操作校验 if member == ctx.author or member.id == bot.user.id: await ctx.reply("*你不能踢自己或者机器人*") return await member.kick(reason=reason) @bot.command() @commands.is_owner() async def ban(ctx, member:discord.Member = None, *, reason="Bye Bye! :D."): if member == None: # 修复原代码中错误提示写的是/kick的问题 await ctx.reply("*Check your arguments!*\n```/ban @MEMBER REASON(optional)```") return # 新增防误操作校验 if member == ctx.author or member.id == bot.user.id: await ctx.reply("*你不能封禁自己或者机器人*") return await member.ban(reason=reason)
补充说明
如果后续你需要给bot添加多个管理员权限的调用者,不需要修改校验逻辑,ctx.author会自动适配为当前调用指令的用户,自动阻止所有管理员误操作自己。
内容的提问来源于stack exchange,提问作者mathewsjoyy
相关产品推荐
相关产品推荐

