如何让Python Discord机器人给被@用户分配角色且限制命令调用权限
实现代码
# 需提前导入get方法:from discord.utils import get @client.event async def on_message(message): # 过滤机器人自己发的消息 if message.author == client.user: return # 自定义命令触发词,可按需修改 if message.content.startswith('!grant admin'): # 1. 权限校验:判断调用者是否持有管理员角色 admin_role = get(message.server.roles, name='Admin') if admin_role not in message.author.roles: await client.send_message(message.channel, "你没有权限使用该命令") return # 2. 获取被@的用户,校验是否@了目标用户 target_users = message.mentions if not target_users: await client.send_message(message.channel, "请@需要授予角色的用户") return # 3. 给所有被@的用户授予管理员角色 for user in target_users: await client.add_roles(user, admin_role) await client.send_message(message.channel, f"已成功为{len(target_users)}名用户授予Admin角色")
版本适配提示:上述代码适配discord.py旧版async分支,如果你使用的是v2.x正式版,需要对应修改三处写法:
message.server替换为message.guildclient.send_message替换为message.channel.sendclient.add_roles(user, role)替换为await user.add_roles(role)
核心改动说明
- 权限校验逻辑:命令触发后先检查发送者的角色列表是否包含指定的管理员角色,不满足条件直接终止流程,避免越权操作
- 目标用户替换:通过
message.mentions属性直接读取消息中被@的所有用户,替换原来的消息发送者message.author作为授权目标,支持同时@多个用户批量授权 - 异常分支补全:新增了无权限、未@用户的提示逻辑,避免无意义的报错
内容的提问来源于stack exchange,提问作者Cosmii02
相关产品推荐
相关产品推荐

