Почему не удаляется сообщение бота в чате?

  1. Есть telegram-bot на aiogram и sqlite.

  2. Есть алгоритм, удаляющий присланную только-что команду пользователем и предыдущее сообщение, отправленное ботом пользователю, являющееся ответом на предыдущую команду пользователя.

    2.1 id сообщения бота записывается в базу данных пользователя.

    2.2 Алгоритм извлекает из БД id и по нему удаляет сообщение.

    2.3 Сам алгоритм:

    async def del_last_bot_message(*args):
    '''
    Удаление лишних сообщений для реализации "чистого интерфейса"
    '''
        print(f'ENTER MESSAGE: {args[0].message_id + 1}')
    
    # Удаление сообщения пользователя
        try:
            await args[0].delete()
        except:
            Exception
    
    # Удаление последнего сообщения бота по id
        bmi = dict(ast.literal_eval(database.select_user_data(args[0])))
        while len(bmi['bot_mes_id']) > 0:
            bmi = dict(ast.literal_eval(database.select_user_data(args[0])))
            for ids in bmi['bot_mes_id']:
                try:
                    print(f'TRY DEL MES: {ids} OF {args[0].from_user.username}')
                    await bot.delete_message(args[0].chat.id, ids)
                    print(f'DONE DEL MES: {ids} OF {args[0].from_user.username}')
                    database.del_bmi_element(args[0], ids)
                    print(f'DONE DEL ELEM: {ids} OF {args[0].from_user.username}')
                except:
                    print(f'FAILE DEL MESSAGE: {ids} OF {args[0].from_user.username}')
                    continue
        if len(bmi['bot_mes_id']) == 0:
            database.create_bmi_in_user_data(args[0])
            print(f'LAST FOO: {args[0].message_id + 1} {args[0].from_user.username}')
    

    2.4 Алгоритм создания id сообщения и помещения его в БД:

    class DataBase():
    ...
        def create_bmi_in_user_data(self, message):
        '''Создание id сообщения бота и помещение его в user_data'''
            user_data_dict = dict(ast.literal_eval(database.select_user_data(message)))
            try:
                user_id = message.chat.id
            except:
                user_id = message.from_user.id
            user_data_dict['bot_mes_id'].append(message.message_id + 1)
            try:
                with self.connection:
                    return self.cursor.execute(f'''UPDATE users_table SET user_data = "{user_data_dict}" WHERE user_id = "{user_id}"''')
            except:
                Exception
    
        def del_bmi_element(self, message, element):
        '''Удаление id сообщения бота из словаря и возвращение словаря в user_data'''
            user_data_dict = dict(ast.literal_eval(database.select_user_data(message)))
            try:
                user_id = message.chat.id
            except:
                user_id = message.from_user.id
            user_data_dict['bot_mes_id'].remove(element)
            with self.connection:
                return self.cursor.execute(f'''UPDATE users_table SET user_data = "{user_data_dict}" WHERE user_id = "{user_id}"''')
    
        def select_user_data(self, message):
        '''Выделение user_data пользователя в БД'''
            try:
                user_id = message.chat.id
            except:
                user_id = message.from_user.id
            with self.connection:
                return self.cursor.execute(f'''SELECT user_data FROM users_table WHERE user_id = "{user_id}"''').fetchone()[0]
    

    2.5 Ситуация в терминале ("Чистый запуск" с обнулённой БД и историей чата): введите сюда описание изображения

  3. Исходя из данных импровизированных логов, представленных выше, и работы бота, алгоритм работает как надо и для каждого пользователя, всё окей.

  4. Проблема появляется, когда два и более пользователей ОДНОВРЕМЕННО присылают команду боту. После неё, алгоритм так же срабатывает как надо, но при следующей отправке команды перестаёт работать.

    4.1 Логи:

    введите сюда описание изображения

    4.2 Исходя из логов, алгоритм не может удалить сообщение по id и пытается это сделать бесконечное количество раз, что очень странно, так как сообщение бота, соответствующее используемому id существует в чате:

    введите сюда описание изображения

    4.3 Если убрать конструкцию try/except из алгоритма 2.3 пункта, интерпретатор выдаёт ошибку

    File "..\main.py", line 1503, in del_last_bot_message await bot.delete_message(args[0].chat.id, ids) aiogram.utils.exceptions.MessageToDeleteNotFound: Message to delete not found

3й день ломаю голову над проблемой, не понимаю, в чём дело. Дополню информацию, если необходимо. Заранее спасибо.


Ответы (0 шт):