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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
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
import json
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.INFO, 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: dict):
user_data.update({"chosen_task": None})
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 resume_bot(bot: Bot, update: Update, user_data):
status_code, state = backend_api.get_state(update.message.from_user.id)
user_data.update(json.loads(state["user_data"]))
last_state = state["last_state"]
for handler in conversation_handler.states[last_state]:
if handler.filters.filter(update):
return handler.callback(bot, update, user_data)
return last_state
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),
MessageHandler(Filters.text, resume_bot, 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()
|