Files
rc-tgbot/app/plugin/register.py
T
2026-03-01 00:49:27 +03:00

287 lines
8.8 KiB
Python
Executable File

from telebot import types
from plugin.user import User
from config import Messages
from plugin.test import TestMessages
from plugin.bot_instance import bot
import os
import re
import random
def start_reg_name(message: types.Message):
user = User(message.chat.id)
user.name = message.text
bot.send_message(message.chat.id, Messages.ENTER_AGE)
bot.register_next_step_handler(message, start_reg_age)
return
def start_reg_age(message: types.Message):
user = User(message.chat.id)
if not message.text.isdigit():
bot.send_message(message.chat.id, "Введите число")
bot.register_next_step_handler(message, start_reg_age)
return
user.age = int(message.text)
markup = types.InlineKeyboardMarkup()
markup.add(
types.InlineKeyboardButton(Messages.GENDER_WOMAN, callback_data="gender_woman"),
types.InlineKeyboardButton(Messages.GENDER_MAN, callback_data="gender_man"),
)
bot.send_message(message.chat.id, Messages.ENTER_GENDER, reply_markup=markup)
return
@bot.callback_query_handler(func=lambda call: "gender" in call.data)
def start_reg_gender(call: types.CallbackQuery):
user = User(call.message.chat.id)
user.gender = call.data.split("_")[-1]
bot.edit_message_text(
Messages.GENDER_WOMAN if user.gender == "woman" else Messages.GENDER_MAN,
call.message.chat.id,
call.message.message_id,
reply_markup=None,
)
bot.send_message(call.message.chat.id, Messages.ENTER_FACULTY)
bot.register_next_step_handler(call.message, start_reg_faculty)
def start_reg_faculty(message: types.Message):
user = User(message.chat.id)
user.faculty = message.text
bot.send_message(message.chat.id, Messages.ENTER_GROUP)
bot.register_next_step_handler(message, start_reg_group)
def start_reg_group(message: types.Message):
user = User(message.chat.id)
user.group = message.text
markup = types.InlineKeyboardMarkup()
markup.add(
types.InlineKeyboardButton("Согласен", callback_data="upload_agree"),
types.InlineKeyboardButton("Не согласен", callback_data="upload_skip"),
)
bot.send_message(message.chat.id, Messages.ENTER_AGREE_UPLOAD, reply_markup=markup)
return
@bot.callback_query_handler(func=lambda call: "upload" in call.data)
def start_agree_upload(call: types.CallbackQuery):
user = User(call.message.chat.id)
user.agree_upload = call.data.split("_")[-1] == "agree"
bot.edit_message_text(
(
"Согласен на сохранение данных в общую базу"
if user.agree_upload
else "Не согласен на сохранение данных в общую базу"
),
call.message.chat.id,
call.message.message_id,
reply_markup=None,
)
markup = types.InlineKeyboardMarkup()
markup.add(
types.InlineKeyboardButton("Всё верно!", callback_data="registration_confirm"),
types.InlineKeyboardButton("Изменить", callback_data="registration_change"),
)
bot.send_message(
call.message.chat.id,
Messages.REGISTRATION_CONFIRM.format(
user.name,
user.age,
"Парень" if user.gender == "man" else "Девушка",
user.faculty,
user.group,
"Да" if user.agree_upload else "Нет",
),
reply_markup=markup,
)
@bot.callback_query_handler(func=lambda call: call.data == "registration_change")
def start_reg_again(call: types.CallbackQuery):
bot.edit_message_reply_markup(
call.message.chat.id, call.message.message_id, reply_markup=None
)
bot.send_message(call.message.chat.id, Messages.ENTER_NAME)
bot.register_next_step_handler(call.message, start_reg_name)
# --------------------------------- Test ---------------------------------
@bot.callback_query_handler(func=lambda call: call.data == "registration_confirm")
def start_test(call: types.CallbackQuery):
user = User(call.message.chat.id)
bot.edit_message_reply_markup(
call.message.chat.id, call.message.message_id, reply_markup=None
)
markup = types.InlineKeyboardMarkup()
markup.add(
types.InlineKeyboardButton("Начнём!", callback_data="test_yes"),
)
bot.send_message(
call.message.chat.id, TestMessages.TEST_WELCOME, reply_markup=markup
)
user.type = ""
return
@bot.callback_query_handler(func=lambda call: "test" in call.data)
def test_question(call: types.CallbackQuery):
user = User(call.message.chat.id)
bot.edit_message_reply_markup(
call.message.chat.id, call.message.message_id, reply_markup=None
)
if call.data == "test_yes":
last_q = -1
else:
last_q = int(call.data.split("_")[1].split("#")[0])
previous_ans = int(call.data.split("#")[1])
for ans_type in TestMessages.TEST_QUESTIONS[last_q]["answers"][previous_ans][
"types"
]:
add_score = 3 if last_q == 0 else 2
user.vector_type[ans_type] = user.vector_type.get(ans_type, 0) + add_score
prev_answ = "\n\n".join(
[
f"{'✅ ' if i == previous_ans else ''}{i+1}. {ans['text']}"
for i, ans in enumerate(TestMessages.TEST_QUESTIONS[last_q]["answers"])
]
)
prev_text = f"{TestMessages.TEST_QUESTIONS[last_q]['question']}\n\n{prev_answ}"
bot.edit_message_text(
prev_text,
call.message.chat.id,
call.message.message_id,
parse_mode="HTML",
)
if last_q == len(TestMessages.TEST_QUESTIONS) - 1:
max_value = max(user.vector_type.values())
max_types = [t for t, v in user.vector_type.items() if v == max_value]
user.type = random.choice(max_types)
show_result(call.message)
return
question = TestMessages.TEST_QUESTIONS[last_q + 1]
answ = "\n\n".join(
[f"{i+1}. {ans['text']}" for i, ans in enumerate(question["answers"])]
)
text = f"{question['question']}\n\n{answ}"
markup = types.InlineKeyboardMarkup()
for i in range(len(question["answers"])):
markup.add(
types.InlineKeyboardButton(
f"{question['answers'][i]['short']}",
callback_data=f"test_{last_q + 1}#{i}",
)
)
bot.send_message(call.message.chat.id, text, reply_markup=markup, parse_mode="HTML")
return
# @bot.callback_query_handler(func=lambda call: "test" in call.data)
# def test_question(call: types.CallbackQuery):
# user = User(call.message.chat.id)
# bot.edit_message_reply_markup(
# call.message.chat.id, call.message.message_id, reply_markup=None
# )
# if call.data != "test_yes":
# user.type += TestMessages.TEST_QUESTIONS[len(user.type)]["answers"][
# int(call.data[-1])
# ][1]
# user_ans = int(call.data[-1])
# question_last = TestMessages.TEST_QUESTIONS[len(user.type) - 1]
# text_edit = f"{question_last['question']}\n\n{'✅ ' if user_ans == 0 else ''}1. {question_last['answers'][0][0]} \n\n{'✅ ' if user_ans == 1 else ''}2. {question_last['answers'][1][0]}"
# bot.edit_message_text(
# text_edit,
# call.message.chat.id,
# call.message.message_id,
# parse_mode="HTML",
# ) # упростить
# if len(user.type) == 4:
# show_result(call.message)
# return
# question = TestMessages.TEST_QUESTIONS[len(user.type)]
# text = f"{question['question']}\n\n1. {question['answers'][0][0]} \n\n2. {question['answers'][1][0]}"
# markup = types.InlineKeyboardMarkup()
# markup.add(
# types.InlineKeyboardButton("Первый вариант", callback_data=f"test_0"),
# types.InlineKeyboardButton("Второй вариант", callback_data=f"test_1"),
# )
# bot.send_message(call.message.chat.id, text, reply_markup=markup)
# return
def show_result(message: types.Message):
user = User(message.chat.id)
text = TestMessages.TEST_RESULT.format(
TestMessages.TEST_RESULTS[user.type][0],
TestMessages.TEST_RESULTS[user.type][1],
)
directory = "pics/"
pattern = re.compile(f"{user.type}.*\.(jpg|jpeg|png|gif)$", re.IGNORECASE)
image_path = None
for filename in os.listdir(directory):
if pattern.match(filename):
image_path = os.path.join(directory, filename)
break
if image_path:
bot.send_photo(
message.chat.id,
open(image_path, "rb"),
caption=text,
show_caption_above_media=True,
)
else:
print("Image not found")
bot.send_message(message.chat.id, TestMessages.TEST_FINISH)
bot.send_message(message.chat.id, Messages.START_DATE)
return