@Fiiry

Как искать подстроку в callback данных?

Пишу простого телеграм бота на aiogram для обычных и циклических напоминаний.
Создаю инлайн клавиатуру с именем каждой записи (циклической или обычной). Сам callback каждой кнопкой отличается друг от друга буквой вначале("c" - если циклическое напоминание и "s" если обычное) и номером напоминания.
def create_inline_kb(data: list, is_simple_task=False, is_cycle_task=False):
    kb = aiogram.types.InlineKeyboardMarkup(row_width=3)
    count = 0
    for msg in data:
        count += 1
        if is_simple_task:
            kb.add(aiogram.types.InlineKeyboardButton(text=msg[0], callback_data=f"s{str(count)}"))
        elif is_cycle_task:
            kb.add(aiogram.types.InlineKeyboardButton(text=msg[0], callback_data=f"c{str(count)}"))
    return kb


Далее привязываю слушатель, но не понимаю как взять только номер записи и определить тип записи в зависимости от буквы в начале.
async def unnamed(callback: types.CallbackQuery):

def register_inline_handler(dp: Dispatcher):
    dp.register_inline_handler(callback=?)


Может быть правильнее реализовать это по другому?
  • Вопрос задан
  • 373 просмотра
Решения вопроса 1
Buchachalo
@Buchachalo
Тут вариантов масса. И еще зависит от версии aigramm которой пользуешься.

Для 3 версии есть переработанная CDF
https://docs.aiogram.dev/ru/latest/dispatcher/filt...

Для 2+ версии aigramm, можно по старым схемам:
task_cb = CallbackData("task_menu", "task_type", "task_num")

# array = [{name: 'task_name_1', type: 'c', num: 123456}]

def task_keyboard(array):
    markup = InlineKeyboardMarkup(row_width=2)
    for task in array:
        markup.insert(InlineKeyboardButton(text=task.get('name'),
                                           callback_data=task_cb.new(task_type=task.get("type"),
                                                                       task_num= task.get("num"))))
    return markup

# Ловим колбэк
@dp.callback_query_handler(task_cb.filter())
async def show_task(callback: types.CallbackQuery, callback_data: dict):
    type = callback_data.get("task_type")
    num = callback_data.get("task_num")


Ну либо лови колбэк как ты и описал и парси как обычный str.
type = callback[:1]
num= callback[1:]
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы