diff --git a/.env_example b/.env_example
index 5bd9dfa..fed5afa 100644
--- a/.env_example
+++ b/.env_example
@@ -1,92 +1,161 @@
-# Токены бота
-BOT_TOKEN=your_bot_token_here
-BOT_DEBUG_TOKEN=your_debug_bot_token_here
+# ================== ТОКЕНЫ ==================
-# Режим отладки
+# Рабочий токен бота (обязателен в обычном режиме)
+BOT_TOKEN=
+
+# Токен для режима отладки (обязателен при DEBUG=True)
+BOT_DEBUG_TOKEN=
+
+# Режим отладки (True/False)
DEBUG=False
-# Владелец бота
+
+# ================== БОТ ==================
+
+# Имя проекта
+PROJECT_NAME=PRIMO
+
+# Имя бота
+BOT_NAME="Первозданная Жемчужина"
+
+# Полное описание бота
+BOT_DESCRIPTION=
+
+# Краткое описание
+BOT_SHORT_DESCRIPTION=
+
+
+
+# ================== БАЗОВЫЕ НАСТРОЙКИ ==================
+
+# Буферизация вывода Python (1 = без буфера, 0 = с буфером)
+PYTHONUNBUFFERED=1
+
+# Локаль (папка с переводами)
+LOCALE_PATH=locales
+
+# Владелец (@юзернейм в Telegram)
OWNER=@verdise
-# Основные настройки
+
+
+# ================== РОЛЕВОЙ ПРОЕКТ ==================
+
+# Название ролевого проекта
+RP_NAME="𝘗𝘳𝘪𝘮𝘰 𝘞𝘰𝘳𝘭𝘥"
+
+# Ссылки на каналы/чаты
+INFO_URL=https://t.me/PrimoWorldRP
+FLUD_URL=https://t.me/PrimoWorldRP
+RP_URL=https://t.me/PrimoWorldRP
+LIFE_URL=https://t.me/PrimoWorldRP
+
+# Владелец ролевого проекта
+RP_OWNER=
+
+# Роли (список, можно хранить через запятую)
+ROLES=Альбедо,Чжун Ли,Кэйа
+
+
+
+# ================== ВЕБХУК ==================
+
+# Использовать вебхук (True/False)
+WEBHOOK=False
+
+# Публичный HTTPS URL для вебхука
+WEBHOOK_URL=https://bot.primo.dpdns.org/webhook
+
+# Хост для uvicorn внутри контейнера
+WEBAPP_HOST=0.0.0.0
+
+# Порт для uvicorn
+WEBAPP_PORT=3131
+
+# Уровень логирования (debug/info/warning/error/critical)
+LOG_LEVEL=warning
+
+# Вести access-лог (True/False)
+ACCES_LOG=False
+
+
+
+# ================== НАСТРОЙКИ СООБЩЕНИЙ ==================
+
+# Режим парсинга текста (HTML / Markdown / MarkdownV2)
PARSE_MODE=HTML
+
+# Кодировка
ENCOD=utf-8
+
+# Формат времени
TIME_FORMAT=%Y-%m-%d %H:%M:%S
+
+# Префиксы команд (например: /!.&?)
PREFIX=/!.&?
+
+# Язык/платформа
BOT_LANGUAGE=Aiogram3
-# Настройки сообщений
-DISABLE_NOTIFICATION=False
-PROTECT_CONTENT=False
-ALLOW_SENDING_WITHOUT_REPLY=True
-LINK_PREVIEW_IS_DISABLED=False
-LINK_PREVIEW_PREFER_SMALL_MEDIA=False
-LINK_PREVIEW_PREFER_LARGE_MEDIA=True
-LINK_PREVIEW_SHOW_ABOVE_TEXT=False
-SHOW_CAPTION_ABOVE_MEDIA=False
+# ================== ЛОГИ ==================
-# Разрешения
-BOT_EDIT=False
-START_INFO_CONSOLE=True
-START_INFO_TO_FILE=True
-
-# Логирование
+# Включить вывод в консоль (True/False)
LOG_CONSOLE=True
+
+# Включить запись логов в файл (True/False)
LOG_FILE=True
+
+# Папка для логов
LOG_DIR=Logs
+
+# Имя файла для логов
LOG_FILE_INFO=bot_info.log
-# Вебхук
-WEBHOOK=False
-# API ключи
-API_KEY=your_api_key
-WEB_API_KEY=your_web_api_key
-WEATHER_API_KEY=your_weather_api_key
+# ================== API ==================
-# Telegram API ID и HASH
-TG_API_UID=123456
-TG_API_HASH=your_tg_api_hash
+# Основной API-ключ
+API_KEY=
+
+# Веб-API ключ
+WEB_API_KEY=
+
+# Ключ для погоды
+WEATHER_API_KEY=
-# Важные ID
-ADMIN_ID=123456789
-MODERATOR_ID=987654321
-IMPORTANT_ID=1122334455
-IMPORTANT_GROUP_ID=-1001122334455
-IMPORTANT_CHANNEL_ID=-1009988776655
+
+# ================== ПОЛЬЗОВАТЕЛЬСКИЕ ДАННЫЕ ==================
+
+# Telegram API ID (int)
+TG_API_UID=0
+
+# Telegram API HASH
+TG_API_HASH=
-# Настройки бота
-PROJECT_NAME=PRIMO
-BOT_NAME=Первозданная Жемчужина
-BOT_DESCRIPTION=Ваш помощник в удивительные миры! Prod. by:『@verdise』
-BOT_SHORT_DESCRIPTION=Тех.поддержка: @verdise
-# Настройки ролевого проекта
-RP_NAME: str = "𝘗𝘳𝘪𝘮𝘰 𝘞𝘰𝘳𝘭𝘥"
+# ================== ИДЕНТИФИКАТОРЫ ==================
+# ID администраторов (список чисел через запятую)
+ADMIN_ID=
-# Права администратора
-ANONYMOUS=False
-MANAGE_CHAT=True
-CHANGE_INFO=True
-PROMOTE_MEMBERS=True
-RESTRICT_MEMBERS=True
-POST_MESSAGE=True
-MANAGE_TOPICS=True
-INVITE_USER=True
-DELETE_MESSAGES=True
-MANAGE_VIDEO_CHATS=True
-EDIT_MESSAGES=True
-PIN_MESSAGE=True
-POST_STORIES=True
-EDIT_STORIES=True
-DELETE_STORIES=True
+# ID модератора
+MODERATOR_ID=0
+# Важный ID (пользователь/чат)
+IMPORTANT_ID=0
-# Поддержка
+# ID важной группы
+IMPORTANT_GROUP_ID=0
+
+# ID важного канала
+IMPORTANT_CHANNEL_ID=0
+
+# ID чата поддержки
SUPPORT_CHAT_ID=0
+
+
diff --git a/.idea/PrimoAranarBot.iml b/.idea/PrimoAranarBot.iml
deleted file mode 100644
index 7338d77..0000000
--- a/.idea/PrimoAranarBot.iml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
index 5d2654d..5f43230 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -2,7 +2,7 @@
-
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index a3659fd..eec269f 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -4,155 +4,78 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
- {}
- {
- "isMigrated": true
+ {
+ "lastFilter": {
+ "state": "OPEN",
+ "assignee": "Whyverum"
+ }
+}
+ {
+ "selectedUrlAndAccountId": {
+ "url": "https://github.com/Whyverum/PrimoAranaraBot.git",
+ "accountId": "0f62da85-b1da-4c18-9e57-3daced58edde"
+ }
}
{
- "associatedIndex": 6
+ "associatedIndex": 0
}
-
+
- {
- "keyToString": {
- "ModuleVcsDetector.initialDetectionPerformed": "true",
- "Python.main.executor": "Run",
- "RunOnceActivity.ShowReadmeOnStart": "true",
- "RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager": "true",
- "RunOnceActivity.git.unshallow": "true",
- "git-widget-placeholder": "master",
- "last_opened_file_path": "C:/Users/admin/Documents/Projects/Python/PrimoAranarBot",
- "node.js.detected.package.eslint": "true",
- "node.js.detected.package.tslint": "true",
- "node.js.selected.package.eslint": "(autodetect)",
- "node.js.selected.package.tslint": "(autodetect)",
- "nodejs_package_manager_path": "npm",
- "settings.editor.selected.configurable": "com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable",
- "vue.rearranger.settings.migration": "true"
+
+}]]>
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
@@ -160,9 +83,8 @@
-
-
+
@@ -184,75 +106,27 @@
-
-
+
+
-
- 1754643627985
+
+ 1757307968095
- 1754643627985
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ 1757307968095
+
+
-
-
-
-
- file://$PROJECT_DIR$/bot/handlers/__init__.py
-
-
-
- file://$PROJECT_DIR$/bot/handlers/secret/secret1.py
-
-
-
- file://$PROJECT_DIR$/bot/handlers/messages/__init__.py
-
-
-
- file://$PROJECT_DIR$/bot/handlers/messages/default.py
- 59
-
-
-
- file://$PROJECT_DIR$/bot/core/__init__.py
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/assets/arsenal_secret2.jpeg b/assets/arsenal_secret2.jpeg
new file mode 100644
index 0000000..4863dd2
Binary files /dev/null and b/assets/arsenal_secret2.jpeg differ
diff --git a/bot/core/bots.py b/bot/core/bots.py
index 7d4166c..a8bbdfc 100644
--- a/bot/core/bots.py
+++ b/bot/core/bots.py
@@ -13,7 +13,7 @@ from aiogram.types import (
)
from aiogram.utils.i18n import I18n, SimpleI18nMiddleware
-from configs.config import BotSettings, BotEdit, Webhook, Permission
+from configs.config import BotSettings, BotEdit, Webhook
from middleware.loggers import log
__all__ = ("dp", "bot", "BotInfo", "i18n")
@@ -193,7 +193,7 @@ class BotInfo:
@classmethod
@log(level="INFO", log_type="START", text="Процесс запуска бота!")
- async def setup(cls, bots: Bot = bot, perm: bool = Permission.BOT_EDIT):
+ async def setup(cls, bots: Bot = bot, perm: bool = BotEdit.ALLOW):
await cls.webhook(bots=bots)
await cls.info(bots=bots)
if perm:
diff --git a/bot/handlers/commands/users/active.py b/bot/handlers/commands/users/active.py
index a964c06..bf48a2c 100644
--- a/bot/handlers/commands/users/active.py
+++ b/bot/handlers/commands/users/active.py
@@ -14,11 +14,11 @@ from database import db
__all__ = ("router",)
-CMD: str = "active".lower()
+CMD: str = "active".casefold()
router: Router = Router(name=f"{CMD}_cmd_router")
-@router.callback_query(F.data.lower() == CMD)
+@router.callback_query(F.data.casefold() == CMD)
@router.message(Command(*COMMANDS[CMD], prefix=BotInfo.prefix, ignore_case=True))
async def active_cmd(message: Message | CallbackQuery, state: FSMContext) -> None:
"""Обработчик команды /active"""
diff --git a/bot/handlers/secret/__init__.py b/bot/handlers/secret/__init__.py
index 34f24a0..1206094 100644
--- a/bot/handlers/secret/__init__.py
+++ b/bot/handlers/secret/__init__.py
@@ -1,6 +1,6 @@
from aiogram import Router
from .secret1 import router as secret1_router
-#from .secret2 import router as secret2_router
+from .secret2 import router as secret2_router
# Настройка экспорта и роутера
__all__ = ('router',)
@@ -9,5 +9,5 @@ router: Router = Router(name=__name__)
# Подключение секретного роутера
router.include_routers(
secret1_router,
-#secret2_router,
+secret2_router,
)
diff --git a/bot/handlers/secret/secret1.py b/bot/handlers/secret/secret1.py
index 8c13788..f472465 100644
--- a/bot/handlers/secret/secret1.py
+++ b/bot/handlers/secret/secret1.py
@@ -11,7 +11,7 @@ router: Router = Router(name="secret_router")
CMD: str = "secret_1"
-@router.message(F.text.lower() == "истинная цель короля всегда было мироздание")
+@router.message(F.text.casefold() == "истинная цель короля всегда было мироздание")
@log(level='INFO', log_type=CMD.upper(), text=f"использовал команду /{CMD}")
async def secret1_cmd(message: Message, state: FSMContext) -> None:
"""Обработчик секретов"""
diff --git a/bot/handlers/secret/secret2.py b/bot/handlers/secret/secret2.py
index 3cadc7f..9d9a71a 100644
--- a/bot/handlers/secret/secret2.py
+++ b/bot/handlers/secret/secret2.py
@@ -1,134 +1,232 @@
+from asyncio import sleep
+from typing import Dict, Any
+
from aiogram import Router, F
from aiogram.filters import Command, StateFilter
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup
-from aiogram.types import Message
+from aiogram.types import Message, FSInputFile
+from aiogram.utils.markdown import hide_link
-# Создаем роутер
-knowledge_router = Router()
+from configs import ID_TO_ROLE
+
+router: Router = Router()
-# Определяем состояния
class KnowledgeStates(StatesGroup):
- question1 = State()
- question2 = State()
- question3 = State()
- question4 = State()
- question5 = State()
- question6 = State()
+ """Состояния для викторины"""
+ question1: State = State()
+ question2: State = State()
+ question3: State = State()
+ question4: State = State()
+ question5: State = State()
+ question6: State = State()
+
+class Secret2(StatesGroup):
+ """Состояния для страха"""
+ name: State = State()
+ result: State = State()
-# Вопросы и ответы (замените на свои)
-QUESTIONS = {
- 1: "Вопрос1",
- 2: "Вопрос2",
- 3: "Вопрос3",
- 4: "Вопрос4",
- 5: "Вопрос5",
- 6: "Вопрос6"
+
+QUESTIONS: Dict[int, str] = {
+ 1: "Начнем с простого. Уравнение расчета коэффициента анти-магической стали с добавлением углеродно-никилиевой добавки?",
+ 2: "Как зовут малышку, что обитает в лаборатории Дотторе?",
+ 3: "Какое блюдо мы, аранары, любим больше всего? Ты то должен знать наверняка!",
+ 4: "Господин все время, что-то рисует на чертеже, но для чего..? Каков Его следующий ход?",
+ 5: "Брошь Дотторе ужасно интересна… А в чем её особенность? Как она сделана?",
+ 6: "Что самое важное для тебя, дорогой Друг?"
}
-ANSWERS = {
- 1: {"Ответ 11": "СообщениеА1", "Ответ 12": "СообщениеБ1"},
- 2: {"Ответ 21": "СообщениеА2", "Ответ 22": "СообщениеБ2"},
- 3: {"Ответ 31": "СообщениеА3", "Ответ 32": "СообщениеБ3"},
- 4: {"Ответ 41": "СообщениеА4", "Ответ 42": "СообщениеБ4"},
- 5: {"Ответ 51": "СообщениеА5", "Ответ 52": "СообщениеБ5"},
- 6: {"Ответ 61": "СообщениеА6", "Ответ 62": "СообщениеБ6"}
-}
-
-FINAL_MESSAGES = {
- "all_1": "ИТОГ1 - Все ответы первого типа!",
- "all_2": "ИТОГ2 - Все ответы второго типа!",
- "mixed": "ИТОГ1 - Смешанные ответы!"
+ANSWERS: Dict[int, Dict[str, str]] = {
+ 1: {"96h-69ctg30x": "Верно! Основная часть уравнения Логосской Экклесии, вроде бы...", "2x+3": "Кхм.. Кажется все в п̄͠о̶̩р́ͫя̦̚дке? Продолжим!"},
+ 2: {"Эмилия": "Эмилия! Эми! Очень красивое имя! Я помню эту малышку, её принес Дотторе в кро—", "Убийца": "Н̱͞е́̇т̆͝.. Я͔́ н̴ͫе̑͢ х̧ͬоͤ͡т̧̌е̡ͭл̂͞.."},
+ 3: {"Сладости": "ДА! Я ОБОЖАЮ СЛАДОСТИ! Я состою более чем на 26% из глюкозы! Хе-хе-хе!", "Бедренная кость": "О͙̃т̻ͥч͍̺е̛͓т̜̓ #77. П̏͘о̮ͧс̸̪л͔͡е̛̄ с͈̄лͥ͝о̢̲м̮̇а̡̤н̬͜н͙̀ы͓́х̸̭ к͒͡о̆̌с̴̟т̯͒е̱͘й̘͘ п̏̕р̵͂и̉͘ш̙̘е̸̾л̰͢ оͭͅн̽͢."},
+ 4: {"Броня": "Броня? Ари думал это металлическая пижама на вечеринку.. Почему все так сложнооо?(", "F5:С8": "К̻̻̀у̧̺ͥл̯͚̽ьͥ̀̇т̴̵͈ в̡̝̲с͓̦͂е̜͒̀ б̞ͮ̂л̡̝͞и̉ͨ͢ж̲ͭ̕е̡͈̽. О̽͐͘н͕̀͟и̶ͭ с̸͆͠к̵̤̓о̺͔͊р̴͙ͪоͤ̕ͅ н̘̖͠а̲͢й̝͟͝д̠ͯ͘у͚͌̕т̪̼ͯ м̋͢͜ѐ͚̍нͨ̄̕я̵̱. Я̷͚ͦ з̛̉͘н̫͢ͅа̷̦͒юͯͨ. Н̵ͭ͠у̶̯͖ж̢ͯ̇н̜́о̸̜̏ у̞̾͜с̱͋́т̮̚͢а̜̺̑н̨͕͊о̵̋ͅв̛̄̉и̛̜̅т̆͋͑ь̢͐ͥ р̢̼̏а̠ͭ̀с̞ͤ͜т̞̦͜я͙̑͟ж̵̩̖к̩̚͜у̷̩ͣ н̨̈́̽а͕ͮ͟ д̛̬͞в̥ͧͫе̘ͯ̕р̠͖̍и͕͎́.."},
+ 5: {"Аугментум": "Верно! Внутри броши Дотторе, целая карманная лаборатория!", "Серый": "Р̟̀у̠̫н̸̶и̶̇ч̐͒е͎͜с̡̞к̦̉а̶͚я̙̤ м̟̏а̨̏т͕͋р̞ͥи̵̜ц͓̀а̶͠.. Ч͕͕ё͔рͪ̉т̄̕."},
+ 6: {"": "Для меня это тоже важно!", "Истина": "Д̺̎о̦͠б͖̀рͨ͞о̢͝ п͎̕о̩ͯж͙͘а̠͓л̸͈о̗͟в͖̀а̸ͫт̰̏ьͯ͠! Д̷̖р̂͝уͨ́з̡͓ь̼͐я̈́͡!"}
}
-# Запуск сессии знаний
-@knowledge_router.message(StateFilter(None), Command("знания"))
-@knowledge_router.message(StateFilter(None), F.text.casefold() == "пора заняться знаниями")
-async def start_knowledge_session(message: Message, state: FSMContext):
- await message.answer("Отлично! Начинаем сессию знаний! 🧠")
- await message.answer(QUESTIONS[1])
+@router.message(StateFilter(None), Command("знания"))
+@router.message(StateFilter(None), F.text.casefold() == "пора заняться знаниями")
+async def start_knowledge_session(message: Message, state: FSMContext) -> None:
+ """Запуск сессии знаний"""
+ await message.answer("""
+Отлично! Начинаем сессию знаний! 🧠
+Я буду задавать вам вопросы, а вы должны ответить на них!
+""")
+ await message.reply(QUESTIONS[1])
await state.set_state(KnowledgeStates.question1)
await state.update_data(answers={})
-# Обработчики для каждого вопроса
-@knowledge_router.message(KnowledgeStates.question1, F.text.in_(ANSWERS[1].keys()))
-async def process_question1(message: Message, state: FSMContext):
- user_answer = message.text
- response_message = ANSWERS[1][user_answer]
+async def save_answer(
+ state: FSMContext, question_key: str, user_answer: str, correct_option: str
+) -> None:
+ """Сохраняет ответ (1 — первый тип, 2 — второй тип)"""
+ answer_code: int = 1 if user_answer == correct_option else 2
+ data: Dict[str, Any] = await state.get_data()
+ answers: Dict[str, int] = data.get("answers", {})
+ answers[question_key] = answer_code
+ await state.update_data(answers=answers)
- # Сохраняем ответ
- answer_code = 1 if user_answer == "Ответ 11" else 2
- await state.update_data(answers={"q1": answer_code})
- # Отправляем сообщение и следующий вопрос
- await message.answer(response_message + "\n\n" + QUESTIONS[2])
+# ==================== ОБРАБОТЧИКИ ВОПРОСОВ ====================
+
+@router.message(KnowledgeStates.question1, F.text.in_(ANSWERS[1].keys()))
+async def process_question1(message: Message, state: FSMContext) -> None:
+ await save_answer(state, "q1", message.text, "96h-69")
+ await message.reply(f"{ANSWERS[1][message.text]}\n\n{QUESTIONS[2]}
")
await state.set_state(KnowledgeStates.question2)
-@knowledge_router.message(KnowledgeStates.question2, F.text.in_(ANSWERS[2].keys()))
-async def process_question2(message: Message, state: FSMContext):
- user_answer = message.text
- response_message = ANSWERS[2][user_answer]
-
- # Сохраняем ответ
- answer_code = 1 if user_answer == "Ответ 21" else 2
- data = await state.get_data()
- answers = data.get("answers", {})
- answers["q2"] = answer_code
- await state.update_data(answers=answers)
-
- # Отправляем сообщение и следующий вопрос
- await message.answer(response_message + "\n\n" + QUESTIONS[3])
+@router.message(KnowledgeStates.question2, F.text.in_(ANSWERS[2].keys()))
+async def process_question2(message: Message, state: FSMContext) -> None:
+ await save_answer(state, "q2", message.text, "Алиса")
+ await message.reply(f"{ANSWERS[2][message.text]}\n\n{QUESTIONS[3]}
")
await state.set_state(KnowledgeStates.question3)
-# Добавьте аналогичные обработчики для question3-question5
+@router.message(KnowledgeStates.question3, F.text.in_(ANSWERS[3].keys()))
+async def process_question3(message: Message, state: FSMContext) -> None:
+ await save_answer(state, "q3", message.text, "Сладости")
+ await message.reply(f"{ANSWERS[3][message.text]}\n\n{QUESTIONS[4]}
")
+ await state.set_state(KnowledgeStates.question4)
-@knowledge_router.message(KnowledgeStates.question6, F.text.in_(ANSWERS[6].keys()))
-async def process_question6(message: Message, state: FSMContext):
- user_answer = message.text
- response_message = ANSWERS[6][user_answer]
- # Сохраняем ответ
- answer_code = 1 if user_answer == "Ответ 61" else 2
+@router.message(KnowledgeStates.question4, F.text.in_(ANSWERS[4].keys()))
+async def process_question4(message: Message, state: FSMContext) -> None:
+ await save_answer(state, "q4", message.text, "---")
+ await message.reply(f"{ANSWERS[4][message.text]}\n\n{QUESTIONS[5]}
")
+ await state.set_state(KnowledgeStates.question5)
+
+
+@router.message(KnowledgeStates.question5, F.text.in_(ANSWERS[5].keys()))
+async def process_question5(message: Message, state: FSMContext) -> None:
+ await save_answer(state, "q5", message.text, "Аугментум")
+ await message.reply(f"{ANSWERS[5][message.text]}\n\n{QUESTIONS[6]}
")
+ await state.set_state(KnowledgeStates.question6)
+
+
+@router.message(KnowledgeStates.question6)
+async def process_question6(message: Message, state: FSMContext) -> None:
+ user_answer: str = message.text
+
+ # Определяем логику: "Истина" → второй тип, иначе → первый тип
+ if user_answer == "Истина":
+ answer_code: int = 2
+ response_message: str = ANSWERS[6]["Истина"]
+ else:
+ answer_code: int = 1
+ # Для любого ответа кроме "Истина" выводим либо заготовку, либо сам текст
+ response_message: str = ANSWERS[6].get("Мир", f"Ты прав! Ты———")
+
+ # Сохраняем результат
data = await state.get_data()
answers = data.get("answers", {})
answers["q6"] = answer_code
await state.update_data(answers=answers)
- # Отправляем финальное сообщение
- await message.answer(response_message)
+ # Отправляем сообщение и завершаем сессию
+ await message.reply(response_message)
await finish_knowledge_session(message, state)
-# Обработчики для некорректных ответов
-@knowledge_router.message(KnowledgeStates.question1)
-async def process_incorrect_answer1(message: Message):
- await message.answer("Пожалуйста, выберите один из предложенных вариантов ответа.")
- await message.answer(QUESTIONS[1])
+
+# ==================== ОБРАБОТЧИК НЕВЕРНЫХ ОТВЕТОВ ====================
+
+@router.message(StateFilter(
+KnowledgeStates.question1,
+ KnowledgeStates.question2,
+ KnowledgeStates.question3,
+ KnowledgeStates.question4,
+ KnowledgeStates.question5,
+ KnowledgeStates.question6,
+))
+async def process_incorrect_answer(message: Message, state: FSMContext) -> None:
+ """Отвечает пользователю, если он ввёл что-то не из списка"""
+ current_state: str = (await state.get_state()).split(":")[-1]
+
+ question_number: int = {
+ "question1": 1,
+ "question2": 2,
+ "question3": 3,
+ "question4": 4,
+ "question5": 5,
+ "question6": 6,
+ }[current_state]
+
+ await message.reply(
+ f"Пожалуйста, выберите один из предложенных вариантов ответа.\n\n{QUESTIONS[question_number]}
"
+ )
-@knowledge_router.message(KnowledgeStates.question2)
-async def process_incorrect_answer2(message: Message):
- await message.answer("Пожалуйста, выберите один из предложенных вариантов ответа.")
- await message.answer(QUESTIONS[2])
+# ==================== ЗАВЕРШЕНИЕ ====================
+# ------------------- Завершение сессии знаний -------------------
+@router.message(Command("secret2676"))
+async def finish_knowledge_session(message: Message, state: FSMContext) -> None:
+ """Завершает сессию знаний"""
+ data: Dict[str, Any] = await state.get_data()
+ answers: Dict[str, int] = data.get("answers", {})
-# Добавьте аналогичные обработчики для остальных вопросов
-
-# Завершение сессии
-async def finish_knowledge_session(message: Message, state: FSMContext):
- data = await state.get_data()
- answers = data.get("answers", {})
-
- # Проверяем результаты
if all(answer == 2 for answer in answers.values()):
- await message.answer(FINAL_MESSAGES["all_2"])
+ await message.answer(
+ f"""{hide_link("https://i.pinimg.com/originals/e0/ab/f7/e0abf78d8a8eba5fa8ae9cb7b9b1c410.gif")}
+ Дᴀʙнᴏ… ᴄᴧиɯᴋᴏʍ дᴀʙнᴏ ʍы нᴇ ʙᴄᴛᴩᴇчᴀᴧиᴄь, Нᴀбᴧюдᴀᴛᴇᴧь.
+ Тʙᴏи ᴦᴧᴀɜᴀ… ᴏни ᴄᴧᴇдяᴛ ɜᴀ ʍнᴏй ᴄᴋʙᴏɜь ᴛьʍу, нᴇ ʍиᴦᴀя.
+ Сᴋᴀжи… ᴄᴋᴀжи хᴏᴛя бы ᴄʙᴏё иʍя… ᴨᴩᴇждᴇ чᴇʍ ᴛьʍᴀ ᴨᴩᴏᴦᴧᴏᴛиᴛ нᴀᴄ ᴏᴋᴏнчᴀᴛᴇᴧьнᴏ.
+ """
+ )
+ await state.set_state(Secret2.name)
else:
- await message.answer(FINAL_MESSAGES["mixed"])
+ await message.reply_photo(photo=FSInputFile("assets/arsenal_secret2.jpeg"),
+ caption="""
+┏━━━━━━━━━━━━━━━━━━━┓
+…От той группы не осталось даже тени. Никаких следов, только пустота, словно их поглотила сама тьма.
+Но сканер… сканер выдал странные, тревожные результаты. На их основе можно сделать выводы… выводы, которые лучше бы остались тайной.
+Трёхдневные графики активности Омута… они словно шепчут сквозь цифровой шум. Если использовать заражение… если рискнуть… я смогу превратить хаос в новые материалы.
+
+Но для этого нужна новая группа. Свежие люди… на чьих плечах может лечь эта тьма. Придётся… найти их. И отправить.
+┗━━━━━━━━━━━━━━━━━━━┛
+ """)
await state.clear()
+
+# ------------------- Проверка имени -------------------
+@router.message(StateFilter(Secret2.name))
+async def hard_secret_name(message: Message, state: FSMContext) -> None:
+ user_id: int = message.from_user.id
+ text: str = message.text.strip()
+
+ expected_role: str = ID_TO_ROLE.get(user_id)
+
+ if expected_role is None:
+ await message.reply("Ты не значишь ничего для этой тайны…")
+ await state.clear()
+ return
+
+ if text.lower() == expected_role.lower():
+ await message.reply(f"""{hide_link("https://i.pinimg.com/originals/d3/ae/62/d3ae62df6150066abc4f814d06070033.gif")}
+Кхʍ.. Знᴀчиᴛ ᴛы {expected_role}? Инᴛᴇᴩᴇᴄнᴏᴇ иʍя, нᴏ нᴀᴄᴛᴏящᴇᴇ ᴧи ᴏнᴏ? Чᴛᴏ ж, ϶ᴛᴏ нᴇ ʙᴀжнᴏ, ᴄᴋᴀжи ʍнᴇ {expected_role}, чᴛᴏ жᴇ ᴛы ʙыбᴩᴀᴧ бы?
+Убиᴛь дᴇʙᴏчᴋу, ᴩᴀди ʍиᴩᴀ
+Иᴧи убиᴛь ʍиᴩ, ᴩᴀди дᴇʙуɯᴋи?
+""")
+ else:
+ await message.reply(f"""{hide_link("https://i.pinimg.com/originals/a8/a5/a2/a8a5a29dd1613a48ef0a680e19973ff6.gif")}
+Нᴇᴛ, ϶ᴛᴏ нᴇ ᴛы. Тʙᴏᴇ нᴀᴄᴛᴏящᴇᴇ иʍя {expected_role}. Ты ʍнᴇ ʙнᴏʙь ᴄᴏʙᴩᴀᴧ. Инᴛᴇᴩᴇᴄнᴏ, чᴛᴏ ᴛᴇбя ᴨᴏбудиᴧᴏ. Нᴏ ϶ᴛᴏ нᴇ ʙᴀжнᴏ, ᴄᴋᴀжи ʍнᴇ {expected_role}, чᴛᴏ жᴇ ᴛы ʙыбᴩᴀᴧ бы?
+Убиᴛь дᴇʙᴏчᴋу, ᴩᴀди ʍиᴩᴀ
+Иᴧи убиᴛь ʍиᴩ, ᴩᴀди дᴇʙуɯᴋи?
+""")
+ await state.update_data(role=expected_role)
+ await state.set_state(Secret2.result)
+
+
+# ------------------- Финальный результат -------------------
+@router.message(StateFilter(Secret2.result))
+async def secret2_result(message: Message, state: FSMContext) -> None:
+ await message.reply(f"Я ɜᴀᴨᴏʍню твой ответ.")
+ await sleep(120)
+ await message.reply("Чужой мира сего.")
+ await state.clear()
\ No newline at end of file
diff --git a/bot/utils/interesting_facts.py b/bot/utils/interesting_facts.py
index 5f17108..eed9503 100644
--- a/bot/utils/interesting_facts.py
+++ b/bot/utils/interesting_facts.py
@@ -16,7 +16,7 @@ def interesting_fact(mode: str = "факт", lists: Optional[list[str]] = None)
if lists is not None:
return choice(lists)
- mode = mode.lower()
+ mode = mode.casefold()
if mode == "анекдот":
source: list[str] = Lists.jokes
@@ -42,7 +42,7 @@ def get_best_response(
:param random_phrases: список случайных фраз, если совпадений нет
:return: строка с ответом
"""
- normalized_text: str = user_text.lower()
+ normalized_text: str = user_text.casefold()
# Перебор ключевых слов в словаре
for _, data in responses.items():
diff --git a/configs/config.py b/configs/config.py
index f0f82ea..d0cd061 100644
--- a/configs/config.py
+++ b/configs/config.py
@@ -313,7 +313,7 @@ class ImportantID:
class BotEdit:
"""Алиасы для настроек редактирования бота."""
- ALLOW_PERMISSION: Final[bool] = settings.BOT_EDIT
+ ALLOW: Final[bool] = settings.BOT_EDIT
PROJECT_NAME: Final[str] = settings.PROJECT_NAME
NAME: Final[str] = settings.BOT_NAME
DESCRIPTION: Final[str] = settings.BOT_DESCRIPTION
diff --git a/configs/roles.py b/configs/roles.py
index 5e27e88..7134900 100644
--- a/configs/roles.py
+++ b/configs/roles.py
@@ -1,7 +1,40 @@
+from typing import Dict
from database import RoleRegion
# Настройка экспорта
-__all__ = ("genshin_roles", "hsr_roles", "all_roles",)
+__all__ = ("genshin_roles", "hsr_roles", "ID_TO_ROLE", "all_roles",)
+
+# Словарь с ID пользователей и их ролями
+ID_TO_ROLE: Dict[int, str] = {
+ 6639261502: "Рацио",
+ 7435095514: "Панталоне",
+ 6250345032: "Сандэй",
+ 5683309573: "Хохо",
+ 833230790: "Сампо",
+ 6688236743: "Аглая",
+ 459453807: "Флинс",
+ 7831579419: "Анакса",
+ 7749831743: "Венти",
+ 1364984004: "Аргенти",
+ 1369873051: "Альбедо",
+ 1222399228: "Химеко",
+ 8199185983: "Лоча",
+ 7576341592: "Фуга",
+ 5426987140: "Варка",
+ 1316852704: "Аха",
+ 1764269904: "Цзин Юань",
+ 1992416693: "Бутхилл",
+ 1314539668: "Кафка",
+ 1207917053: "Топаз",
+ 5025299829: "Вельт",
+ 991994028: "Авантюрин",
+ 1362425172: "Цифер",
+ 2006013059: "Жуань Мэй",
+ 7794291575: "Стивен Ллойд",
+ 6751720805: "Дотторе",
+ 5260895056: "Фэйсяо",
+ 1438721683: "Бай Чжу",
+}
genshin_roles: list = [
# Мондштадт
diff --git a/middleware/loggers/logs.py b/middleware/loggers/logs.py
index 6cf9a68..126d9f0 100644
--- a/middleware/loggers/logs.py
+++ b/middleware/loggers/logs.py
@@ -81,7 +81,7 @@ class Logger:
# Раздельные логи по уровням
for level_name in ['INFO', 'WARNING', 'ERROR', 'DEBUG', 'CRITICAL']:
logger.add(
- sink=log_dir / f'{level_name.lower()}.log',
+ sink=log_dir / f'{level_name.casefold()}.log',
rotation='10 MB',
retention='7 days',
format=self._log_format,
diff --git a/pyproject.toml b/pyproject.toml
index edf0e94..5f04c00 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -17,8 +17,6 @@ dependencies = [
"aiosqlite (>=0.21.0,<0.22.0)",
"email-validator (>=2.3.0,<3.0.0)",
"apscheduler (>=3.11.0,<4.0.0)",
- "fastapi (>=0.116.1,<0.117.0)",
- "uvicorn (>=0.35.0,<0.36.0)",
]