@@ -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 <blockquote> { QUESTIONS [ 2 ] } </blockquote> " )
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 <blockquote> { QUESTIONS [ 3 ] } </blockquote> " )
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 <blockquote> { QUESTIONS [ 4 ] } </blockquote> " )
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 <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 . 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 <blockquote> { QUESTIONS [ question_number ] } </blockquote> "
)
@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 = """
┏━━━━━━━━━━━━━━━━━━━┓
<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 ( )