diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..28d5146
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,10 @@
+DATE_START=2024-07-01
+TIME_START=12:00
+API_TOKEN="your_api_token_here"
+ADMIN_ID=your_admin_id_here
+DB_PORT=27017
+ENV=PROD
+SSH_HOST=your_ssh_host_here
+SSH_USER=your_ssh_user_here
+SSH_KEY=path_to_your_ssh_key_here
+SSH_PASSWORD=your_ssh_password_here
diff --git a/.gitignore b/.gitignore
index 0710587..9568693 100755
--- a/.gitignore
+++ b/.gitignore
@@ -1,20 +1,207 @@
-# Ignore everything
-*
-
-# Except these files
-!.gitignore
-!docker-compose.yaml
-!requirements.txt
-!readme.md
-
-# Except these directories and their contents
-!/app
-!/app/*
-!/app/plugin
-!/app/plugin/*
-
-# Ignore specific files and directories
-app/bot.py
+# Byte-compiled / optimized / DLL files
__pycache__/
+*.py[codz]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py.cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+# For a library or package, you might want to ignore these files since the code is
+# intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+# However, in case of collaboration, if having platform-specific dependencies or dependencies
+# having no cross-platform support, pipenv may install dependencies that don't work, or not
+# install all needed dependencies.
+#Pipfile.lock
+
+# UV
+# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
+# This is especially recommended for binary packages to ensure reproducibility, and is more
+# commonly ignored for libraries.
+#uv.lock
+
+# poetry
+# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
+# This is especially recommended for binary packages to ensure reproducibility, and is more
+# commonly ignored for libraries.
+# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
+#poetry.lock
+#poetry.toml
+
+# pdm
+# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
+# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
+# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
+#pdm.lock
+#pdm.toml
+.pdm-python
+.pdm-build/
+
+# pixi
+# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
+#pixi.lock
+# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
+# in the .venv directory. It is recommended not to include this directory in version control.
+.pixi
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
.env
-.venv
\ No newline at end of file
+.envrc
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+
+# PyCharm
+# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
+# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
+# and can be added to the global gitignore or merged into this file. For a more nuclear
+# option (not recommended) you can uncomment the following to ignore the entire idea folder.
+#.idea/
+
+# Abstra
+# Abstra is an AI-powered process automation framework.
+# Ignore directories containing user credentials, local state, and settings.
+# Learn more at https://abstra.io/docs
+.abstra/
+
+# Visual Studio Code
+# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
+# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
+# and can be added to the global gitignore or merged into this file. However, if you prefer,
+# you could uncomment the following to ignore the entire vscode folder
+# .vscode/
+
+# Ruff stuff:
+.ruff_cache/
+
+# PyPI configuration file
+.pypirc
+
+# Cursor
+# Cursor is an AI-powered code editor. `.cursorignore` specifies files/directories to
+# exclude from AI features like autocomplete and code analysis. Recommended for sensitive data
+# refer to https://docs.cursor.com/context/ignore-files
+.cursorignore
+.cursorindexingignore
+
+# Marimo
+marimo/_static/
+marimo/_lsp/
+__marimo__/
\ No newline at end of file
diff --git a/app/config.py b/app/config.py
index 671576a..0aa6e22 100755
--- a/app/config.py
+++ b/app/config.py
@@ -42,7 +42,6 @@ class Messages:
"\n/start - начать регистрацию"
"\n/help - помощь"
"\n/source - исходный код бота на Github"
- "\n@more_logical - для всех вопросов по мероприятию"
"\n\nCreated by АйТи блок ВМК with love ❤️"
)
]
@@ -50,22 +49,28 @@ class Messages:
ERROR = "Произошла ошибка"
ENTER_NAME = "Как тебя зовут?"
ENTER_AGE = "Сколько тебе лет?"
- ENTER_GENDER = "Выбери пол (женский, мужской)"
+ ENTER_GENDER = "Выбери пол"
GENDER_WOMAN = "Я девушка" # кнопки выбора
GENDER_MAN = "Я парень" # кнопки выбора
ENTER_FACULTY = "С какого ты факультета?"
ENTER_GROUP = "Напиши номер своей группы"
+ ENTER_AGREE_UPLOAD = (
+ "Согласен ли ты на сохранение своих данных в общую базу для подбора пар?"
+ )
REGISTRATION_CONFIRM = "Твои данные:\
\n\nИмя: {}\
\nВозраст: {}\
\nПол: {}\
\nФакультет: {}\
\nГруппа: {}\
+ \nСогласие на сохранение данных: {}\
\n\nВсё верно?"
ALREADY_REGISTERED = "Ты уже зарегистрирован. Хочешь изменить данные?"
MATCHING_START = (
"Мы начали подбор пар 🤩" "\nПодтверди своё нахождение в аудитории."
)
START_DATE = (
- "Мероприятие начнётся:" "\n🗓️ 4 апреля" "\n\nСледите за новостями!"
+ "Мероприятие начнётся:"
+ "\n🗓️ 3 апреля в 18:00"
+ "\n\nСледите за новостями!"
)
diff --git a/app/main.py b/app/main.py
index d422eeb..782eab9 100755
--- a/app/main.py
+++ b/app/main.py
@@ -41,6 +41,7 @@ def start_message(message: types.Message):
"Парень" if user.gender == "man" else "Девушка",
user.faculty,
user.group,
+ "Да" if user.agree_upload else "Нет",
),
reply_markup=markup,
)
diff --git a/app/pics/ENFJ.JPG b/app/pics/ENFJ.JPG
new file mode 100644
index 0000000..67c4f9a
Binary files /dev/null and b/app/pics/ENFJ.JPG differ
diff --git a/app/pics/ENFP.JPG b/app/pics/ENFP.JPG
new file mode 100644
index 0000000..b1adcbf
Binary files /dev/null and b/app/pics/ENFP.JPG differ
diff --git a/app/pics/ENTJ.JPG b/app/pics/ENTJ.JPG
new file mode 100644
index 0000000..3a1ff13
Binary files /dev/null and b/app/pics/ENTJ.JPG differ
diff --git a/app/pics/ENTP.JPG b/app/pics/ENTP.JPG
new file mode 100644
index 0000000..f7d00dd
Binary files /dev/null and b/app/pics/ENTP.JPG differ
diff --git a/app/pics/ESFJ.JPG b/app/pics/ESFJ.JPG
new file mode 100644
index 0000000..dd2111f
Binary files /dev/null and b/app/pics/ESFJ.JPG differ
diff --git a/app/pics/ESFP.jpg b/app/pics/ESFP.jpg
new file mode 100644
index 0000000..eebcac5
Binary files /dev/null and b/app/pics/ESFP.jpg differ
diff --git a/app/pics/ESTJ.JPG b/app/pics/ESTJ.JPG
new file mode 100644
index 0000000..fb9ebff
Binary files /dev/null and b/app/pics/ESTJ.JPG differ
diff --git a/app/pics/ESTP.JPG b/app/pics/ESTP.JPG
new file mode 100644
index 0000000..742115b
Binary files /dev/null and b/app/pics/ESTP.JPG differ
diff --git a/app/pics/INFJ.JPG b/app/pics/INFJ.JPG
new file mode 100644
index 0000000..84cd465
Binary files /dev/null and b/app/pics/INFJ.JPG differ
diff --git a/app/pics/INFP.JPG b/app/pics/INFP.JPG
new file mode 100644
index 0000000..4e9a9df
Binary files /dev/null and b/app/pics/INFP.JPG differ
diff --git a/app/pics/INTJ.JPG b/app/pics/INTJ.JPG
new file mode 100644
index 0000000..16712ed
Binary files /dev/null and b/app/pics/INTJ.JPG differ
diff --git a/app/pics/INTP.JPG b/app/pics/INTP.JPG
new file mode 100644
index 0000000..a360222
Binary files /dev/null and b/app/pics/INTP.JPG differ
diff --git a/app/pics/ISFJ.JPG b/app/pics/ISFJ.JPG
new file mode 100644
index 0000000..8ad285c
Binary files /dev/null and b/app/pics/ISFJ.JPG differ
diff --git a/app/pics/ISFP.JPG b/app/pics/ISFP.JPG
new file mode 100644
index 0000000..0d981ea
Binary files /dev/null and b/app/pics/ISFP.JPG differ
diff --git a/app/pics/ISTJ.JPG b/app/pics/ISTJ.JPG
new file mode 100644
index 0000000..bacdfbe
Binary files /dev/null and b/app/pics/ISTJ.JPG differ
diff --git a/app/pics/ISTP.JPG b/app/pics/ISTP.JPG
new file mode 100644
index 0000000..02c17a7
Binary files /dev/null and b/app/pics/ISTP.JPG differ
diff --git a/app/plugin/register.py b/app/plugin/register.py
index 14c7866..b378fcd 100755
--- a/app/plugin/register.py
+++ b/app/plugin/register.py
@@ -6,6 +6,7 @@ from plugin.test import TestMessages
from plugin.bot_instance import bot
import os
import re
+import random
def start_reg_name(message: types.Message):
@@ -71,33 +72,51 @@ 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(
- message.chat.id,
+ 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_skip")
-def start_skip_reg(call: types.CallbackQuery):
- bot.edit_message_reply_markup(
- call.message.chat.id, call.message.message_id, reply_markup=None
- )
-
- return
-
-
@bot.callback_query_handler(func=lambda call: call.data == "registration_change")
def start_reg_again(call: types.CallbackQuery):
bot.edit_message_reply_markup(
@@ -139,39 +158,102 @@ def test_question(call: types.CallbackQuery):
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]
+ 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
- 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]}"
+ 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(
- text_edit,
+ 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)
- 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"),
+ 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}"
- bot.send_message(call.message.chat.id, text, reply_markup=markup)
+ 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(
diff --git a/app/plugin/test.py b/app/plugin/test.py
index 93ff9f3..f33bd49 100755
--- a/app/plugin/test.py
+++ b/app/plugin/test.py
@@ -1,127 +1,202 @@
class TestMessages:
- TEST_WELCOME = (
- "Пройди следующий короткий тест, чтобы было легче подобрать тебе пару."
- "\n\nЗаодно узнаешь, кто ты из героев советских мультфильмов 👀"
- )
+ TEST_WELCOME = "Пройди следующий короткий тест, чтобы было легче подобрать тебе пару. А еще ты узнаешь, кто ты из героев славянских мифов."
TEST_RESULT = "👉 Ты - {}!👈\n\n{}"
TEST_FINISH = "🎉 Поздравляем! 🎉" "\nТеперь вы зарегистрированы в системе."
TEST_QUESTIONS = [
{
- "question": "Когда вы оказываетесь в новой компании людей, вы, как правило:",
+ "question": "На кого из героев славянских мифов вы хотели бы быть похожи?",
"answers": [
- (
- "Легко заводите разговоры с разными людьми.",
- "E",
- ),
- (
- "Предпочитаете сначала понаблюдать и только потом начать общаться с теми, кто вам интересен.",
- "I",
- ),
+ {
+ "text": "На Перуна — защищать порядок, брать ответственность и вести других за собой ✊🏻.",
+ "types": ["ENTJ"],
+ "short": "Перун!",
+ },
+ {
+ "text": "На Велеса — искать скрытые знания и понимать тайны мира 🔮.",
+ "types": ["INTP"],
+ "short": "Велес!",
+ },
+ {
+ "text": "На Морену — видеть глубинные смыслы и управлять переменами 🪬.",
+ "types": ["INFJ"],
+ "short": "Морена!",
+ },
+ {
+ "text": "На Стрибога — быть свободным, приносить новые идеи и перемены 😌.",
+ "types": ["ENTP"],
+ "short": "Стрибог!",
+ },
+ {
+ "text": "На Ладу — создавать гармонию и помогать людям находить общий язык ☺️.",
+ "types": ["ESFJ"],
+ "short": "Лада!",
+ },
+ {
+ "text": "На Макошь — заботиться о судьбах других и поддерживать близких 🫂.",
+ "types": ["ISFJ"],
+ "short": "Макошь!",
+ },
+ {
+ "text": "На Ярило — жить ярко, действовать смело и наслаждаться моментом 😏.",
+ "types": ["ESTP"],
+ "short": "Ярило!",
+ },
+ {
+ "text": "На Домового — защищать свой мир и сохранять стабильность 💪🏻.",
+ "types": ["ISTJ"],
+ "short": "Домовой!",
+ },
+ {
+ "text": "На Чернобога — видеть стратегию и действовать по своему плану 😎.",
+ "types": ["INTJ"],
+ "short": "Чернобог!",
+ },
+ {
+ "text": "На Купалу — вдохновлять других и приносить радость 🤩.",
+ "types": ["ENFP"],
+ "short": "Купала!",
+ },
+ {
+ "text": "На Даждьбога — помогать людям расти и вести их к свету 🤗.",
+ "types": ["ENFJ"],
+ "short": "Даждьбог!",
+ },
+ {
+ "text": "На Живу — жить в гармонии с собой и чувствовать мир 😇.",
+ "types": ["ISFP"],
+ "short": "Жива!",
+ },
+ {
+ "text": "На Кощея — быть независимым и полагаться только на себя 😉.",
+ "types": ["ISTP"],
+ "short": "Кощей!",
+ },
+ {
+ "text": "На Рода — создавать основы и поддерживать порядок мира 🙌🏻.",
+ "types": ["ESTJ"],
+ "short": "Род!",
+ },
+ {
+ "text": "На Лелю — верить в добро и следовать своему сердцу 🫶🏻.",
+ "types": ["INFP"],
+ "short": "Леля!",
+ },
+ {
+ "text": "На Жар-птицу — зажигать сердца и превращать жизнь в яркое приключение 🔥.",
+ "types": ["ESFP"],
+ "short": "Жар-птица!",
+ },
],
},
{
- "question": "Вы пишете книгу или создаете проект. Какой подход вам ближе?",
+ "question": "На работе вам важнее всего:",
"answers": [
- (
- "Тщательно исследую тему, соберу всю доступную информацию и буду двигаться шаг за шагом, основываясь на фактах.",
- "S",
- ),
- (
- "Сначала придумаю общую концепцию, представлю мир и героев (или цели проекта), и буду импровизировать, раскрывая детали по ходу дела.",
- "N",
- ),
+ {
+ "text": "Возможность творить и воплощать самые безумные идеи 😜.",
+ "types": ["ENFP", "ENTP", "INFP", "INTP"],
+ "short": "Творчество!",
+ },
+ {
+ "text": "Профессиональный рост и постоянный апгрейд навыков 😌",
+ "types": ["ENTJ", "ESTJ", "ISTJ", "ISFJ"],
+ "short": "Карьера!",
+ },
],
},
{
- "question": "Ваш друг совершил ошибку, которая имеет серьезные последствия. Как вы отреагируете?",
+ "question": "В дружбе вы цените больше всего:",
"answers": [
- (
- "Объективно проанализирую ситуацию, укажу на ошибки и предложу логичное решение проблемы.",
- "T",
- ),
- (
- "Постараюсь понять его мотивы, проявить сочувствие и оказать эмоциональную поддержку, чтобы он справился с ситуацией.",
- "F",
- ),
+ {
+ "text": "Позитивное мышление и фонтаны идей. Когда друг звонит ночью и предлагает сделать из картона ракету, чтобы улететь на Марс, я уже ищу скотч 👀",
+ "types": ["ENFP", "ENTP", "ESFP", "ESTP"],
+ "short": "Идеи!",
+ },
+ {
+ "text": "Искренность. Вы знаете о друге всё: почему он не любит лук, сколько хомяков загубил в детстве и какую песню пел на выпускном 🫶🏻",
+ "types": ["INFJ", "INFP", "ISFJ", "INTJ"],
+ "short": "Искренность!",
+ },
],
},
{
- "question": "Представьте, что у вас есть свободный день. Что вы выберете?",
+ "question": "Что вас вдохновляет?",
"answers": [
- (
- "Заранее составлю план, чтобы максимально эффективно использовать время: посетить музей, заняться спортом, встретиться с друзьями.",
- "J",
- ),
- (
- "Отложу все планы и позволю дню разворачиваться спонтанно: почитаю книгу, прогуляюсь по парку или просто буду наслаждаться моментом.",
- "P",
- ),
+ {
+ "text": "Галочка напротив выполненного дела и зачеркнутые пункты в плане ✅",
+ "types": ["ENTJ", "ESTJ", "ISTJ", "INTJ"],
+ "short": "Планирование!",
+ },
+ {
+ "text": "Душевные разговоры, после которых хочется обнимать весь мир 🫂",
+ "types": ["ENFJ", "INFJ", "ISFP", "INFP"],
+ "short": "Душевность!",
+ },
],
},
]
TEST_RESULTS = {
"INTJ": (
- "Профессор Селезнёв",
- "Ты умеешь воспринимать ситуацию глобально, а твои действия точны и эффективны. Ты, как и профессор Селезнев, привык к системному подходу и логическому анализу, эксперт в своей области",
+ "Чернобог",
+ "Ты стратег, как Чернобог. Умеешь видеть общую картину и планировать наперёд. Ты действуешь точно и уверенно, опираясь на разум.",
),
"INTP": (
- "Знайка",
- "Знаешь всё про всё и даже больше. Предпочитаешь полагаться на свою голову. Любишь “покопаться” в каком-нибудь вопросе и не боишься выдвигать даже самые неожиданные гипотезы",
+ "Велес",
+ "Ты мудрый искатель истины, как Велес — хранитель тайных знаний. Ты стремишься понять мир глубже и видишь то, что скрыто от других. Твоя сила в интеллекте и наблюдательности.",
),
"INFJ": (
- "Ёжик в тумане",
- "Ты, как и Ежик, типичный интроверт, погруженный в свой внутренний мир. Ты глубоко чувствуешь окружающий мир и обладаешь богатым воображением. Хоть и бываешь застенчив и раним, но при этом ты отзывчив и добр.",
+ "Морена",
+ "Ты загадочная и глубокая личность, как Морена. Чувствуешь перемены и понимаешь истинную природу вещей. Твоя мудрость помогает тебе видеть то, что недоступно другим.",
),
"INFP": (
- "Кот Леопольд",
- "«Ребята, давайте жить дружно!» \n\nТы стремишься к гармонии во всех сферах жизни. Ты творческая личность, которая в принятии решений руководствуется своими ценностями и убеждениями",
+ "Леля",
+ "Ты чистая и искренняя душа, как Леля. Веришь в добро и следуешь своему сердцу. Твоя сила в чувствах и внутренней правде.",
),
"ISTJ": (
- "Кролик из Винни Пуха",
- "“-И это всё потому, что у кого-то очень узкие двери! -Нет! Это всё потому, что кто-то слишком много ест!”\n\nТы, как и кролик, всегда логичен и прагматичен. Не тратишь слов попусту, но в ответ на критику за словом в карман не полезешь))",
+ "Домовой",
+ "Ты надёжный защитник, как Домовой. Ценишь порядок, стабильность и безопасность. На тебя всегда можно положиться.",
),
"ISTP": (
- "Буратино",
- "Ты стремишься узнать мир и найти свое место в жизни. Ты, как и Буратино, полон энергии и любопытства. Ты всегда готов исследовать новое и пробовать разные вещи",
+ "Кощей",
+ "Ты независимый и сильный, как Кощей. Привык полагаться на себя, умеешь выживать и находить решения в любой ситуации.",
),
"ISFJ": (
- "Пятачок",
- "Ты добрый и заботливый (поросенок), всегда готов поддержать своих друзей. Любишь проявлять преданность и стремление заботиться о других, стараясь сделать их счастливыми. Как и Пятачок ты всегда готов прийти на помощь, даже если это требует смелости.",
+ "Макошь",
+ "Ты хранитель судьбы, как Макошь. Заботишься о других и создаёшь стабильность. Люди доверяют тебе и чувствуют рядом с тобой безопасность.",
),
"ISFP": (
- "Кот Матроскин",
- "Ты гибкий, очаровательный артист, всегда готовый исследовать и испытать что-то новое. Ты творческая личность, тонкая, эмоциональные и чувствительные натура",
+ "Жива",
+ "Ты живёшь в гармонии, как богиня Жива. Тонко чувствуешь мир и ценишь красоту. Твоя сила — в искренности и внутреннем балансе.",
),
"ENTJ": (
- "Сыщик из бременских музыкантов",
- "Оу ес!\n\nТы решителен и успешен в любом деле. Можешь легко подстроиться под обстоятельства и наперёд просчитать свои действия, прямо как гениальный сыщик!",
+ "Перун",
+ "Ты прирождённый лидер, как Перун — бог грома и справедливости. Ты берёшь ответственность на себя и уверенно ведёшь других. Твоя сила в решительности, порядке и способности действовать без колебаний.",
),
"ENTP": (
- "Карлсон",
- "“В самом расцвете сил!”\n\nТы экстравертен, обаятелен, остроумен, любишь привлекать внимание и постоянно придумывать новые затеи!",
+ "Стрибог",
+ "Ты свободный дух, как Стрибог — бог ветра. Ты приносишь новые идеи и перемены. Твоя энергия вдохновляет и открывает новые возможности.",
),
"ENFJ": (
- "Почтальон Печкин",
- "Своей яркой харизмой ты без усилий убеждаешь и увлекаешь других, наполняя пространство теплом и создавая отличную атмосферу для продуктивной работы.",
+ "Даждьбог",
+ "Ты несёшь свет и развитие, как Даждьбог. Ты вдохновляешь других и помогаешь им становиться лучше. Твоя сила в поддержке и лидерстве.",
),
"ENFP": (
- "Трубадур из бременских музыкантов",
- "Ты энергичный, харизматичный и независимый человек. Ты не боишься перемен и всегда открыт к чему-то новому, легко находишь общий язык с людьми, а твое творческое мышление помогает находить нестандартные решения",
+ "Купала",
+ "Ты приносишь радость и вдохновение, как Купала. Любишь жизнь, новые эмоции и возможности. Люди тянутся к твоему свету.",
),
"ESTJ": (
- "Римма Трофимовна. Мама дядя Федора",
- "Ты являешься практичным и инициативным человеком, способным организовывать своё время и задачи. Высокие стандарты, которые ты установил для себя, делают тебя надежным и вдохновляющим примером для окружающих.",
+ "Род",
+ "Ты создаёшь основы, как Род — создатель мира. Ты организованный и ответственный. Ты умеешь строить порядок и управлять процессами.",
),
"ESTP": (
- "Волк из “Ну, погоди!”",
- "Ты энергичный, авантюрный и предприимчивый. Как Волк всегда стремишься достичь своей цели и, не останавливаясь, ищешь новых приключений!",
+ "Ярило",
+ "Яркость и смелость, как у Ярило — бога солнца и жизни. Ты любишь действовать и не боишься риска. Ты живёшь настоящим моментом.",
),
"ESFJ": (
- "Дядя Федор",
- "Как и Дядя Федор, ты надежный и ответственный, на тебя всегда можно положиться. Ты внимателен к потребностям и чувствам других людей и всегда готов прийти на помощь.",
+ "Лада",
+ "Ты создаёшь гармонию, как богиня Лада. Умеешь объединять людей и заботиться о них. Твоя сила в доброте, поддержке и способности создавать баланс.",
),
"ESFP": (
- "Мышонок",
- "“Какой чудесный день, какой чудесный пень…”\n\nЗаводила, запевала. Всегда в центре событий. Умеешь заставить улыбнуться людей",
+ "Жар-птица",
+ "Ты — огонь праздника, как Жар-птица. Умеешь зажигать людей вокруг, любишь яркие впечатления и легко превращаешь обычный день в событие. Твоя сила в харизме, смелости и умении жить “здесь и сейчас”.",
),
}
diff --git a/app/plugin/user.py b/app/plugin/user.py
index 06593eb..21965a7 100755
--- a/app/plugin/user.py
+++ b/app/plugin/user.py
@@ -18,6 +18,8 @@ class User:
self._faculty: str = None
self._group: str = None
self._type: str = None
+ self._agree_upload: bool = None
+ self._vector_type: dict = None
self._load()
@@ -87,6 +89,28 @@ class User:
return self._type
+ @property
+ def agree_upload(self):
+ return self._agree_upload
+
+ @agree_upload.setter
+ def agree_upload(self, value):
+ self._agree_upload = value
+ self.update_data()
+
+ return self._agree_upload
+
+ @property
+ def vector_type(self):
+ return self._vector_type
+
+ @vector_type.setter
+ def vector_type(self, value):
+ self._vector_type = value
+ self.update_data()
+
+ return self._vector_type
+
def _into_json(self):
return {
"_id": self.user_id,
@@ -96,6 +120,8 @@ class User:
"faculty": self._faculty,
"group": self._group,
"type": self._type,
+ "agree_upload": self._agree_upload,
+ "vector_type": self._vector_type,
}
def update_data(self):
@@ -128,6 +154,8 @@ class User:
self._faculty = data["faculty"]
self._group = data["group"]
self._type = data["type"]
+ self._agree_upload = data["agree_upload"]
+ self._vector_type = data["vector_type"]
@staticmethod
def start_shuffle_reg():
diff --git a/readme.md b/readme.md
index 4852f31..7d8008a 100755
--- a/readme.md
+++ b/readme.md
@@ -5,6 +5,7 @@
## Запуск
1. Создать [файл .env](#env) в директории `app`
+ - Пример файла расположен в корне (`.env.example`)
2. Запустить контейнеры с помощью docker compose:
- `docker-compose up -d`
@@ -57,7 +58,7 @@
- `API_TOKEN` - токен для tg бота полученный у `@BotFather`
- `ADMIN_ID` - id **_главного админа_**
- `DB_PORT` порт для MongoDB, стандартно `27017`
-- `ENV` - если выставлен как `dev`:
+- `ENV` - если выставлен как `DEV`:
- возможность подключаться к базе данных удалённо через SSH
- `SSH_HOST` - имя/ip хоста
- `SSH_USER` - имя пользователя