diff --git a/bot/handlers/messages/default_msg.py b/bot/handlers/messages/default_msg.py new file mode 100644 index 0000000..23f0f4a --- /dev/null +++ b/bot/handlers/messages/default_msg.py @@ -0,0 +1,242 @@ +""" +Триггер-хэндлер: реагирует на обращения к Лайле с именем персонажа. +Формат: "Лайла [что угодно] [имя или псевдоним]" +""" +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