Discord机器人开发需求:拒申请发DM并添加角色权限校验
Discord机器人/deny命令优化方案
核心修改点
- 新增目标用户参数,让命令能指定被拒绝的用户,而非仅给命令发起者发消息
- 添加角色权限校验,仅允许指定角色的成员执行拒绝操作
- 增加异常处理,应对无法向用户发送私信的场景(如用户关闭了私信权限)
优化后完整代码
import discord from discord.ext import commands # 替换为你允许执行该命令的角色ID(建议用ID,避免角色名称变更影响) ALLOWED_ROLE_ID = 123456789012345678 @bot.slash_command(name="deny", description="拒绝用户的申请并发送私信通知") async def deny(ctx, user: discord.User, msg: str): # 检查命令发起者是否拥有指定角色 has_permission = any(role.id == ALLOWED_ROLE_ID for role in ctx.author.roles) if not has_permission: await ctx.respond("你没有权限执行此命令", ephemeral=True) return # 尝试向目标用户发送私信 try: await user.send(msg) await ctx.respond(f"已向用户 {user.mention} 发送拒绝通知", ephemeral=True) except discord.Forbidden: await ctx.respond(f"无法向用户 {user.mention} 发送私信,对方可能关闭了私信权限", ephemeral=True)
关键代码说明
- 角色权限校验:通过遍历发起者的角色列表,对比预设的角色ID判断权限,用ID比角色名称更稳定,避免角色重名或改名导致校验失效
- 目标用户参数:使用
discord.User类型作为参数,Discord会自动在命令界面提供用户选择器,方便快速选择目标用户 - 异常处理:捕获
discord.Forbidden异常,当用户关闭私信或机器人被拉黑时,给命令发起者发送提示,避免机器人报错 - ephemeral=True:让机器人的回复仅命令发起者可见,避免频道内消息杂乱
内容的提问来源于stack exchange,提问作者The OPKNIGHT
相关产品推荐
相关产品推荐

