Итак, у меня есть Discord BOT с музыкальной шестеренкой, которая выглядит так:
def setup(bot):
class Music:
__slots__ = ("players", )
def __init__(self):
self.players = {}
def get_player(self, ctx):
# Retrieve the guild player.
def check_player(self):
def predicate(ctx):
# PREVIOUS CHECK
player = self.get_player(ctx)
# CHECK PLAYER STATE
return commands.check(predicate)
@commands.command()
@check_player(self)
async def a_command(self, ctx):
pass
bot.add_cog(Music())
Но я не могу использовать проверку check_player()
для команды a_command()
, так как self
не определен. Кто-нибудь знает, как я могу это исправить?
Как это get_player
работает? Возможно, это поведение не может войти внутрь check
, они в первую очередь предназначены для быстрой проверки, которую вы можете выполнить в контексте вызова.
@PatrickHaugh
def get_player(self, ctx):
"""Retrieve the guild player, or generate one."""
try:
player = self.players[ctx.guild.id]
except KeyError:
player = MusicPlayer(ctx, bot)
self.players[ctx.guild.id] = player
except:
return None
return player
Вот как работает проверка get_player()
.
В будущем вы должны отредактировать подобные вещи в своем вопросе. Тем не менее, этот код обязательно должен быть вызван из самой команды, потому что он имеет значение, выходящее за рамки базовой проверки.
Вам нужно определить свой чек как функцию, которая просто принимает
ctx
. Это не может быть метод вашего винтика или полагаться наself
. (Потому что обратный вызов для проверки регистрируется только один раз для всех экземпляров класса). Что проверяет чек?