Почему код бота игнорирует одну из трех async функций?

Рейтинг: 0Ответов: 1Опубликовано: 19.08.2023

Бот модерирует чат и управляет двумя таблицами: users и bans. В обеих таблицах users и bans есть запись одного и того же пользователя (тестовая). При получении комментария в чате, бот записывает id нового комментатора в таблицу users (первая функция) и проверяет наличие id комментатора в таблице bans (вторая функция). Если id есть в таблице bans, бот должен удалить любой комментарий "забаненного". Если комментатор не в бане, проверяется наличие в комментарии запрещенных слов (третья функция). Первая функция работает правильно, в users добавляется запись, но затем управление перепрыгивает в третью функцию и она тоже работает правильно: при наличии запрещенных слов комментарий удаляется. Однако, вторая функция не работает, комментарии пользователя из таблицы bans игнорируются и не удаляются. При запуске в PyCharm код работает без ошибок. Что именно нужно поправить в коде, в чем ошибка?

@dp.message_handler()
# Добавляем id каждого пользователя в users
async def check_database(message: types.Message):
    if not db.user_exists(message.from_user.id):
        db.add_user(message.from_user.id, message.from_user.first_name)
        await check_bans(message)
        await mess_handler(message)

async def check_bans(message: types.Message):
# Проверяем наличие id пользователя в bans, удаляем его комментарий
    if db.user_bans(message.from_user.id):
        await message.delete()
        await mess_handler(message)

async def mess_handler(message: types.Message):
# Удаляем комментарии, если есть запрещенные слова
    text = message.text.lower()
    if str(message.from_user.id) != cfg.ADMIN_ID:
        for word in cfg.WORDS:
            if word in text:
                await message.delete()

Код файла db:

class Database:
    def __init__(self, db_file):
        self.connection = sqlite3.connect(db_file)
        self.cursor = self.connection.cursor()

    def user_exists(self, user_id):
        with self.connection:
            result = self.cursor.execute("SELECT * FROM 'users' WHERE 'user_id' = ?", (user_id,)).fetchall()
            return bool(len(result))

    def user_bans(self, user_id):
        with self.connection:
            result1 = self.cursor.execute("SELECT * FROM 'bans' WHERE 'user_id' = ?", (user_id,)).fetchall()
            return bool(len(result1))

Ответы

▲ 0
  1. Попробуй расположить функции в обратном порядке.
  2. Попробуй разобраться правильно ли ты используешь декораторы @dp.message_handler().