Ошибка с декоратором на 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