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` - имя пользователя