This commit is contained in:
2025-09-08 16:56:34 +07:00
parent 0f05fc8455
commit a92d130502
15 changed files with 420 additions and 358 deletions

View File

@@ -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:

View File

@@ -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"""

View File

@@ -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,
)

View File

@@ -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:
"""Обработчик секретов"""

View File

@@ -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()

View File

@@ -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():