python. Telegram bot conversation

Телеграм вміє з Вами погутарити, якщо його навчити 🙂

Не одразу зрозумів як воно працює. Зараз, трохи почав розуміти. Як зрозумів – запишу а далі зміню-доповню якщо помилявся. Демонструю на прикладі що буде у самому низу сторінки.
Точка входу у розмову start_handler повертає статус розмови до якого треба перейти далі (return NAME) розмову припиняємо коли викликаємо функцію що повертає такий статус (return ConversationHandler.END)

from telegram.ext import ConversationHandler

NAME, PEOPLE_TYPE, WORKPLACE = range(3)

from ask.validators import WORKER_TYPES_MAP

@debug_requests
def start_handler(update: Update, context: CallbackContext):
.......багато..неважливого...тексту........
return NAME

@debug_requests
def name_handler(update: Update, context: CallbackContext):
   # отримати ім"я
   context.user_data[NAME] = update.message.text
   logger.info('user_data: %s', context.user_data)

   # спитати наступне питання
   inline_buttons = InlineKeyboardMarkup(
       inline_keyboard=[
        [InlineKeyboardButton(text=value, callback_data=key) for key, value in \
WORKER_TYPES_MAP.items()],

         ],
       )
   update.message.reply_text(
      text='введіть посаду співробітника',
      reply_markup=inline_buttons,
      )
return PEOPLE_TYPE

@debug_tg
def cancel_handler(update: Update, context: CallbackContext):
   """ Cancel dialog. Cancel data
   """
   update.message.reply_text('Cancel. For start over run command /start')
   return ConversationHandler.END

def main():
     logger.info('Started ask-bot')

    req = Request(
        connect_timeout=0.3,
        read_timeout=1.0,
        )
    bot = Bot(
        token=config.TG_TOKEN,
        request=req,
        base_url=config.TG_API_URL,
        )
    updater = Updater(
        bot=bot,
        use_context=True,
        )

    # перевірка підключення до Telegram API
    info = bot.get_me()
    logger.info(f'Bot info: {info}')
    # обробляємо команди розмови
    conv_handler = ConversationHandler(
        entry_points=[
            CallbackQueryHandler(start_handler, pass_user_data=True),
            ],
            states={
                NAME: [
                    MessageHandler(Filters.all, name_handler, pass_user_data=True),
                    ],
                PEOPLE_TYPE: [
                    CallbackQueryHandler(type_handler, pass_user_data=True),
                    ],
                WORKPLACE: [
                    MessageHandler(Filters.all, finish_handler, pass_user_data=True),
                    ],
                    },
                fallbacks=[
                    CommandHandler('cancel', cancel_handler),
                    ],
}
        )
updater.dispatcher.add_handler(conv_handler)
updater.dispatcher.add_handler(CommandHandler('start',start_buttons_handler))

updater.dispatcher.add_handler(MessageHandler(Filters.all, echo_handler))
# Запускаю бота в роботу
updater.start_polling()
updater.idle()
logger.info('Stopped ask-bot')

 

література

1 https://bitbucket.org/vkasatkin/tele_bot/src/master/anketa

Залишити відповідь