diff options
| author | Andrew <saintruler@gmail.com> | 2020-02-11 18:52:54 +0400 |
|---|---|---|
| committer | Andrew <saintruler@gmail.com> | 2020-02-11 18:52:54 +0400 |
| commit | a2d7e6357ea7d9ffcd361580b5d48eefeb1e69cb (patch) | |
| tree | d2a56d22b1b1add044a8c4bfd6510f0f675467fd /bot.py | |
| parent | 1ca68c0b1af0f7fb5812c831d61cd85d282f08e1 (diff) | |
Implemented basic state handling and bot views.
Diffstat (limited to 'bot.py')
| -rw-r--r-- | bot.py | 115 |
1 files changed, 33 insertions, 82 deletions
@@ -9,6 +9,12 @@ from os import environ from config import TG_TOKEN, REQUEST_KWARGS import backend_api +from keyboards import ( + MenuKeyboard, TasksKeyboard, TaskChosenKeyboard, ContinueKeyboard, + AnsweringKeyboard, +) +from utils import * +from states import States logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') logger = logging.getLogger(__name__) @@ -17,91 +23,29 @@ logger.setLevel(logging.DEBUG) def start(bot: Bot, update: Update, user_data): update.message.reply_text( - "Привет! Ты вошел в телеграм-квиз с мемами про наш любимый КНиИТ.", + "Привет! Ты вошел в телеграм-квиз с мемами про наш любимый КНиИТ!", reply_markup=ReplyKeyboardRemove() ) user: User = update.message.from_user if user.username is None: - update.message.reply_text( - "По правилам квиза ты не можешь участвовать, если у тебя не указано " - "имя пользователя, поэтому укажи его и возвращайся как только это сделаешь!", - reply_markup=ReplyKeyboardMarkup([['Я указал имя пользователя']]) - ) - return USERNAME_CHECK + return States.wait_for_username(bot, update, user_data) else: logger.debug(backend_api.register_user(user.id, user.username, user.full_name)) update.message.reply_text("Ты успешно зарегистрирован в системе!") - - update.message.reply_text("Твой счет: 0") - update.message.reply_text( - "Выбери следующее действие...", - reply_markup=ReplyKeyboardMarkup([ - ["Сдать задачу"], - ["Топ-10", "Правила"] - ]) - ) - - return MAIN_MENU + return States.main_menu(bot, update, user_data) def username_check(bot: Bot, update: Update, user_data): user: User = update.message.from_user if user.username is None: - update.message.reply_text( - "Ты все еще не указал имя пользователя!", - reply_markup=ReplyKeyboardMarkup([['Я указал имя пользователя']]) - ) - return USERNAME_CHECK + return States.wait_for_username(bot, update, user_data) else: logger.debug(backend_api.register_user(user.id, user.username, user.full_name)) update.message.reply_text("Ты успешно зарегистрирован в системе!") - - update.message.reply_text("Твой счет: 0") - update.message.reply_text( - "Выбери следующее действие...", - reply_markup=ReplyKeyboardMarkup([ - ["Сдать задачу"], - ["Топ-10", "Правила"] - ]) - ) - - return MAIN_MENU - - -def main_menu(bot, update, user_data): - text = update.message.text - - if text == "Сдать задачу": - update.message.reply_text("А пока что нельзя!!") - return MAIN_MENU - - elif text == "Топ-10": - update.message.reply_text("Топ-1:\n1.Андрей Гущин") - return MAIN_MENU - - elif text == "Правила": - update.message.reply_text("Какие-то правила!!!!") - return MAIN_MENU - - return MAIN_MENU - - -def rules(bot: Bot, update: Update, user_data): - update.message.reply_text("Какие-то правила!!!!") - return MAIN_MENU - - -def top_10(bot: Bot, update: Update, user_data): - update.message.reply_text("Топ-1:\n1.Андрей Гущин") - return MAIN_MENU - - -def task_choose(bot: Bot, update: Update, user_data): - update.message.reply_text("А пока что нельзя!!") - return MAIN_MENU + return States.main_menu(bot, update, user_data) def stop(bot, update): @@ -125,26 +69,33 @@ def main(): updater.idle() -( - USERNAME_CHECK, USERNAME_HOLD, - MAIN_MENU, TOP_10, RULES, - TASK_CHOOSE, CANCEL_CHOOSE, - TASK_SHOW, CANCEL_SHOW, - ENTER_ANSWER, CANCEL_ANSWER, - *_ -) = range(100) - conversation_handler = ConversationHandler( entry_points=[ - CommandHandler('start', start, pass_user_data=True) + CommandHandler('start', start, pass_user_data=True), ], states={ - USERNAME_CHECK: [MessageHandler(Filters.text, username_check, pass_user_data=True)], - MAIN_MENU: [MessageHandler(Filters.text, main_menu, pass_user_data=True)], - RULES: [MessageHandler(Filters.text, rules, pass_user_data=True)], - TOP_10: [MessageHandler(Filters.text, top_10, pass_user_data=True)], - TASK_CHOOSE: [MessageHandler(Filters.text, task_choose, pass_user_data=True)], + WAIT_FOR_USERNAME: [MessageHandler(Filters.text, username_check, pass_user_data=True)], + + MAIN_MENU: [ + MessageHandler(Filters.regex(MenuKeyboard.CHOOSE_TASK), States.choose_task, pass_user_data=True), + MessageHandler(Filters.regex(MenuKeyboard.TOP_10), States.top_10, pass_user_data=True), + MessageHandler(Filters.regex(MenuKeyboard.RULES), States.rules, pass_user_data=True), + ], + TASK_CHOOSING: [ + MessageHandler(Filters.regex(TasksKeyboard.CANCEL), States.main_menu, pass_user_data=True), + MessageHandler(Filters.text, States.show_task, pass_user_data=True), + ], + TASK_SHOWN: [ + MessageHandler(Filters.regex(TaskChosenKeyboard.CANCEL), States.choose_task, pass_user_data=True), + MessageHandler(Filters.regex(TaskChosenKeyboard.TYPE_ANSWER), States.type_answer, pass_user_data=True), + ], + ANSWERING: [ + MessageHandler(Filters.regex(AnsweringKeyboard.CANCEL), States.show_task, pass_user_data=True), + MessageHandler(Filters.text, States.accept_answer, pass_user_data=True), + ], + ANSWER_RIGHT: [MessageHandler(Filters.text, States.main_menu, pass_user_data=True)], + ANSWER_WRONG: [MessageHandler(Filters.text, States.show_task, pass_user_data=True)] }, fallbacks=[CommandHandler('stop', stop)] |