@Alpha_Kun

Перестала работать команда в дискорд боте, в чем причина?

сделал на коленке дискорд бота, тот в свою очередь имел возможность крутить кубики и в зависимости от результата или увеличивать или уменьшать баланс пользователя. Но в какой то момент команда просто перестала работать. "Приложение не отвечает."

Что произошло и что с этим делать?

@commands.slash_command(
        name = "куб",
        aliases=["cube"],
        description="Крутить кубы!"
    )
    async def cube_k(self, ctx, st: int=0):
        cube=random.randrange(1,7)
        balance = await self.db.get_data(ctx.author)
        if st <= balance["balance"]:
            if st >= 1:
                if cube%2 == 0:
                    await  self.db.update_member("UPDATE users SET balance = balance + ? WHERE member_id = ? AND guild_id = ?", [st, ctx.author.id, ctx.guild.id])
                    if cube ==2:
                        embed = disnake.Embed(title=f"Выпало число: {cube}, Вы выиграли - {st}")
                        embed.set_image(url="https://i.ibb.co/MPqggKK/2.gif")
                    elif cube == 4:
                        embed = disnake.Embed(title=f"Выпало число: {cube}, Вы выиграли - {st}")
                        embed.set_image(url="https://i.ibb.co/SVMrN7J/4.gif")
                    else:
                        embed = disnake.Embed(title=f"Выпало число: {cube}, Вы выиграли - {st}")
                        embed.set_image(url="https://i.ibb.co/C9rx51j/6.gif")
                else:
                    await self.db.update_member("UPDATE users SET balance = balance - ? WHERE member_id = ? AND guild_id = ?", [st, ctx.author.id, ctx.guild.id])
                    if cube == 1:
                        embed = disnake.Embed(title=f"Выпало число: {cube}, Вы проиграли - {st}")
                        embed.set_image(url="https://i.ibb.co/g7JDfTN/1.gif")
                    elif cube == 3:
                        embed = disnake.Embed(title=f"Выпало число: {cube}, Вы проиграли - {st}")
                        embed.set_image(url="https://i.ibb.co/Qp2ChF9/3.gif")
                    else:
                        embed = disnake.Embed(title=f"Выпало число: {cube}, Вы проиграли - {st}")
                        embed.set_image(url="https://i.ibb.co/VLkjhyt/5.gif")
            else:
                await ctx.send("Ставка должна быть больше - 0 альфа-центов!")
        else:
            await ctx.send("У вас недостаточно средств!")
  • Вопрос задан
  • 28 просмотров
Решения вопроса 1
ghqstlysoul
@ghqstlysoul
Discord: ghqstlysoul
По ошибке:

Убираем из аргументов slash_command:
aliases = ["cube"]


В слэш-командах отсутствует данный параметр, поэтому он не может быть применён.

Так-же отсутсвует ответ на взаимодействие с интеракцией. Вы создали объект эмбеда, присвоили ему картинку, но не отправили, поэтому и возникает ошибка.

По чистоте и логике кода:

Так-же рекомендую ознакомиться с выражением return, так как подобный код состоящий из if, elif и else это ужасно.

Помимо этого, следует следить за тем, что бы части кода не повторялись, так например:

embed = disnake.Embed(title=f"Выпало число: {cube}, Вы проиграли/выйграли - {st}")


Используется 6 раз, вместо возможных двух.
Дополнительно, в слэш-командах используется параметр inter, вместо ctx для контекстных(префиксных) команд.

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

Для примера, сделаю ваш код чистым, в адекватном формате он будет выглядеть так:

@commands.slash_command(name="куб", description="Крутить кубы!")
    async def cube(self, inter: disnake.AppCmdInter, bet: int = commands.Param(le=1)):

        number = random.randint(1, 6) # Получаем номер кубика
        balance = await self.db.get_data(inter.author) # Получаем баланса пользователя

        if bet > balance["balance"]: # Если ставка больше баланса пользователя
            await inter.send("У вас недостаточно средств!") # Отправлять ошибку
            return # Прекращать код
        
        if number % 2 == 0: # Если остаток от деления на 2 равен нулю
            await  self.db.update_member("UPDATE users SET balance = balance + ? WHERE member_id = ? AND guild_id = ?", [bet, inter.author.id, inter.guild.id]) # Добавляь деньги
            embed = disnake.Embed(title=f"Выпало число: {number}, Вы выиграли - {bet}") # Создаём обьект эмбеда

            match number: # Вычисляем номер
                case 2: # Если равен 2, то:
                    embed.set_image(url="https://i.ibb.co/MPqggKK/2.gif") # Присваиваем картинку
                case 4:
                    embed.set_image(url="https://i.ibb.co/SVMrN7J/4.gif")
                case 6:
                    embed.set_image(url="https://i.ibb.co/C9rx51j/6.gif")

        else:
            await self.db.update_member("UPDATE users SET balance = balance - ? WHERE member_id = ? AND guild_id = ?", [bet, inter.author.id, inter.guild.id]) # Забрать деньги
            embed = disnake.Embed(title=f"Выпало число: {number}, Вы проиграли - {bet}")

            match number:
                case 1:
                    embed.set_image(url="https://i.ibb.co/g7JDfTN/1.gif")
                case 3:
                    embed.set_image(url="https://i.ibb.co/Qp2ChF9/3.gif")
                case 5:
                    embed.set_image(url="https://i.ibb.co/VLkjhyt/5.gif")

        await inter.response.send_message(embed=embed) # Отправляем конечный эмбед
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Miwa122op1
Откуда в aliases в нашли список?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы