Здравствуйте, я создаю бота и в качестве инструмента использую aiogram.
Ошибка:
Task exception was never retrieved
future: <Task finished name='Task-9' coro=<Dispatcher._process_polling_updates() done, defined at D:\t_special_bot\venv\Lib\site-packages\aiogram\dispatcher\dispatcher.py:407> exception=NameError("name 'cur' is not defined")>
Traceback (most recent call last):
File "D:\t_special_bot\venv\Lib\site-packages\aiogram\dispatcher\dispatcher.py", line 415, in _process_polling_updates
for responses in itertools.chain.from_iterable(await self.process_updates(updates, fast)):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\t_special_bot\venv\Lib\site-packages\aiogram\dispatcher\dispatcher.py", line 235, in process_updates
return await asyncio.gather(*tasks)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\t_special_bot\venv\Lib\site-packages\aiogram\dispatcher\handler.py", line 117, in notify
response = await handler_obj.handler(*args, **partial_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\t_special_bot\venv\Lib\site-packages\aiogram\dispatcher\dispatcher.py", line 256, in process_update
return await self.message_handlers.notify(update.message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\t_special_bot\venv\Lib\site-packages\aiogram\dispatcher\handler.py", line 117, in notify
response = await handler_obj.handler(*args, **partial_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\t_special_bot\special_bot.py", line 48, in cmd_start
await load_parameters(user_id=message.from_user.id)
File "D:\t_special_bot\sqlite_db.py", line 15, in load_parameters
user = cur.execute("SELECT 1 FROM vocab WHERE user_id == '{key}'".format(key=user_id)).fetchone()
^^^
NameError: name 'cur' is not defined
Код в основном файле:
from aiogram import types, executor, Bot, Dispatcher
from aiogram.contrib.fsm_storage.memory import MemoryStorage
import os
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton, ReplyKeyboardRemove
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.dispatcher import FSMContext
from sqlite_db import db_start, load_parameters, edit_parameters
async def on_startup(_):
await db_start()
storage=MemoryStorage()
bot = Bot(token=os.getenv('TOKEN'))
dp = Dispatcher(bot, storage=storage)
#CLASSES
class DBStatesGroup(StatesGroup):
date = State()
ammount = State()
async def on_startup(_):
print('Bot is online')
#KEYBOARD
b1 = KeyboardButton('/Загрузить')
kb_client = ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)
kb_client.add(b1)
#srart
@dp.message_handler(commands=['start'])
async def cmd_start(message: types.Message):
await message.answer('Привет, я бот, который учит новым языкам. В выбранные тобой дату и время я буду присылать выбранное тобой количество слов, которые ты должен будешь выучить. Если не будешь следовать моим указаниям и не будешь учить слова, то я за тобой приду и поможет тебе только совершенное знание нового языка. Удачи на твоем пути:D', reply_markup=kb_client)
await load_parameters(user_id=message.from_user.id)
#fsm(обработка ответов пользователя и запись их во временное хранилище данных)
@dp.message_handler(commands='Загрузить', state=None)
async def cmd_load(message : types.Message):
await message.reply('Скажи, когда присылать слова?')
await DBStatesGroup.date.set()
#проверка формата записи
@dp.message_handler(lambda message: not message.text.isdigit(), state=DBStatesGroup.date)
async def check_date(message: types.Message):
await message.reply('Неверный формат даты, поменяйте на (дд.мм.гг).')
@dp.message_handler(lambda message: not message.text.isdigit() or float(message.text) < 1 or float(message.text) > 20, state=DBStatesGroup.ammount)
async def check_ammount(message: types.Message):
await message.reply('Неверный формат количества, слов может быть не меньше 0 и не больше 20.')
#ловим первый ответ от пользователя
@dp.message_handler(state=DBStatesGroup.date)
async def load_when(message: types.Message, state: FSMContext):
async with state.proxy() as data:
data['date'] = message.text
await message.reply('Теперь скажи, сколько слов присылать.')
await DBStatesGroup.next()
#второй ответ
@dp.message_handler(state=DBStatesGroup.ammount)
async def load_how_much(message: types.Message, state: FSMContext):
async with state.proxy() as data:
data['ammount'] = message.text
await message.answer(data)
print(data)
await edit_parameters(state, user_id=message.from_user.id)
await message.reply('Отлично, все параметры успешно заданы!')
await state.finish()
#реакция на любое нажатие
@dp.message_handler()
async def echo_send(message : types.Message):
await message.answer("Пык /start")
Код в файле с бд:
import sqlite3 as sq
async def db_start():
global db, cur
db = sq.connect('vocab.db')
cur = db.cursor()
if db:
print('DB is connected')
cur.execute("CREATE TABLE IF NOT EXISTS users(user_id TEXT PRIMARY KEY, date_and_time TEXT, word_drop TEXT, learned_words_id TEXT")
db.commit()
async def load_parameters(user_id):
user = cur.execute("SELECT 1 FROM vocab WHERE user_id == '{key}'".format(key=user_id)).fetchone()
if not user:
cur.execute("INSERT INTO vocab VALUES(?, ?, ?, ?)", (user_id, '', '', ''))
db.commit()
async def edit_parameters(state, user_id):
async with state.proxy() as data:
cur.execute("UPDATE vocab SET date_and_time = '{}', word_drop = '{}' WHERE user_id == '{}'".format(data['date'], data['ammount'], user_id))
db.commit()