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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
from telegram import ReplyKeyboardMarkup, ReplyKeyboardRemove
from keyboards import (
MenuKeyboard, TasksKeyboard, TaskChosenKeyboard, ContinueKeyboard,
AnsweringKeyboard,
)
from utils import *
import backend_api
# Typing
from telegram import Update, User, Bot
def save_state(func):
def wrapper(bot: Bot, update: Update, user_data: dict, *args, **kwargs):
last_state = func(bot, update, user_data, *args, **kwargs)
backend_api.save_state(last_state, update.message.from_user.id, user_data)
return last_state
return wrapper
class States:
@staticmethod
@save_state
def wait_for_username(bot: Bot, update: Update, user_data: dict):
update.message.reply_text(
"По правилам квиза ты не можешь участвовать, если у тебя не указано "
"имя пользователя, поэтому укажи его и возвращайся как только это сделаешь!",
reply_markup=ReplyKeyboardMarkup([['Я указал имя пользователя']])
)
return WAIT_FOR_USERNAME
@staticmethod
@save_state
def main_menu(bot: Bot, update: Update, user_data: dict):
user_data["chosen_task"] = None
update.message.reply_text("Твой счет: 0")
update.message.reply_text(
"Выбери следующее действие...",
reply_markup=ReplyKeyboardMarkup(MenuKeyboard.get_keyboard())
)
return MAIN_MENU
@staticmethod
@save_state
def choose_task(bot: Bot, update: Update, user_data: dict):
user_data["chosen_task"] = None
update.message.reply_text(
"Какую задачу ты хочешь сдать?",
reply_markup=ReplyKeyboardMarkup(TasksKeyboard.get_keyboard())
)
return TASK_CHOOSING
@staticmethod
@save_state
def top_10(bot: Bot, update: Update, user_data: dict):
update.message.reply_text("какая то хуйня")
return MAIN_MENU
@staticmethod
@save_state
def rules(bot: Bot, update: Update, user_data: dict):
update.message.reply_text("какая то хуйня")
return MAIN_MENU
@staticmethod
@save_state
def show_task(bot: Bot, update: Update, user_data: dict):
if "chosen_task" in user_data and user_data["chosen_task"] is not None:
task_title = user_data["chosen_task"]
else:
task_title = update.message.text
user_data["chosen_task"] = task_title
status_code, task = backend_api.get_task(task_title)
if status_code != 200:
message = "Произошла ошибка в работе квиза. Мы уже работаем над её устранением!"
keyboard = ContinueKeyboard.get_keyboard()
else:
message = '\n'.join([
f"*{task['title']}*",
f"{task['statement']}",
"",
f"_Теги: {task['tags']}_",
])
keyboard = TaskChosenKeyboard.get_keyboard()
update.message.reply_text(
message, parse_mode="Markdown",
reply_markup=ReplyKeyboardMarkup(keyboard)
)
return TASK_SHOWN
@staticmethod
@save_state
def type_answer(bot: Bot, update: Update, user_data: dict):
status_code, response = backend_api.get_attempts(
tg_id=update.message.from_user.id,
task_title=user_data["chosen_task"]
)
if len(response) != 0:
update.message.reply_text(
"Ты уже решил эту задачу! Выбери другую.",
reply_markup=ReplyKeyboardMarkup(ContinueKeyboard.get_keyboard())
)
return TASK_CHOOSING
else:
update.message.reply_text(
"Вводи свой ответ, я его проверю.",
reply_markup=ReplyKeyboardMarkup(AnsweringKeyboard.get_keyboard())
)
return ANSWERING
@staticmethod
@save_state
def accept_answer(bot: Bot, update: Update, user_data: dict):
answer = update.message.text
status_code, task = backend_api.get_task(user_data["chosen_task"])
if status_code == 200:
backend_api.create_attempt(update.message.from_user.id, user_data["chosen_task"], answer)
if answer == task["answer"]:
update.message.reply_text(
"Ты ввел правильный ответ! Возвращайся к другим задачам",
reply_markup=ReplyKeyboardMarkup(ContinueKeyboard.get_keyboard())
)
return ANSWER_RIGHT
else:
update.message.reply_text(
"К сожалению, твой ответ неверный =(",
reply_markup=ReplyKeyboardMarkup(ContinueKeyboard.get_keyboard())
)
return ANSWER_WRONG
else:
update.message.reply_text(
"Произошла ошибка в работе квиза. Мы уже работаем над её устранением!",
reply_markup=ReplyKeyboardMarkup(ContinueKeyboard.get_keyboard())
)
return ANSWER_RIGHT
|