Проверка прав доступа Discord.py Bot - PullRequest
0 голосов
/ 01 октября 2018

Я работаю над диссон-ботом для базовой модерации, который пока делает по крайней мере 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)

Но команды могут использовать любой член.Итак, попытался следовать этому = Система разрешений для 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 и т. Д., Также использовались для командования.

Заранее спасибо за помощь!Кроме того, извините, если я пропустил что-то глупое или глупое; -;

Ответы [ 3 ]

0 голосов
/ 01 октября 2018

Насколько я вижу в документации на discord.py discord.User - это не то же самое, что discord.Member .

Попробуйте изменить async def mod_ban(context, member: discord.User): до async def mod_ban(context, member: discord.Member):

0 голосов
/ 09 марта 2019

Если вы используете перезапись discord.py, вы можете использовать проверки ( проверки перезаписи Discord.py ), которые (явно) проверяют определенные вещи, такие как роли или разрешения для команды invoker

Вы можете использовать оба этих декоратора, ниже вашего первого декоратора

@commands.has_role("rolename"/roleid)
@commands.has_any_role("rolename"/roleid,"rolename"/roleid,"rolename"/roleid ...)

Где rolename - строка, содержащая ТОЧНОЕ название роли, буква за буквой и пробел за пробелом, а roleid - это идентификаторроль, которую, в случае ее упоминания, можно получить, набрав @rolename в любом из ваших чатов на сервере

Обратите внимание, как вы должны использовать второй декоратор, если вы хотите передать более одной роли для проверки

0 голосов
/ 01 октября 2018

Вы не передаете контекст в сопрограмму во втором примере (и, как предлагает @Andrei, вы можете только запретить членов):

@client.command(name='ban', pass_context=True)
async def mod_ban(context, member: discord.Member):
    ...

Кроме того, мне, вероятно, следует обновить myответ на этот вопрос .В контексте команд вы можете использовать очень мощные проверки , встроенные в discord.ext.commands, чтобы сделать многое для вас.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.")
...