权限检查 Discord.py 机器人
Posted
技术标签:
【中文标题】权限检查 Discord.py 机器人【英文标题】:Permission Check Discord.py Bot 【发布时间】:2019-03-06 17:17:51 【问题描述】:我正在开发一个用于基本审核的不和谐机器人,至少现在可以使用 kick
、ban
和 mute
。但问题是其他成员也可以使用它。我只想要几个指定的角色可以使用它。
也不想根据@role
处理它,因为不同服务器上的角色名称不一样。还希望使机器人尽可能简单。
现在,我是这样开始的:
@client.command(name='ban')
async def mod_ban(member: discord.User):
try:
await client.ban(member, delete_message_days=0)
await client.say('**0** has been banned.'.format(str(member)))
except Exception as error:
await client.say(error)
但是任何成员都可以使用这些命令。所以,试着按照这个 = Permission System for Discord.py Bot 并最终得到这个:
@client.command(name='ban')
async def mod_ban(context, member: discord.User):
if context.message.author.server_premission.administrator:
try:
await client.ban(member, delete_message_days=0)
await client.say('**0** has been banned.'.format(str(member)))
except Exception as error:
await client.say(error)
else:
await client.say('Looks like you don\'t have the perm.')
这让我遇到了这个错误:;-;
raise MissingRequiredArgument('0.name is a required argument that is missing.'.format(param))
discord.ext.commands.errors.MissingRequiredArgument: member is a required argument that is missing.
此外,除了context.message.author.server_premission.administrator
,我不仅希望具有管理员权限的角色使用此命令。我还想要一些其他具有很少权限的角色,例如manage message
、manage roles
等,也可以用来指挥。
提前感谢您的帮助!另外,对不起,如果我错过了任何愚蠢或愚蠢的事情;-;
【问题讨论】:
【参考方案1】:据我在 discord.py 文档中看到的 discord.User 与 discord.Member 不同。
尝试改变
async def mod_ban(context, member: discord.User):
到
async def mod_ban(context, member: discord.Member):
【讨论】:
Member
是User
的子类,但你说得对,User
没有ban
的必要属性来确定它们被禁止进入哪个服务器。
【参考方案2】:
如果你使用 discord.py 重写,你可以使用检查 (Discord.py rewrite checks) 其中(显然)检查某些内容,例如命令调用程序上的角色或权限
你可以使用这两个装饰器,在你的第一个装饰器下面
@commands.has_role("rolename"/roleid)
@commands.has_any_role("rolename"/roleid,"rolename"/roleid,"rolename"/roleid ...)
其中 rolename 是一个字符串,其中包含角色的确切名称,一个字母一个字母,一个空格一个空格,而 roleid 是角色的 id,如果可以提及,您可以通过在任何位置键入 @rolename 来获取它您的服务器聊天室
如果要传递多个角色进行检查,请注意如何使用第二个装饰器
【讨论】:
【参考方案3】:在第二个示例中,您没有将上下文传递给协程(正如@Andrei 建议的那样,您只能禁止成员):
@client.command(name='ban', pass_context=True)
async def mod_ban(context, member: discord.Member):
...
另外,我可能应该更新my answer to that question。在命令的上下文中,您可以使用内置于discord.ext.commands
中的非常强大的checks 来为您做很多事情。 has_permissions
完全符合您的要求,验证用户是否拥有任何必要的权限。
from discord.ext.commands import has_permissions, CheckFailure
@client.command(name='ban', pass_context=true)
@has_permissions(administrator=True, manage_messages=True, manage_roles=True)
async def mod_ban(ctx, member: discord.Member):
await client.ban(member, delete_message_days=0)
await client.say('**0** has been banned.'.format(str(member)))
@mod_ban.error
async def mod_ban_error(error, ctx):
if isinstance(error, CheckFailure):
await client.send_message(ctx.message.channel, "Looks like you don't have the perm.")
【讨论】:
from discord.ext.commands import has_permissions, MissingPermissions
抛出此错误:ImportError: cannot import name 'MissingPermissions'
@THEBlueBRAD.M 看起来在异步时它会引发CheckFailure
。以上是关于权限检查 Discord.py 机器人的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 discord.py 制作一个检查某个服务器通道中所有消息的机器人