Необходимые штуки (релиз 1.0)

Доделать GUI

  1. +Чтобы Катру можно было перемещать по левому клику
  2. +Чтобы правый клик открывал бы меню (как делать коллбеки на эти пункты?)
  3. Собирать меню (системное/дебаговое) по правому клику на основе плагинов и коллбеков
  4. +Сделать базовое окно диалога для текста
  5. +В диалоге текст показывается с анимацией посимвольно
  6. +Анимация (мигание)

Сделать систему плагинов

  1. +Какой-нибудь стандартный формат для API
  2. +Плагины на питоне, каждый цикл пробегать по всем методам on_tick в плагинах
  3. +Сделать on_boot/on_close, который исполняется один раз. on_boot это не init, в init техника, в on_boot поведение - не забывать ожидание после on_close -- start/stop plugin
  4. +Может использовать какой-то сторонний планировщик?

Сделать поведение

  1. +Движок для наложения слоёв
  2. +Слои накладываются с анимацией (периодичность)
  3. +Наложенные слои -- теггировать по именам (файл с конфигурацией эмоций)
  4. +Сделать файл с рандомными фразами
  5. +делать перенос строки
  6. +"Сейчас %(hour24), %(username)." - говорить сколько сейчас время
  7. "Очень важно поддерживать режим." -- разные фразы в зависимости от времени (реализовать в hour_dialogue_plugin)
  8. normalboottalk -- приветствовать в зависимости от времени дня, прощаться - желать хороших снов
  9. +Убрать (пока нет системы настроения) mouth с тэгом bad из рандомной ротации
  10. Ты её гладишь (средняя кнопка мыши, без разницы пока где) -- она улыбается и смотрит на тебя
  11. Несколько вариантов часового диалога
  12. Попросить сфокусировать взгляд на тебе

Общий шаблонизатор строк

  1. +Все строки в одном файле с айдишниками
  2. +Сделать возможность внедрять теги с эмоциями и %username, %hour24 переносом строки
  3. +У каждой строки несколько вариантов
  4. +Шаблонизатор генерирует как эмоцию изменить, что писать текстом и что отправлять в tts -- то есть сейчас отправляет из render_text события в очередь выражений - фильтр face
  5. +У каждого варианта есть опциональные рандомно включаемые варианты -- Сделать рандомными части диалогов. То есть строчка одна, но она может комбинироваться - фильтр optional

Управляемые выражения лица

  1. +Проще не мутить forced выражения лица, а иметь очередь выражений (LIFO). Элементы очереди -- набор нужных слоёв с временем удержания эмоции
  2. +Рендерить слои динамично
  3. +Blink plugin не трогать
  4. +По тику генератор рандомных выражений смотрит чтобы у очереди была всегда величина >=1, если меньше -- добавляет рандомное выражение
  5. +Консумер выражений берёт из очереди выражение (если пуста -- то ничего не делает), применяет open/closed_eyes состояния (если глаза закрыты они совпадают), и делает следующий свой тик исходя из времени
  6. +Если нам нужно зафорсить выражение лица -- мы вызываем прокси-метод, который вызывает tick в плагине

Динамический discovery картинок и сборка выражений из слоёв

  1. +dicovery слоёв (его ключ и значение типа mouth=shut) будет по regex с именованными группами, который будет задан в конффайле
  2. +тот, кто хочет изменить эмоцию, передаёт словарь с этими элементами ключ=значение, и мы их собираем в переданном порядке
  3. +короче, файл с эмоциями. для каждого слоя сделать один или несколько возможных вариантов. будет эмоция random со всеми сочетаниями
  4. +если ты хочешь зафорсить какое-то конкретное выражение лица (например, "смотрит вперёд"), ты указываешь в этом файле ещё одну эмоцию
  5. В теге expr сделать возможность указывать вторым параметром время (строку или число)

Доработать последовательность выхода

  1. +Избавиться от self.w.config['exit_initiated'], пусть каждый плагин сам себе ставит этот флаг, если ему нужно
  2. +dialogue: on_exit ставит флаг внутри плагина, если диалог есть -- он сразу закрывается, открывается диалог с прощанием, после рендера он готов закрываться
  3. +voice: on_exit ставит флаг внутри плагина, если сейчас есть активный tts, он останавливается, говорится диалог с прощанием, после окончания он готов закрываться

Технические штуки

  1. +Сделать папку с плагинами
  2. +Сделать наследование плагинов (конфиг, self.w, tick с зацикленностью)
  3. +Сделать динамическую инициализацию, но писать __all__ = [], чтобы можно было задавать порядок без заморочек с зависимостями -- к чёрту порядок, пусть через очереди общаются
  4. +Чтобы можно было обращаться к экземпляру класса плагина напрямую (ссылка на экземляр где-то хранилась)
  5. +наверное плагины говорения будут через очередь передавать диалоги на плагин отображения, очередь тоже в global state
  6. +нужно сделать on_start, который бы запускал плагины (в частности expr_prod) после инициализации всех плагинов
  7. +Делать strip() от диалога, и если он пустой, то ничего не выводить (мб мы хотим только поменять эмоцию)
  8. +Сделать общий диспетчер сигналов
  9. Чтобы voice plugin мог по сигналу обрывать tts (попробовать вернуть его в общий цикл со своего потока)

Технические костыли:

  1. Как поддерживать выражение лица? Можно ставить очень долгий таймер, а потом его сбрасывать
  2. Свой фильтр optional не нужен, потому что есть random от списка с фразой и пустой строкой

Рефакторинг конфигурации

  1. Сделать одну папку для конфигов в yaml, из которой бы они все автоматически загружались и объединялись в один
  2. Отдельный yaml с значениями, которые бесполезно перезагружать динамически. Остальное проверить что реально будет обновляться
  3. Динамический (по команде) релоад конфига и файла со строками
  4. Объединять конфигурацию на основе плагинов, которые её используют

