@zxcigan

Не могу понять в чем проблема?

Это код бота, которого я пытаюсь сделать:

import discord
from discord.ext import commands
import sqlite3
import config
from config import settings

client = commands.Bot(command_prefix = settings['PREFIX'])
client.remove_command('help')

connection = sqlite3.connect('server.db')
cursor = connection.cursor()


@client.event
async def on_ready():
	cursor.execute("""CREATE TABLE IF NOT EXISTS users (
		name TEXT,
		id TNT,
		cash BIGINT,
		rep INT,
		lvl INT
	)""")

	for guild in client.guilds:
		for member in guild.members:
			if cursor.execute(f"SELECT id FROM users WHERE id = {member.id}").fetchone() is None:
				cursor.execute(f"INSERT INTO users VALUES ('{member}', {member.id}, 0, 0, 1)")
			else:
				pass
	connection.commit()
	print('BOT LOX')


@client.event
async def on_member_join(member):
	if cursor.execute(f"SELECT id FROM users WHERE id = {member.id}").fetchone() is None:
		cursor.execute(f"INSERT INTO users VALUES ('{member}', {member.id}, 0, 0, 1)")
		connection.commit()
	else:
		pass


@client.command()
async def cash(ctx, member: discord.Member = None):
	if member is None:
		await ctx.send(embed = discord.Embed(
			description = f"""У тебя , **{ctx.author}**  вот столько балов!**{cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]} :polegar_para_cima:**"""
		))
	else:
		await ctx.send(embed = discord.Embed(
			description = f"""У него, **{member}** вот столько балов!**{cursor.execute("SELECT cash FROM users WHERE id = {}".format(member.id)).fetchone()[0]} :polegar_para_cima:**"""
		))


client.run(settings['TOKEN'])

Он запускается, но когда я пишу команду cash, то мне выдает ошибку:

Ignoring exception in command cash:
Traceback (most recent call last):
  File "C:\Users\black\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\core.py", line 85, in wrapped
    ret = await coro(*args, **kwargs)
  File "C:\Python\bot.py", line 47, in cash
    description = f"""У тебя , **{ctx.author}**  вот столько балов!**{cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]} :polegar_para_cima:**"""
TypeError: 'NoneType' object is not subscriptable

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\black\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\bot.py", line 939, in invoke
    await ctx.command.invoke(ctx)
  File "C:\Users\black\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\core.py", line 863, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "C:\Users\black\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\core.py", line 94, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: TypeError: 'NoneType' object is not subscriptable
  • Вопрос задан
  • 226 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
description = f"""У тебя , **{ctx.author}** вот столько балов!**{cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]} :polegar_para_cima:**"""

Вот это - трижды говнокод.
1. Не засовывай в шаблонные строки ничего сложнее одной арфиметической операции - результат абсолютно нечитаем и неконтролируем (в чем ты убедился).
Неправильно:
description = f"""У тебя , **{ctx.author}** вот столько балов!**{cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]} :polegar_para_cima:**"""

Правильно:
score = cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]
description = f"""У тебя , **{ctx.author}** вот столько балов!**{score} :polegar_para_cima:**"""

2. Никогда не формируй запросы через форматирование строк. Слишком легко словить ошибку, явную или неявную.
Неправильно:
score = cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id))

Правильно:
score = cursor.execute("SELECT cash FROM users WHERE id = ?", (ctx.author.id,) )

3. Всегда проверяй, что ты получаешь из базы! Нет гарантий, что запись с указанным id и впрямь существует.
Неправильно:
score = cursor.execute("SELECT cash FROM users WHERE id = ?", (ctx.author.id,) ).fetchone()[0]
description = f"""У тебя , **{ctx.author}** вот столько балов!**{score} :polegar_para_cima:**"""

Правильно:
score_row = cursor.execute("SELECT cash FROM users WHERE id = ?", (ctx.author.id,) ).fetchone()
if score_row is not None:
    description = f"""У тебя , **{ctx.author}** вот столько балов!**{score_row[0]} :polegar_para_cima:**"""
else:
    # что делать, если такого юзера еще нет в базе?
    cursor.execute("INSERT INTO users (id, cash) VALUES (?, 0)", (ctx.author.id,) ) # можно его добавить
    description = f"""У тебя , **{ctx.author}** пока нет ничего! Но скоро будет!"""

4. БаЛЛов, блин.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
neredko1703
@neredko1703
Начинающий программист женского пола
это не в тему, но чисто совет, если хостинг heroku , то выбирай базу mongodb.
(если вопросы есть пиши в дс neredko#3131 постараюсь помочь)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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