243 lines
13 KiB
Python
243 lines
13 KiB
Python
"""
|
||
Триггер-хэндлер: реагирует на обращения к Лайле с именем персонажа.
|
||
Формат: "Лайла [что угодно] [имя или псевдоним]"
|
||
"""
|
||
from typing import Dict, Optional
|
||
import random
|
||
|
||
from aiogram import Router
|
||
from aiogram.types import Message
|
||
|
||
__all__ = ("router",)
|
||
router: Router = Router(name="triggers_router")
|
||
|
||
|
||
CHARACTERS: Dict[str, Dict] = {
|
||
"эвелин": {
|
||
"aliases": ["эвелин", "эва", "эви"],
|
||
"answers": [
|
||
"Эвелин умеет молчать так, что хочется говорить.",
|
||
"Эва всегда знает больше, чем говорит. Это немного пугает.",
|
||
"С ней рядом становится спокойно. Не знаю почему.",
|
||
"Интересно, о чём она думает в тишине...",
|
||
"Эвелин тихая снаружи. Но внутри — целый ураган, я уверена.",
|
||
],
|
||
},
|
||
"лео": {
|
||
"aliases": ["лео", "лёва", "лёня"],
|
||
"answers": [
|
||
"Лео громкий, яркий и немного безрассудный. Мне нравится!",
|
||
"Он смеётся первым и уходит последним. Настоящий.",
|
||
"Лео всегда найдёт повод для праздника, даже если его нет.",
|
||
"Кажется, он боится тишины. Поэтому и заполняет её собой.",
|
||
"За его смехом прячется что-то очень серьёзное...",
|
||
],
|
||
},
|
||
"маркус": {
|
||
"aliases": ["маркус", "марк"],
|
||
"answers": [
|
||
"Маркус говорит мало, но каждое слово весит.",
|
||
"Он из тех, кто держит слово даже когда это неудобно.",
|
||
"С Маркусом не поспоришь. Не потому что нельзя — просто незачем.",
|
||
"Он смотрит так, будто видит тебя насквозь. Немного жутковато.",
|
||
"Маркус — тот, на кого можно положиться в самый плохой день.",
|
||
],
|
||
},
|
||
"мари": {
|
||
"aliases": ["мари", "маришка", "мариша"],
|
||
"answers": [
|
||
"Мари — это как утренний свет. Мягко и неожиданно тепло.",
|
||
"Она помнит мелочи, которые другие не замечают. Это её суперсила.",
|
||
"С Мари любой разговор становится важным.",
|
||
"Она улыбается даже когда грустно. Не притворяется — просто верит.",
|
||
"Мари умеет прощать. Это редкость.",
|
||
],
|
||
},
|
||
"либе": {
|
||
"aliases": ["либе", "либ"],
|
||
"answers": [
|
||
"Либе... имя звучит как песня на незнакомом языке.",
|
||
"Она всегда чуть в стороне, но именно к ней тянутся люди.",
|
||
"Либе видит красоту там, где другие видят хаос.",
|
||
"Она не объясняет себя. И не должна.",
|
||
"С Либе можно молчать — и это не будет неловко.",
|
||
],
|
||
},
|
||
"мотциэль": {
|
||
"aliases": ["мотциэль", "мотц", "моц"],
|
||
"answers": [
|
||
"Мотциэль... даже имя звучит как заклинание.",
|
||
"Он существует между мирами. Буквально.",
|
||
"Спрашивать его о прошлом — плохая идея. Очень плохая.",
|
||
"Мотциэль помнит вещи, которых не было. Или были?",
|
||
"Его глаза смотрят в разные эпохи одновременно.",
|
||
],
|
||
},
|
||
"виктор": {
|
||
"aliases": ["виктор", "вик", "витя"],
|
||
"answers": [
|
||
"Виктор всегда побеждает. Это в имени.",
|
||
"Он не злой. Просто у него другая шкала ценностей.",
|
||
"Виктор говорит правду даже когда это больно. Особенно когда больно.",
|
||
"Не стоит играть с ним в слова — проиграешь.",
|
||
"За его холодностью — старая-старая усталость.",
|
||
],
|
||
},
|
||
"кситти": {
|
||
"aliases": ["кситти", "кси", "ксит"],
|
||
"answers": [
|
||
"Кситти — маленький хаос в красивой упаковке.",
|
||
"Она никогда не делает то, что от неё ожидают. Никогда.",
|
||
"С Кситти скучно не бывает. Опасно — бывает. Скучно — нет.",
|
||
"Она собирает странные вещи и странных людей.",
|
||
"Кситти смеётся над правилами. Потому что сама их придумывает.",
|
||
],
|
||
},
|
||
"кадфаль": {
|
||
"aliases": ["кадфаль", "кад", "кадф"],
|
||
"answers": [
|
||
"Кадфаль несёт что-то древнее в каждом шаге.",
|
||
"Он не торопится. У него другое ощущение времени.",
|
||
"Кадфаль знает цену словам — поэтому тратит их редко.",
|
||
"В его присутствии хочется стоять прямо.",
|
||
"Он видел многое. Слишком многое для одной жизни.",
|
||
],
|
||
},
|
||
"вайш": {
|
||
"aliases": ["вайш", "вай"],
|
||
"answers": [
|
||
"Вайш появляется неожиданно и исчезает так же.",
|
||
"Её след — это вопросы без ответов.",
|
||
"Вайш знает что-то, что тебе лучше не знать.",
|
||
"Она не объясняет своих решений. Просто делает.",
|
||
"С Вайш никогда не знаешь, друг она или нет.",
|
||
],
|
||
},
|
||
"скаф": {
|
||
"aliases": ["скаф"],
|
||
"answers": [
|
||
"Скаф — имя, которое не забывается.",
|
||
"Он работает в тени. Не потому что боится света — просто так удобнее.",
|
||
"Скаф знает цену всему. Буквально всему.",
|
||
"Его нельзя купить. Его можно только нанять. Это разница.",
|
||
"Те, кто встречал Скафа, редко рассказывают об этом дважды.",
|
||
],
|
||
},
|
||
"куарти": {
|
||
"aliases": ["куарти", "куар"],
|
||
"answers": [
|
||
"Куарти — четыре буквы и миллион вопросов.",
|
||
"Он улыбается, когда другие нервничают. Это не успокаивает.",
|
||
"Куарти коллекционирует долги. Чужие.",
|
||
"Говорят, он никогда не проигрывает. Говорят.",
|
||
"Куарти появляется именно тогда, когда тебе нужна помощь. И это не случайно.",
|
||
],
|
||
},
|
||
"саэрин": {
|
||
"aliases": ["саэрин", "саэ", "сэрин"],
|
||
"answers": [
|
||
"Саэрин — как туман. Красиво и немного опасно.",
|
||
"Она говорит загадками не потому что хочет запутать — просто иначе не умеет.",
|
||
"Саэрин помнит всё, что ей говорят. Всё.",
|
||
"Её спокойствие пугает больше, чем чужой гнев.",
|
||
"Саэрин выбирает слова как оружие — точно и без лишнего.",
|
||
],
|
||
},
|
||
"котики": {
|
||
"aliases": ["котики", "котик", "кот", "кошка"],
|
||
"answers": [
|
||
"Котики — это лучшее, что есть в этом мире. Без обсуждений.",
|
||
"Котик сел на тебя — ты избран.",
|
||
"Кот смотрит на тебя и думает что-то важное. Наверное.",
|
||
"Котики всегда правы. Это научный факт.",
|
||
"Маленький тёплый комочек счастья. Что ещё нужно?",
|
||
],
|
||
},
|
||
"нотик": {
|
||
"aliases": ["нотик", "нота", "нотка"],
|
||
"answers": [
|
||
"Нотик! Звучит как маленькая музыкальная нота! 🎵",
|
||
"Нотик — тот, кто приносит мелодию туда, где её не хватает.",
|
||
"Маленький, но важный. Как все хорошие вещи.",
|
||
"Нотик — это и ласково, и загадочно одновременно.",
|
||
"Из таких маленьких нотиков складываются большие истории.",
|
||
],
|
||
},
|
||
"илья": {
|
||
"aliases": ["илья", "илюха", "илюша"],
|
||
"answers": [
|
||
"Илья — имя с характером. Твёрдое и живое.",
|
||
"Илья всегда знает что делать. Или уверенно делает вид.",
|
||
"С Ильёй легко — он не усложняет лишнего.",
|
||
"Он из тех, кто сделает, а потом расскажет. Не наоборот.",
|
||
"Илья редко жалуется. Чаще просто решает.",
|
||
],
|
||
},
|
||
"ина": {
|
||
"aliases": ["ина", "инка", "инуля"],
|
||
"answers": [
|
||
"Ина — короткое имя, за которым много всего.",
|
||
"Она тихая, но запоминается.",
|
||
"Ина умеет слушать так, что хочется говорить.",
|
||
"В ней есть что-то очень своё, неповторимое.",
|
||
"Ина — как маленький огонёк. Незаметный, но греет.",
|
||
],
|
||
},
|
||
"абсцисс": {
|
||
"aliases": ["абсцисс", "абс"],
|
||
"answers": [
|
||
"Абсцисс! Это математика или имя? Хи-хи!",
|
||
"Ось абсцисс — горизонталь жизни. Всё движется по ней.",
|
||
"Абсцисс звучит как заклинание из учебника.",
|
||
"Кто-то мечтает о приключениях, а кто-то — об осях координат!",
|
||
"Абсцисс и ордината. Звучит как имена двух загадочных персонажей!",
|
||
],
|
||
},
|
||
}
|
||
|
||
# Имена, на которые Лайла откликается
|
||
LAYLA_NAMES = ["лайла", "лайл", "лая"]
|
||
|
||
|
||
def find_character_answer(text: str) -> Optional[str]:
|
||
"""
|
||
Проверяет:
|
||
1. Есть ли в тексте обращение к Лайле
|
||
2. Есть ли имя персонажа
|
||
|
||
Возвращает случайный ответ или None.
|
||
"""
|
||
text_lower = text.lower()
|
||
|
||
# Проверяем обращение к Лайле
|
||
if not any(name in text_lower for name in LAYLA_NAMES):
|
||
return None
|
||
|
||
# Ищем персонажа
|
||
for character, data in CHARACTERS.items():
|
||
for alias in data["aliases"]:
|
||
if alias in text_lower:
|
||
return random.choice(data["answers"])
|
||
|
||
return None
|
||
|
||
|
||
@router.message()
|
||
async def handle_triggers(message: Message) -> None:
|
||
"""
|
||
Реагирует только если:
|
||
- Сообщение от живого человека
|
||
- В тексте есть обращение к Лайле
|
||
- В тексте есть имя персонажа
|
||
|
||
На всё остальное — молчит.
|
||
"""
|
||
#if not message.text or not message.from_user or message.from_user.is_bot:
|
||
#return
|
||
|
||
#response = find_character_answer(message.text)
|
||
|
||
#if response:
|
||
#await message.reply(response)
|
||
return
|