Как реализовать функциональный скрипт в ооп?

Это часть телеграм-бота. Я пытался импортировать эти функции как отдельные модули. Но в модуле ConversationHandler библиотеки python-telegram-bot этого сделать нельзя. Этот скрипт использует клавиатуру с возможностью выбора нескольких кнопок (параметров) и кнопку отправки.

from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import (
    Updater,
    CommandHandler,
    CallbackQueryHandler,
    ConversationHandler)

import logging

green_check = '\u2705'
grey_check = '\u2714'

FIRST, ANSWER = range(2)
TEXT_1 = 'Click'
CHECK = grey_check
CLICK = False
BUTTONS = []
KEYS = {'1': (0, 0), '2': (0, 1), '3': (1, 0), '4': (1, 1)}

keyboard = [
[
    InlineKeyboardButton(f'1 {CHECK}', callback_data='1'),
    InlineKeyboardButton(f'2 {CHECK}', callback_data='2'),
],
[
    InlineKeyboardButton(f'3 {CHECK}', callback_data='3'),
    InlineKeyboardButton(f'4 {CHECK}', callback_data='4'),
],
[
    InlineKeyboardButton('Next \u27A1', callback_data='next'),
],
]


def start(update, context):
    global CHECK
    global keyboard
    global BUTTONS
    CHECK = grey_check
    for data in BUTTONS:
        keyboard[KEYS[data][0]][KEYS[data][1]] = InlineKeyboardButton(
            f'{data} {CHECK}', callback_data=f'{data}')
    reply_markup = InlineKeyboardMarkup(keyboard)
    update.message.reply_text(TEXT_1, reply_markup=reply_markup)
    for i in range(1,5):
        context.user_data[f'BUTTON_{i}'] = False
    BUTTONS = []
    return FIRST


def clicked(click=None, data=None):
    global keyboard
    global CHECK
    global BUTTONS
    if click == True:
        CHECK = green_check
    else:
        CHECK = grey_check

    BUTTONS.append(data)
    keyboard[KEYS[data][0]][KEYS[data][1]] = InlineKeyboardButton(
        f'{data} {CHECK}', callback_data=f'{data}')

    reply_markup = InlineKeyboardMarkup(keyboard)

    return reply_markup


def press(update, context):
    data = update.callback_query.data
    global CLICK
    if context.user_data[f'BUTTON_{data}'] == False:
        context.user_data[f'BUTTON_{data}'] = True
    else:
        context.user_data[f'BUTTON_{data}'] = False

    reply_keyboard = clicked(context.user_data[f'BUTTON_{data}'], data)
    update.callback_query.edit_message_text(text=TEXT_1, reply_markup=reply_keyboard)
    return FIRST


def send(update, context):
    text = ''
    for i in range(1, 5):
        text += f'{i} - ' + str(context.user_data[f'BUTTON_{i}']) + '\n'
    context.user_data[ANSWER] = text
    update.callback_query.edit_message_text(text=context.user_data[ANSWER])

    return ConversationHandler.END


def main():
    updater = Updater(
        'TOKEN', use_context=True)
    dp = updater.dispatcher
    conv_handler = ConversationHandler(
        entry_points=[CommandHandler('start', start)],
        states={
            FIRST: [
                    CallbackQueryHandler(press, pattern='^'+str(1)+'$'),
                    CallbackQueryHandler(press, pattern='^'+str(2)+'$'),
                    CallbackQueryHandler(press, pattern='^'+str(3)+'$'),
                    CallbackQueryHandler(press, pattern='^'+str(4)+'$'),
                    CallbackQueryHandler(send, pattern='^'+'next'+'$'),
                    ],
        },
        fallbacks=[CommandHandler('start', start)]
    )

    dp.add_handler(conv_handler)
    updater.start_polling()
    updater.idle()

if __name__ == "__main__":
    main()

Клавиатура выглядит так:

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

Как эти функции можно представить в ООП и совместить с библиотекой python-telegram-bot? Или импортировать как функцию, но в сочетании с модулем ConversationHandler как вложенный ConversationHandler?


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