Discord Python: как установить пользовательские параметры, чтобы разрешить использование функции или нет - PullRequest
0 голосов
/ 18 марта 2020

Эй, у меня есть бот разногласий, и я хочу установить «разрешения» для использования некоторых команд, таких как команды для персонала, команды, доступные с заданными ролями, или даже с минимальным уровнем.

Поэтому я пытаюсь поместите каждую из моих команд в классе:

class class_test:

    def __init__(self):
        self.minimal_level = 0
        self.minimal_role_name = "valid_member"
        self.reset_time = 5
        self.pass_role = 0
        self.last_execution = 0
        self.executions = 0
        self.ban_members = []
        self.ban_role_name = ["mute", "warn 1", "warn 2"]


    @bot.command()
    async def __call__(self, ctx, *args, **kwargs):
        try:
            if self.minimal_role in ctx.author.roles :

                await ctx.send("do somthing")
            else:
                await ctx.send("This role no able to do this command !")

        except Exception as exception:
            await ctx.send(f"an error as occurs : ```{exception}```")

Но это не работает вообще. Затем я нашел винтики, но если бы я использовал их для каждой команды, я не смог бы разделить их на такие разделы, как staff_commands, game_economy, game_fight, game_utils, settings и т. Д. c, ...

сделать для каждой команды переменную в моем классе Cog с self.function_foo_perm = {minimal_level : 0, minimal_rol......}, но действительно ли это хорошее решение?

Наконец, я подумал создать специальный класс для передачи разрешения.

Но как лучше? Или это что-то лучше?

Спасибо за помощь!

1 Ответ

0 голосов
/ 19 марта 2020

Не связано: вы неправильно используете классы. То, что вы делаете, «работает», но невероятно хакерское.


В библиотеке discord.py есть много декораторов чеков, которые покрывают многое из того, что вам нужно:
https://discordpy.readthedocs.io/en/rewrite/ext/commands/api.html?highlight=has_role#checks

В случае ролей вы делаете:

@commands.has_role("rolename"/roleid)
@commands.has_any_role("rolename"/roleid,"rolename"/roleid,"rolename"/roleid ...)
@bot.command()
async def ... 

Пользовательские проверки могут быть реализованы следующим образом:

def check_if_it_is_me(ctx):
    return ctx.message.author.id == 85309593344815104

@bot.command()
@commands.check(check_if_it_is_me)
async def only_for_me(ctx):
    await ctx.send('I know you!')
...