@LxneSamurai

Disnake.py, как сделать передачу денег другому участнику?

Доброго времени суток. Пишу дискорд-бота на библиотке Disnake. Сейчас застрял на команде, благодаря которой один участник передаёт валюту сервера другому (всё делается через базу данных sqlite). Проблема заключается в том, что вместо того, чтобы "добавить" денег второму участнику - с баланса списывает ровно то же количество денег, что и у первого. Крутил код и так и эдак, и всё бестолку. Ниже прикреплю код (сама функция прибавления и отнимания денег происходит при нажатии кнопки).

p.s. На сайте может отображаться чуть больше отступов в связи с тем, что вся команда находится в "классе".
@bot.slash_command(description='Передача денег другому участнику')
async def transfer(interaction, member: disnake.Member, amount):
        #ButtonsButtonsButtonsButtonsButtonsButtonsButtonsButtons
        view=View()
        amount=int(amount)
        da=Button(style=disnake.ButtonStyle.green, label="Да")
        async def da_callback(inter: disnake.MessageInteraction):
            if inter.author == interaction.author:
                cursor.execute('UPDATE level SET money = money - {} WHERE id = {}'.format(amount, inter.author.id))
                cursor.execute('UPDATE level SET money = money + {} WHERE id = {}'.format(amount, member.id))
                conn.commit()
                await inter.response.edit_message(embed=done, view=None)
            else:
                pass
        da.callback=da_callback
        view.add_item(da)

        net=Button(style=disnake.ButtonStyle.red, label='Нет')
        async def net_callback(inter: disnake.MessageInteraction):
            if inter.author == interaction.author:
                await inter.response.edit_message(embed=no, view=None)
            else:
                pass
        net.callback=net_callback
        view.add_item(net)
    
        #EmbedsEmbedsEmbedsEmbedsEmbedsEmbedsEmbedsEmbedsEmbeds
        yon=disnake.Embed(colour=disnake.Color.from_rgb(47, 49, 54))
        yon.add_field(name='Подтверждение операции', value=f'\u200b\nВы уверены, что хотите перечислить {amount} <:servvalute:967795640425930822> на счёт {member.mention}?')

        done=disnake.Embed(timestamp=interaction.created_at, colour=disnake.Color.from_rgb(52, 186, 88))
        done.add_field(name='<a:Yes1:965581422121353216> Успешная транзакция', value=f'\u200b\nНа счёт {member.mention} перечислено {amount} <:servvalute:967795640425930822>')

        no=disnake.Embed(timestamp=interaction.created_at, colour=disnake.Color.from_rgb(196, 55, 55))
        no.add_field(name='<a:noentr:965583104360198205> Отмена операции', value=f'\u200b\nВ последний момент {interaction.author.mention} передумал(-а)\nА такой сюоприз мог(-ла) устроить..')
        
        await interaction.send(embed=yon, view=view)
  • Вопрос задан
  • 352 просмотра
Решения вопроса 1
gnifajio
@gnifajio
Совершенствуюсь каждый день
Вот примерный код команды для Discord бота на Python с использованием Disnake:

import sqlite3

from disnake import Command, Member

# Определяем команду для перевода суммы другому участнику
@Command("transfer", description="Перевод суммы другому участнику")
async def transfer(member: Member, target: Member, amount: int):
    # Подключаемся к локальной базе данных sqlite
    conn = sqlite3.connect("database.db")
    cursor = conn.cursor()

    # Проверяем, хватает ли у текущего пользователя суммы для перевода
    cursor.execute(f"SELECT balance FROM users WHERE id = {member.id}")
    balance = cursor.fetchone()[0]
    if balance < amount:
        await member.send("У вас недостаточно средств для перевода")
        return

    # Снимаем сумму с аккаунта текущего пользователя
    cursor.execute(f"UPDATE users SET balance = balance - {amount} WHERE id = {member.id}")
    conn.commit()

    # Начисляем указанную сумму на аккаунт другого пользователя
    cursor.execute(f"UPDATE users SET balance = balance + {amount} WHERE id = {target.id}")
    conn.commit()

    await member.send(f"Сумма {amount} была переведена на аккаунт {target.name}")
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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