Ошибка с декоратором на python с библиотекой disnake ( Discord )

Команда не хочет запускаться и выдаёт постоянно одну и ту же ошибку.

Ignoring exception in command играть:
    raise MissingRequiredArgument(param)
disnake.ext.commands.errors.MissingRequiredArgument: ctx is a required argument that is missing.

Долго пытался фиксить, уже меня bot.command на commands.command, но в таком случае команда вообще не воспроизводится. Помогите пожалуйста.

Вот мой код:

# Класс персонажа
class Character:
    def __init__(self, name, player_class, max_hp, attack, defense):
        self.name = name
        self.player_class = player_class
        self.max_hp = max_hp
        self.hp = max_hp
        self.attack = attack
        self.defense = defense
        self.max_defense = defense
        self.in_battle = False
        self.in_travel = False
        self.in_game = False

    def take_damage(self, amount):
        self.hp -= amount
        if self.hp < 0:
            self.hp = 0

    def is_alive(self):
        return self.hp > 0


class Game:
    def __init__(self, bot):
        self.bot = bot
        self.in_game = False
        self.character = None

        # Словарь базовых характеристик классов персонажей
        self.class_stats = {
            'воин': {
                'max_hp': 100,
                'attack': 10,
                'defense': 5
            },
            'лучник': {
                'max_hp': 80,
                'attack': 12,
                'defense': 3
            },
            'маг': {
                'max_hp': 60,
                'attack': 15,
                'defense': 2
            }
        }

# Функция для создания персонажа
    def create_character(self, name, player_class):
        class_stat = self.class_stats[player_class]
        return Character(name, player_class, class_stat['max_hp'], class_stat['attack'], class_stat['defense'])

    # Команда для начала игры
    @bot.command(name='играть')
    async def start_game(self, ctx):
        if self.in_game:
            await ctx.send('Вы уже в игре!')
            return
        self.in_game = True
        await ctx.send('Добро пожаловать в игру! Как вы назовете своего персонажа?')
        def check(message):
            return message.author == ctx.author and message.channel == ctx.channel
        msg = await self.bot.wait_for('message', check=check)
        name = msg.content
        await ctx.send(f'Отлично, {name}! Выберите свой класс: воин, лучник или маг.')
        msg = await self.bot.wait_for('message', check=check)
        char_class = msg.content.lower()
        if char_class not in ['воин', 'лучник', 'маг']:
            await ctx.send('Неправильный класс!')
            self.in_game = False
            return
        self.character = self.create_character(name, char_class)
        await ctx.send(f'Вы выбрали класс {char_class}! Теперь вы можете начать бой командой !бой.')

        # Выбор случайного врага
        enemy_name, enemy_stats = random.choice(list(enemies.items()))
        enemy = Character(enemy_name, enemy_name, *enemy_stats)

        # Создание Embed сообщения для вывода информации о бое
        @commands.command(name='бой')
        async def battle(ctx, self, enemy):
            if not self.in_game:
                await ctx.send('Вы еще не начали играть!')
                return
            if self.in_battle:
                await ctx.send('Вы уже в бою!')
                return
            self.in_battle = True
            battle_embed = disnake.Embed(title='Начало боя!', color=0x00ff00)

            # Цикл боя
            while self.is_alive() and enemy.is_alive():
                # Обновление информации в Embed сообщении
                battle_embed.clear_fields()
                battle_embed.add_field(name=f'**{self.player_class.upper()}**',
                                        value=f'**{self.name}**\n*Здоровье*: {self.hp}\n*Защита*: {self.defense}\n*Атака*: {self.attack}',
                                        inline=True)
                battle_embed.add_field(name='\u200B', value='\u200B', inline=True)
                battle_embed.add_field(name='**ВРАГ**',
                                        value=f'**{enemy.name}**\n*Здоровье*: {enemy.hp}\n*Защита*: {enemy.defense}\n*Атака*: {enemy.attack}',
                                        inline=True)

            # Вывод информации о персонажах
            await ctx.send(embed=battle_embed)

            # Выбор действия игрока
            await ctx.send('Выберите действие (атаковать/защищаться):')

            def check(msg):
                return msg.author == ctx.author and msg.content.lower() in ['атаковать', 'защищаться']

            msg = await bot.wait_for('message', check=check)
            action = msg.content.lower()

            # Ход игрока
            if action == 'атаковать':
                damage = random.randint(1, self.attack)
                enemy.take_damage(damage)
                await ctx.send(f'{self.name} атакует врага и наносит **{damage}** урона!')
            else:
                self.defense += 1
                await ctx.send(f'{self.name} **защищается** и повышает свою защиту на 1!')

            # Ход врага
            if enemy.is_alive():
                damage = random.randint(1, enemy.attack)
                self.take_damage(damage)
                await ctx.send(f'Враг атакует {self.name} и наносит **{damage}** урона!')
            # Определение победителя
            if self.is_alive() and not enemy.is_alive():
                winner = self.name
            else:
                winner = enemy.name

            # Создание Embed сообщения о победителе
            winner_embed = disnake.Embed(title=f'{winner} победил!', color=0x00ff00)
            await ctx.send(embed=winner_embed)
            # обнуление значений переменных и объектов
            self.hp = self.max_hp
            enemy.hp = enemy.max_hp
            self.defense = self.max_defense

Ответы (0 шт):