Как внедрить аргументы из специального декоратора в команду в discord.py?Python

Программы на Python
Anonymous
Как внедрить аргументы из специального декоратора в команду в discord.py?

Сообщение Anonymous »

Я работаю над ботом, который отслеживает различные текстовые игры по разным каналам. Команды, используемые вне канала, в котором запущена соответствующая игра, конечно, не должны ничего делать, и их не следует активировать, если игра не запущена (например, когда скоро запускается новая игра). Поэтому почти все мои команды начинаются с одних и тех же строк кода

Код: Выделить всё

@commands.command()
async def example_command(self, ctx):
game = self.game_manager.get_game(ctx.channel.id)
if not game or game.state == GameState.FINISHED:
return
Я бы предпочел просто украсить все эти методы. Discord.py предоставляет систему декораторов «проверки» для автоматизации подобных проверок, но это не позволяет мне передать объект игры команде. Поскольку каждой команде нужна ссылка на этот объект, мне все равно придется каждый раз получать его снова, и в идеале я бы хотел просто передать его команде.
Моя наивность попытка декоратора выглядит следующим образом

Код: Выделить всё

def is_game_running(func):
async def wrapper(self, ctx):
# Retrieve `game` object here and do some checks
game = ...

return await func(self, ctx, game)

wrapper.__name__ = func.__name__

return wrapper

# Somewhere in the class
@commands.command()
@is_game_running
async def example_command(self, ctx, game):
pass
Однако это выдает довольно загадочную ошибку «discord.ext.commands.errors.MissingRequiredArgument: ctx — это обязательный аргумент, который отсутствует».
Я попробовал несколько вариантов этого, используя *args и т. д., но ничего не помогло.


Подробнее здесь: https://stackoverflow.com/questions/749 ... discord-py

Вернуться в «Python»