Files
PrimoAranaraBot/bot/handlers/secret/secret2.py
2025-09-08 16:56:34 +07:00

232 lines
13 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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, FSInputFile
from aiogram.utils.markdown import hide_link
from configs import ID_TO_ROLE
router: Router = Router()
class KnowledgeStates(StatesGroup):
"""Состояния для викторины"""
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: Dict[int, str] = {
1: "Начнем с простого. Уравнение расчета коэффициента анти-магической стали с добавлением углеродно-никилиевой добавки?",
2: "Как зовут малышку, что обитает в лаборатории Дотторе?",
3: "Какое блюдо мы, аранары, любим больше всего? Ты то должен знать наверняка!",
4: "Господин все время, что-то рисует на чертеже, но для чего..? Каков Его следующий ход?",
5: "Брошь Дотторе ужасно интересна… А в чем её особенность? Как она сделана?",
6: "Что самое важное для тебя, дорогой Друг?"
}
ANSWERS: Dict[int, Dict[str, str]] = {
1: {"96h-69ctg30x": "Верно! Основная часть уравнения Логосской Экклесии, вроде бы...", "2x+3": "Кхм.. Кажется все в п̄͠о̶̩р́ͫя̦̚дке? Продолжим!"},
2: {"Эмилия": "Эмилия! Эми! Очень красивое имя! Я помню эту малышку, её принес Дотторе в кро—", "Убийца": "Н̱͞е́̇т̆͝.. Я͔́ н̴ͫе̑͢ х̧ͬоͤ͡т̧̌е̡ͭл̂͞.."},
3: {"Сладости": "ДА! Я ОБОЖАЮ СЛАДОСТИ! Я состою более чем на 26% из глюкозы! Хе-хе-хе!", "Бедренная кость": "О͙̃т̻ͥч͍̺е̛͓т̜̓ #77. П̏͘о̮ͧс̸̪л͔͡е̛̄ с͈̄лͥ͝о̢̲м̮̇а̡̤н̬͜н͙̀ы͓́х̸̭ к͒͡о̆̌с̴̟т̯͒е̱͘й̘͘ п̏̕р̵͂и̉͘ш̙̘е̸̾л̰͢ оͭͅн̽͢."},
4: {"Броня": "Броня? Ари думал это металлическая пижама на вечеринку.. Почему все так сложнооо?(", "F5:С8": "К̻̻̀у̧̺ͥл̯͚̽ьͥ̀̇т̴̵͈ в̡̝̲с͓̦͂е̜͒̀ б̞ͮ̂л̡̝͞и̉ͨ͢ж̲ͭ̕е̡͈̽. О̽͐͘н͕̀͟и̶ͭ с̸͆͠к̵̤̓о̺͔͊р̴͙ͪоͤ̕ͅ н̘̖͠а̲͢й̝͟͝д̠ͯ͘у͚͌̕т̪̼ͯ м̋͢͜ѐ͚̍нͨ̄̕я̵̱. Я̷͚ͦ з̛̉͘н̫͢ͅа̷̦͒юͯͨ. Н̵ͭ͠у̶̯͖ж̢ͯ̇н̜́о̸̜̏ у̞̾͜с̱͋́т̮̚͢а̜̺̑н̨͕͊о̵̋ͅв̛̄̉и̛̜̅т̆͋͑ь̢͐ͥ р̢̼̏а̠ͭ̀с̞ͤ͜т̞̦͜я͙̑͟ж̵̩̖к̩̚͜у̷̩ͣ н̨̈́̽а͕ͮ͟ д̛̬͞в̥ͧͫе̘ͯ̕р̠͖̍и͕͎́.."},
5: {"Аугментум": "Верно! Внутри броши Дотторе, целая карманная лаборатория!", "Серый": "Р̟̀у̠̫н̸̶и̶̇ч̐͒е͎͜с̡̞к̦̉а̶͚я̙̤ м̟̏а̨̏т͕͋р̞ͥи̵̜ц͓̀а̶͠.. Ч͕͕ё͔рͪ̉т̄̕."},
6: {"": "Для меня это тоже важно!", "Истина": "Д̺̎о̦͠б͖̀рͨ͞о̢͝ п͎̕о̩ͯж͙͘а̠͓л̸͈о̗͟в͖̀а̸ͫт̰̏ьͯ͠! Д̷̖р̂͝уͨ́з̡͓ь̼͐я̈́͡!"}
}
@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={})
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)
# ==================== ОБРАБОТЧИКИ ВОПРОСОВ ====================
@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<blockquote>{QUESTIONS[2]}</blockquote>")
await state.set_state(KnowledgeStates.question2)
@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<blockquote>{QUESTIONS[3]}</blockquote>")
await state.set_state(KnowledgeStates.question3)
@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<blockquote>{QUESTIONS[4]}</blockquote>")
await state.set_state(KnowledgeStates.question4)
@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<blockquote>{QUESTIONS[5]}</blockquote>")
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<blockquote>{QUESTIONS[6]}</blockquote>")
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.reply(response_message)
await finish_knowledge_session(message, state)
# ==================== ОБРАБОТЧИК НЕВЕРНЫХ ОТВЕТОВ ====================
@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<blockquote>{QUESTIONS[question_number]}</blockquote>"
)
# ==================== ЗАВЕРШЕНИЕ ====================
# ------------------- Завершение сессии знаний -------------------
@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", {})
if all(answer == 2 for answer in answers.values()):
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.reply_photo(photo=FSInputFile("assets/arsenal_secret2.jpeg"),
caption="""
┏━━━━━━━━━━━━━━━━━━━┓
<i>…От той группы не осталось даже тени. Никаких следов, только пустота, словно их поглотила сама тьма.
Но сканер… сканер выдал странные, тревожные результаты. На их основе можно сделать выводы… выводы, которые лучше бы остались тайной.
Трёхдневные графики активности Омута… они словно шепчут сквозь цифровой шум. Если использовать заражение… если рискнуть… я смогу превратить хаос в новые материалы.
Но для этого нужна новая группа. Свежие люди… на чьих плечах может лечь эта тьма. Придётся… найти их. И отправить.</i>
┗━━━━━━━━━━━━━━━━━━━┛
""")
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")}
Кхʍ.. Знᴀчиᴛ ᴛы <b>{expected_role}</b>? Инᴛᴇᴩᴇᴄнᴏᴇ иʍя, нᴏ нᴀᴄᴛᴏящᴇᴇ ᴧи ᴏнᴏ? Чᴛᴏ ж, ϶ᴛᴏ нᴇ ʙᴀжнᴏ, ᴄᴋᴀжи ʍнᴇ <b>{expected_role}</b>, чᴛᴏ жᴇ ᴛы ʙыбᴩᴀᴧ бы?
Убиᴛь дᴇʙᴏчᴋу, ᴩᴀди ʍиᴩᴀ
Иᴧи убиᴛь ʍиᴩ, ᴩᴀди дᴇʙуɯᴋи?
""")
else:
await message.reply(f"""{hide_link("https://i.pinimg.com/originals/a8/a5/a2/a8a5a29dd1613a48ef0a680e19973ff6.gif")}
Нᴇᴛ, ϶ᴛᴏ нᴇ ᴛы. Тʙᴏᴇ нᴀᴄᴛᴏящᴇᴇ иʍя <b>{expected_role}</b>. Ты ʍнᴇ ʙнᴏʙь ᴄᴏʙᴩᴀᴧ. Инᴛᴇᴩᴇᴄнᴏ, чᴛᴏ ᴛᴇбя ᴨᴏбудиᴧᴏ. Н ϶ᴛᴏ нᴇ ʙᴀжнᴏ, ᴄᴋᴀжи ʍнᴇ <b>{expected_role}</b>, чᴛᴏ жᴇ ᴛы ʙыбᴩᴀᴧ бы?
Убиᴛь дᴇʙᴏчᴋу, ᴩᴀди ʍиᴩᴀ
Иᴧи убиᴛь ʍиᴩ, ᴩᴀди дᴇʙуɯᴋи?
""")
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("<b>Чужой мира сего.</b>")
await state.clear()