Telegram Bot ошибка aiogram.exceptions.TelegramBadRequest: Telegram server says - Bad Request: message is not modified

Допишу ответ исключения "указанное содержание нового сообщения и разметка ответа(reply_markup) в точности совпадают с текущим содержанием и разметкой ответа сообщения" Суть задачи, при нажатии на reply-кнопку обновить текущую клавиатуру reply_markup, если кол-во кнопок в ней изменилось. У меня есть метод tablesAsKeyboard(), который динамически создает reply-кнопки с именами таблиц из моей базы данных, которые я спарсил при помощи метода get_tables(). tablesAsKeyboard() я вызываю в методе-заголовке set_currentTable(), который помогает определить какую таблицу для просмотра/редактирования пользователь выбрал. Так же в боте есть функция создать новую таблицу... Дак вот, если пользователь не создавал новых таблиц, но нажал кнопку "Обновить список", то сервер телеграма выдает ошибку, что я пытаюсь заменить клавиатуру, которая уже актуальна, то есть смысла обновлять по идее нет, так как она точно такая же, поэтому я сделал дополнительную проверку if new_reply_markup != current_reply_markup:, дабы избежать этого исключения, но ошибка сохраняется, ПАМАГИТЕ), вот код:

## модуль data_query.py

@try_connect
def get_tables(curs: cursor) -> list:
    curs.execute(""" SELECT table_name 
        FROM information_schema.tables 
        WHERE table_schema = 'public' """)
    tablelist = curs.fetchall()
    tables = [table[0] for table in tablelist]
    return tables
## Модуль keyboard.py

async def tablesAsKeyboard():
    tablesKeyboard = InlineKeyboardBuilder()
    tables = get_tables()
    for table in tables:
        tablesKeyboard.add(InlineKeyboardButton(text=table, callback_data=f"{table}"))
    tablesKeyboard.add(InlineKeyboardButton(text="Обновить список", callback_data="update_menu"))
    return tablesKeyboard.adjust(2).as_markup()
## Модуль handler.py где я и вызываю reply клавиатуру

@router.message(F.text == "Редактировать таблицу")
async def update_table(message: Message, state: FSMContext):
    await state.set_state(PostgresDBconnect.currentTable)
    await message.answer("Список доступных таблиц:", reply_markup= await kb.tablesAsKeyboard())  

@router.message(PostgresDBconnect.currentTable)
@router.callback_query(TableCallbackFilter(get_tables()))
async def set_currentTable(callback: CallbackQuery, state: FSMContext):
    current_reply_markup = callback.message.reply_markup
    
    if callback.data == "update_menu":
        await state.update_data(currentTable = None)
        new_reply_markup = await kb.tablesAsKeyboard()
        if new_reply_markup != current_reply_markup:
            await callback.message.edit_reply_markup(reply_markup=new_reply_markup)
            await callback.answer("Список сущностей обновлён!")
        else:
            await callback.answer("Список сущностей не обновлён, так он еще актуален!")
    else:
        await state.update_data(currentTable = callback.data)
        await callback.answer(f"Таблица {callback.data} выбрана!")
        await state.clear()
```[![При нажатии на Обновить список, хочу обновить клавиатуру, если кол-во таблиц в бд изменилось][1]][1]


  [1]: https://i.sstatic.net/M0LijZpB.png

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

Автор решения: Oinichi

P.s. я часа 3 мучил gpt-бота и в итоге выяснил, что я сравнивал объекты разметок клавиатур, а не кнопки, далее тупил и сравнивал объекты кнопок, что тоже не помогло и в итоге извлек кортеж в виде ("текст_кнопки", "callback_data"). Вместо того, чтобы сравнивать объекты кнопок, что я делал неумышленно, сравнил их по содержимому, что изначально и планировал.

## в модуле keyboard.py объявил списковое включение, которое проходит по всем строкам разметки, 
## при этом в каждой строке проходит по кнопке и собирает параметры text= и callback_data=

def extract_button_data(reply_markup):
    return [
        [(button.text, button.callback_data) for button in row]
        for row in reply_markup.inline_keyboard
    ] 
## Теперь метод-заголовок обновляющий список кнопок выглядит так:

@router.message(PostgresDBconnect.currentTable)
@router.callback_query(TableCallbackFilter(get_tables()))
async def set_currentTable(callback: CallbackQuery, state: FSMContext):
    current_reply_markup = kb.extract_button_data(callback.message.reply_markup)
    
    if callback.data == "update_menu":
        await state.update_data(currentTable = None)
        new_reply_markup = kb.extract_button_data(await kb.tablesAsKeyboard())
        if new_reply_markup != current_reply_markup:
            await callback.message.edit_reply_markup(reply_markup=new_reply_markup)
            await callback.answer("Список сущностей обновлён!")
        else:
            await callback.answer("Список сущностей не обновлён, так он еще актуален!")
    else:
        await state.update_data(currentTable = callback.data)
        await callback.answer(f"Таблица {callback.data} выбрана!")
        await state.clear()
→ Ссылка