Discord.py Bot 的权限系统
问题描述
我正在使用 discord.py 和 asyncio 制作一个不和谐机器人.该机器人具有像 kick
和 ban
这样的命令,显然普通用户不应该使用这些命令.
I am in the process of making a discord bot using discord.py and asyncio. The bot has commands like kick
and ban
which obviously should not be available to normal users.
我想制作一个简单的系统,该系统将使用 ctx.message.author
检测用户角色的权限,以获取发送命令的用户.
I want to make a simple system which will detect what permissions the user's role has using ctx.message.author
to get the user who sent the command.
我不希望机器人检测到特定角色名称,因为这些名称因服务器而异.我也不想让机器人有多个文件以保持简单.
I do not want the bot to detect a specific role name as these vary across servers. I also prefer not to have multiple files for the bot to keep it simple.
我看过 discord.py 文档和其他各种来源,但没有一个包含如何实现他们谈论的各种方法的示例.
I have seen the discord.py documentation and various other sources but none contain examples of how to implement the various methods they talk about.
例如,这是我的机器人发出的一个命令:
As an example, here is a single command from my bot:
async def kick(ctx, userName: discord.User):
if True: #ctx.message.author.Permissions.administrator
await BSL.kick(userName)
else:
permission_error = str('Sorry ' + ctx.message.author + ' you do not have permissions to do that!')
await BSL.send_message(ctx.message.channel, permission_error)
if else
语句是我自己尝试做的.#ctx.message.author.Permissions.administrator
被注释掉,因为它不起作用并替换为 True
用于测试目的.
Where the if else
statement is my attempt of doing this on my own. The #ctx.message.author.Permissions.administrator
is commented out as it does not work and replaced with True
for testing purposes.
提前感谢您的任何帮助和建议.
Thank you for any help and suggestions in advance.
解决方案
Permissions
是类的名称.要获得消息作者权限,您应该访问 guild_permissions
作者的属性.
Permissions
is the name of the class. To get the message authors permissions, you should access the guild_permissions
property of the author.
if ctx.message.author.guild_permissions.administrator:
# you could also use guild_permissions.kick_members
更新:
验证调用命令的人的权限的更好方法是使用 commands 扩展的 ="nofollow noreferrer">check 功能,特别是 has_permissions
检查.例如,如果您只想向拥有 manage_roles
权限或 ban_members
权限的人打开命令,则可以这样编写命令:
A better way to validate the permissions of the person invoking the commands is by using the check feature of the commands
extension, specifically the has_permissions
check. For example, if you wanted to open your command only to people who had either the manage_roles
permission or the ban_members
permission, you could write your command like this:
from discord import Member
from discord.ext.commands import has_permissions, MissingPermissions
@bot.command(name="kick", pass_context=True)
@has_permissions(manage_roles=True, ban_members=True)
async def _kick(ctx, member: Member):
await bot.kick(member)
@_kick.error
async def kick_error(ctx, error):
if isinstance(error, MissingPermissions):
text = "Sorry {}, you do not have permissions to do that!".format(ctx.message.author)
await bot.send_message(ctx.message.channel, text)
相关文章