feat: entity relationship refactor — notification trackers, command system, chat actions

Rework entity schema: rename Tracker→NotificationTracker, add CommandConfig/
CommandTracker/CommandTrackerListener entities for decoupled command handling.
Commands now resolve through CommandTracker→CommandConfig instead of
TelegramBot.commands_config. Smart ref-counted bot polling based on active
listeners. Add chat_action to telegram targets. Full frontend CRUD pages
for command configs and command trackers. Idempotent SQLite migrations.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-21 01:27:20 +03:00
parent 0dcca2fbe6
commit 1d445f3980
34 changed files with 2777 additions and 582 deletions
+59 -5
View File
@@ -6,11 +6,13 @@
"nav": {
"dashboard": "Главная",
"providers": "Провайдеры",
"trackers": "Трекеры",
"notificationTrackers": "Трекеры увед.",
"trackingConfigs": "Отслеживание",
"templateConfigs": "Шаблоны",
"telegramBots": "Боты",
"targets": "Получатели",
"commandConfigs": "Конф. команд",
"commandTrackers": "Трекеры команд",
"users": "Пользователи",
"settings": "Настройки",
"logout": "Выход"
@@ -93,8 +95,8 @@
"testAndSave": "Проверить и сохранить",
"saveWithoutTest": "Сохранить без проверки"
},
"trackers": {
"title": "Трекеры",
"notificationTracker": {
"title": "Трекеры уведомлений",
"description": "Отслеживание изменений в альбомах",
"newTracker": "Новый трекер",
"cancel": "Отмена",
@@ -198,7 +200,9 @@
"maxAssetSize": "Макс. размер файла (МБ)",
"videoWarning": "Предупреждение о размере видео",
"disableUrlPreview": "Отключить превью ссылок",
"sendLargeAsDocuments": "Отправлять большие фото как документы"
"sendLargeAsDocuments": "Отправлять большие фото как документы",
"chatAction": "Действие в чате",
"chatActionNone": "Нет (без действия)"
},
"users": {
"title": "Пользователи",
@@ -474,6 +478,47 @@
"botLocale": "Язык описаний команд в меню Telegram и ответов бота.",
"rateLimits": "Кулдаун в секундах между использованиями команд в каждом чате. 0 = без ограничений."
},
"commandConfig": {
"title": "Конфигурации команд",
"description": "Настройки команд для взаимодействия с Telegram-ботами",
"newConfig": "Новая конфигурация",
"name": "Название",
"namePlaceholder": "Команды по умолчанию",
"providerType": "Тип провайдера",
"enabledCommands": "Включённые команды",
"locale": "Язык",
"responseMode": "Режим ответа",
"modeMedia": "Медиа (фото)",
"modeText": "Только текст",
"defaultCount": "Кол-во по умолчанию",
"rateLimits": "Ограничения частоты",
"searchCooldown": "Кулдаун поиска (с)",
"defaultCooldown": "Кулдаун по умолчанию (с)",
"noConfigs": "Конфигураций команд пока нет.",
"confirmDelete": "Удалить эту конфигурацию команд?",
"commands": "команд"
},
"commandTracker": {
"title": "Трекеры команд",
"description": "Управление трекерами команд и их слушателями",
"newTracker": "Новый трекер",
"name": "Название",
"namePlaceholder": "Семейные команды",
"provider": "Провайдер",
"selectProvider": "Выберите провайдер...",
"commandConfig": "Конфигурация команд",
"selectCommandConfig": "Выберите конфигурацию...",
"listeners": "Слушатели",
"addListener": "Добавить слушателя",
"removeListener": "Удалить",
"noTrackers": "Трекеров команд пока нет.",
"confirmDelete": "Удалить этот трекер команд?",
"enabled": "Включён",
"disabled": "Отключён",
"noListeners": "Нет подключённых слушателей.",
"selectBot": "Выберите бота...",
"listenerType": "telegram_bot"
},
"snackbar": {
"showDetails": "Показать детали",
"hideDetails": "Скрыть детали"
@@ -504,7 +549,16 @@
"commandsSynced": "Команды синхронизированы с Telegram",
"targetLinked": "Получатель привязан",
"targetUnlinked": "Получатель отвязан",
"botUpdated": "Бот обновлён"
"botUpdated": "Бот обновлён",
"commandConfigSaved": "Конфигурация команд сохранена",
"commandConfigDeleted": "Конфигурация команд удалена",
"commandTrackerCreated": "Трекер команд создан",
"commandTrackerUpdated": "Трекер команд обновлён",
"commandTrackerDeleted": "Трекер команд удалён",
"commandTrackerEnabled": "Трекер команд включён",
"commandTrackerDisabled": "Трекер команд отключён",
"listenerAdded": "Слушатель добавлен",
"listenerRemoved": "Слушатель удалён"
},
"common": {
"loading": "Загрузка...",