@Pam31
Начинающий разработчик ботов на Python.

В чём ошибка бота discord?

Ошибка:
Ignoring exception in command __balance:
Traceback (most recent call last):
File "C:\Users\Kiber1_KM7\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\ext\commands\core.py", line 85, in wrapped
ret = await coro(*args, **kwargs)
File "C:\Users\Kiber1_KM7\Downloads\myBot\bot.py", line 48, in __balance
description = f"""Баланс пользователя **{ctx.author}** составляет **{cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]} :leaves:**"""
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\Kiber1_KM7\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\ext\commands\bot.py", line 939, in invoke
await ctx.command.invoke(ctx)
File "C:\Users\Kiber1_KM7\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\ext\commands\core.py", line 863, in invoke
await injected(*ctx.args, **ctx.kwargs)
File "C:\Users\Kiber1_KM7\AppData\Local\Programs\Python\Python39\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
код:
import discord
from discord.ext import commands

import sqlite3
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 INT,
		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 connected')


@client.event
async def on_member_join(member):
	if cursor.execute(f"SELECT id FROM user 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(aliases = ['balance', 'cash']) 
async def __balance(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]} :leaves:**"""
		))
	else:
		await ctx.send(embed = discord.Embed(
			description = f"""Баланс пользователя **{member}** составляет **{cursor.execute("SELECT cash FROM users WHERE id = {}".format(member.id)).fetchone()[0]} :leaves:**"""
		))


client.run(settings['TOKEN'])
  • Вопрос задан
  • 134 просмотра
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
> 'NoneType' object is not subscriptable
> .fetchone()[0]
Запрос не вернул ни одной строки, а ты этого не проверяешь.
И да:
1. Создание запроса с помощью .format() - говно, и путь к SQL-инъекции (ну или просто багам). Учись как пользоваться плейсхолдерами.
2. Вставка вызова метода внутрь шаблона форматирования - говно, так как нечитаемо. Да и возвращённое значение не проверишь, как ты только что убедился.
Вызови метод сначала, закинь результат в переменную, а потом уже её подставляй.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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