summaryrefslogtreecommitdiff
path: root/bot.py
blob: e68315249687e91ba61e38951d304cab74fdae30 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
from telegram.ext import Updater, CommandHandler, ConversationHandler, MessageHandler, Filters, CallbackQueryHandler
from telegram import ReplyKeyboardMarkup, ReplyKeyboardRemove, InlineKeyboardMarkup, InlineKeyboardButton

# Typing
from telegram import Update, User, Bot

import logging
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__)
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:
        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("Ты успешно зарегистрирован в системе!")
        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:
        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("Ты успешно зарегистрирован в системе!")
        return States.main_menu(bot, update, user_data)


def stop(bot, update):
    update.message.reply_text('Пока!', reply_markup=ReplyKeyboardRemove())
    update.message.reply_text('Для того, чтобы начать работу с ботом заново напишите /start')
    return ConversationHandler.END


def error(bot, update, error):
    logger.warning('Update "%s" caused error "%s"', update, error)


def main():
    updater = Updater(TG_TOKEN, request_kwargs=REQUEST_KWARGS)

    dp = updater.dispatcher
    dp.add_error_handler(error)
    dp.add_handler(conversation_handler)

    updater.start_polling()
    updater.idle()


conversation_handler = ConversationHandler(
    entry_points=[
        CommandHandler('start', start, pass_user_data=True),
    ],

    states={
        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)]
)

if __name__ == '__main__':
    main()