Помодоро

  1. Из yaml подгружаем настройки: время работы/отдыха/количество перед большим/длительность большого
  2. Включаем помодоро -- идёт отсчёт рабочего. Мы можем сделать/отменить перерыв (таймер в 0), добавить/вычесть 5
  3. *Рабочий таймер, прежде чем начаться, отслеживает активность мыши/клавиатуры
  4. *Во время рабочего промежутка вайтлистим окна, по остальным Катра начинает делать замечание
  5. Где-то в углу (изображения Катры, не диалога) отображается таймер. Можно выбирать проценты или время
  6. Срабатывание таймера -- сначала звуковой эффект (разные, задаются в настройках, взять из eyes relax), потом Катра говорит об этом

Крутые штуки (дальше)

Более сложный gui

  1. Клик по диалогу закрывает его
  2. Двойной клик по Катре -- диалог с пунктами меню (которые собирается на основе плагинов)
  3. Сделать окно диалога (которые собирается на основе плагинов), он будет единый для диалога по дабл-клик
  4. То есть Катра может начинать диалоги с вариантами ответов и ветвлением
  5. Не делать бесполезные окна с конфигурацией, пусть лучше Катра показывает какие конфиги есть и открывает их в блокноте, и перезагружает их после

Барьер

  1. Сделать "барьер" -- словарь с семафорами, в который плагины будут писать по готовности начать рендер -- чтобы голос/текст/выражение лица стартовали синхронно
  2. При старте все будут false. Это будет не динамический словарь, мы его элементы будем задавать в main
  3. Если плагин готов начать отрисовку, то он ставит свой флаг в true и с малой задержкой начинает ждать в цикле проверять готовность остальных
  4. Когда мы полностью отрисуем всё, и будем готовы сбрасываться при новом диалоге, компоненты будут устанавливать свой флаг в false

Неясно насколько нужные технические штуки

  1. Сейчас у нас dialogue_plugin диспатчит по другим очередям, можно делать on_dialogue во всех плагинах, и чтобы они добавляли в свои очереди, и сразу воспроизводили типа
  2. Реализовать (когда будет потребность) чтобы можно было символами и голосом разное содержимое воспроизводить
  3. Возможность менять эмоции посреди диалога: передавать в dialogue_plugin в очереди dialogue_queue строку с управляющими символами и массив с эмоциями, чтобы при iter если эмоция, то dialogue_plugin пушил бы её
  4. Можно передавать в шаблонизаторе какой-то свой набор слоёв вместо заранее заданного (фильтр raw_expr?)

Возможности

  1. +Синтез голоса
  2. Чтобы она говорила идти тренироваться, спрашивала результаты и вела дневник
  3. Чтобы можно было рассказать ей про свой режим, и она бы помогала поддерживать его
  4. Чтобы она что-то делала (читала, следила за тобой)
  5. чтобы она периодически спрашивала настроение и выбирала соотв фразы -- поддерживающие, мотивирующие
  6. Чтобы у неё было своё настроение (выбор эмоции был бы не случайным), и ты бы его типа менял своими действиями
  7. Когда наводишь на неё мышку, она в любом случае начинает смотреть на тебя и улыбаться, типа ты можешь захватить внимание
  8. Система настроения -- можно повышать например "гладя по голове" (средняя кнопка мыши), то есть это уже регионы тела как в shimeji
  9. Портит настроение если что-то делать неправильно (сидеть ночью, например) или
  10. Попробовать ещё раз сделать захват заголовков активных окон и реакцию на них
  11. Локальное хранилище sqlite с синхронизацией через яндекс-диск
  12. Чтобы Катра могла чем-то заниматься. Хоть книгу читать (сделать background просто как первый слой наложения)
  13. Слушай, а пусть она мне рандомную картинку показывает иногда из папки с мемами
  14. Вообще если честно, то я хочу иметь возможность испортить ей настроение, сделать больно, неприятно, разозлить, обидеть
  15. Спрашивать её да/нет/может быть etc - на простых вероятностях
  16. Игры с Катрой (https://www.tutorialspoint.com/artificial_intelligence_with_python/artificial_intelligence_with_python_gaming.htm) от текстовых до крестиков-ноликов
  17. Можно попробовать взаимодействовать с Replika API через затравку диалога?
  18. Одежда?
  19. Чтобы она могла блокировать веб-сайты как-то, отключать компьютер, типа focus mode во время pomodoro
  20. говорить сколько осталось до сна вместе с тем сколько часов
  21. horny/emegrency mode
  22. При старте она бы показывала чеклист с какими-то вещами (принципами), чтобы я не забывал про них

Вообще подумай, что ты можешь сделать логичным, при этом рандомным?

  1. Смена эмоций на лице, моргание
  2. Влияние событий (добавлять какой-то шум, чтобы поведение не было 100% детерминировано)
  3. Рандомные фразы (и диалоги). Комбинирование частей фразы.
  4. Чтобы она что-то делала сама
  5. Чтобы она рандомно просила тебе отдохнуть пару минут во время таймера помодоро, останавливала бы таймер

Интересные идеи

  1. Катра -- кошка. Кошки боятся собак, гоняются за мышами, любят сидеть в коробках, ещё просят часто чтобы их покормили и куда-то выпустили
  2. Ещё кошки мурчат, шипят, если очень злые -- воят. Ещё они иногда хотят играть и ласки.
  3. Кошки балдеют от кошачьей мяты и валерьянки
  4. Кошки следят за птицами
  5. Кошки умываются, вылизывая себя