Телеграм вміє з Вами погутарити, якщо його навчити 🙂
Не одразу зрозумів як воно працює. Зараз, трохи почав розуміти. Як зрозумів – запишу а далі зміню-доповню якщо помилявся. Демонструю на прикладі що буде у самому низу сторінки.
Точка входу у розмову 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