@VeinKoor

Aogram Почему бот не отвечает на сообщение?

Бот не отвечает на сообщение, я думаю что это из за того, что обработчик в коде находится в самом конце, можно как то это исправить?

from aiogram import types, executor, Dispatcher, Bot
import sqlite3

token = ''

bot = Bot(token=token)
dp = Dispatcher(bot)

with sqlite3.connect("data.db") as db:
    cursor = db.cursor()

    cursor.execute("""CREATE TABLE IF NOT EXISTS users(
        chat_id TEXT not null ,
        username TEXT not null ,
        balance BIGINT
        
    )""")


@dp.message_handler(commands=['start'])
async def start(message: types.Message):
    cursor.execute(f"SELECT chat_id FROM users WHERE chat_id = '{message.chat.id}'") 

    if cursor.fetchone() is None:  
        cursor.execute(f"INSERT INTO users VALUES(?,?,?)", (message.chat.id, message.from_user.username, 0))  #
        await message.answer("База данных обновлена!")
        print("Данные занесены в таблицу")
        db.commit()




@dp.message_handler(content_types=['text'])
async def profile(msg: types.Message):
    if msg.text.lower() == "профиль":
        cursor.execute("SELECT * FROM users WHERE chat_id = '{msg.chat.id}'")
        for value in cursor.execute(f"SELECT * FROM users WHERE chat_id = '{msg.chat.id}'"):
            print(value[0], value[1], value[2])
            await msg.answer(f"id: " + value[0] + "\n" + "Имя: " + value[1] + "\n" + "Баланс: " + str(value[2]))





@dp.message_handler(content_types=['text'])
async def balance(msg: types.Message):
    if msg.text.lower() == "баланс":
        for value in cursor.execute(f"SELECT balance FROM users WHERE chat_id = {msg.chat.id}"):
            await msg.answer(f"Твой баланс: {value[0]}")




executor.start_polling(dp, skip_updates=True)

проблема с сообщением "баланс"
  • Вопрос задан
  • 466 просмотров
Пригласить эксперта
Ответы на вопрос 2
shurshur
@shurshur
Сисадмин, просто сисадмин...
Да, это потому что "в конце". Обработчики перебираются последовательно, и как находится подходящий, остальные не используются. А тут два обработчика с одинаковым декоратором, естественно, что первый будет применяться, а второй уже нет.

Надо или обрабатывать обе команды в одной функции, или отфильтровать в декораторе так, чтобы он применялся только к конкретным сообщениям

Условие commands=["баланс"] в декораторе позволит использовать команду как /баланс

А вот такой вариант:

@dp.message_handler(lambda message: message.text and (message.text.lower() == "баланс"))
позволит сделать то же самое без / перед словом "баланс". И вообще, так можно делать более сложные проверки.
Ответ написан
InternetMaster
@InternetMaster
Интернет
Все хорошо, но почему используется асинхронный aiogram, и неасинхронный sqlite3?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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