@happyjuic

Нужна помощь с sqlite3, discord.py?

Цель проста, хочу написать несколько команд, цель которых сначала вывести "страницу магазина в чат" т.е. в первом столбике название во втором цена а в третьем описание. После этого при помощи команды (например !купить *id товара*)
предмет покупался и помещался в инвентарь.
Я уже просто не знаю, я вариантов 15 перепробовал, у меня просто ничего не происходит. Бот запущен, в сети, но все равно ни-че-го.
Вот код (раньше он был больше, но потом я решил с нуля все переписать.):
from cgitb import text
from discord.ext import commands
import sqlite3
import discord
import random

TOKEN = "OTQ1NzU2NTQ5NzkcNq1ZOTY4.HhUybA.1flzil982KjpA2c_E1C0qR-XxLM"
bot = commands.Bot(command_prefix=('рпг'))
bot.remove_command( 'help' )
db = sqlite3.connect('eco.db')
c = db.cursor()

@bot.command()
async def купить(ctx, text, id):
    if c.execute("SELECT cost FROM shop WHERE name = ?", (text)).fetchone() > c.execute("SELECT money FROM userinfos WHERE id_user = ?", (id)).fetchone():
        await ctx.send("Недостаточно средств для покупки")      
    else:
        await ctx.send("Товар куплен")  

bot.run(TOKEN)
  • Вопрос задан
  • 96 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
В коде неправильного больше чем правильного...
1. У тебя написано, что команда должна получить два параметра - text и id. Если id она должна найти сама, то его нужно убрать из параметров купить(). id нужно получить из ctx.author.id.
2. Ты вообще пробовал обращаться к своей базе? Смотрел, что тебе возвращает fetchone()?
По твоему запросу она вернёт либо кортеж с одним значением, либо None, если не было найдено ни одной подходящей строки.
Ни то ни другое сравнивать непосредственно нельзя!
Вытащи результат в переменные, проверь на None, а потом уже сравнивай нулевые элементы.
3. Убери токен бота из тела вопроса.
4. Советую cursor создавать внутри обработчика, во избежание заморочек с одновременным использованием.
5. Советую указывать типы параметров в описании команды! discord.py обращает на них внимание, и пытается конвертировать входную строку.
async def купить(ctx, text: str):
6. Как уже было написано, execute() принимает вторым параметром КОРТЕЖ, пусть даже из одного элемента. А кортеж из одного элемента пишется как (item,).
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы