LichessStatTgWeb/docs/ARCHITECTURE.md
vrubelroman e8ced9bca7 Добавлена документация и скрипты для работы с БД
- Удалены лишние .gitignore из подпапок (теперь один общий в корне)
- Добавлен import_db.sh для импорта базы данных
- Создана документация: docs/ARCHITECTURE.md для разработчиков
- Создана документация: docs/USER_GUIDE.md для пользователей
- Обновлен .gitignore для исключения временных файлов
2025-10-28 21:38:10 +03:00

5.6 KiB
Raw Blame History

Архитектура проекта Lichess Statistics Ecosystem

Обзор проекта

Проект состоит из трех основных компонентов:

  1. LichessWebServices - REST API для получения статистики с Lichess
  2. LichessClientTG_bot - Telegram бот для отслеживания игроков
  3. LichessWebView - Веб-интерфейс для просмотра пользователей и игроков

Структура базы данных

Таблицы

telegram_users

Хранит информацию о пользователях Telegram бота.

CREATE TABLE telegram_users (
    user_id INTEGER PRIMARY KEY,      -- ID пользователя в Telegram
    username TEXT,                     -- @username
    first_name TEXT,                   -- Имя
    last_name TEXT,                    -- Фамилия
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

gamers

Хранит информацию о игроках Lichess (уникальные).

CREATE TABLE gamers (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username TEXT UNIQUE NOT NULL,    -- Username на Lichess
    token TEXT,                        -- DEPRECATED: старый глобальный токен
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Важно: Поле token в таблице gamers больше не используется. Токены хранятся в user_gamers.

user_gamers

Связывает пользователей Telegram с игроками Lichess. Хранит индивидуальные настройки.

CREATE TABLE user_gamers (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER NOT NULL,         -- ID пользователя Telegram
    gamer_id INTEGER NOT NULL,         -- ID игрока Lichess
    token TEXT,                        -- Lichess API token для этого пользователя+игрока
    is_active BOOLEAN DEFAULT FALSE,    -- Активен ли игрок для пользователя
    period_minutes INTEGER DEFAULT 0,  -- Период уведомлений (0 = отключено)
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES telegram_users(user_id),
    FOREIGN KEY (gamer_id) REFERENCES gamers(id),
    UNIQUE(user_id, gamer_id)
);

Ключевая особенность

Один пользователь может отслеживать несколько игроков, и у каждого пользователя свой активный игрок. Токены хранятся отдельно для каждой пары пользователь-игрок.

Поток данных

1. Добавление игрока (/adduser)

Пользователь → /adduser → Ввод токена → Ввод username → 
  database.add_gamer(username) → database.add_user_gamer(user_id, gamer_id, token)

2. Получение статистики (/today, /yesterday, /week)

Пользователь → /today → database.get_user_active_gamer(user_id) → 
  lichess_api.get_stats(username, token) → Отправка в Telegram

3. Периодические уведомления

Периодическая задача → database.get_all_gamers_with_periods() → 
  Для каждой пары (user_id, gamer_id): 
    lichess_api.get_stats(username, token из user_gamers) → 
    Проверка изменений → Отправка уведомления

Миграция токенов

При старте бота автоматически запускается _migrate_tokens_from_gamers():

  1. Проверяет есть ли токены в gamers.token
  2. Если есть и их нет в user_gamers.token, переносит их
  3. Логирует сколько токенов перенесено

Это нужно для перехода со старой схемы (глобальный токен) на новую (токен на пару).

API Endpoints

Lichess Web Services

  • GET /api/user_ratings/{username} - Получить рейтинги игрока
  • GET /api/user_stats/{username}?start_date={date}&end_date={date}&token={token} - Статистика за период
  • GET /health - Health check

Команды бота

  • /start - Приветствие и регистрация пользователя
  • /adduser - Добавить игрока для отслеживания
  • /getgamers - Выбрать активного игрока
  • /today - Статистика за сегодня
  • /yesterday - Статистика за вчера
  • /week - Статистика за неделю
  • /setperiod - Настроить периодические уведомления

Docker Compose

Все три сервиса запускаются через единый docker-compose.yml:

  • lichess-api: API на порту 8001
  • lichess-telegram-bot: Бот (host network)
  • lichess-web-view: Веб-интерфейс на порту 5000

База данных монтируется как bind mount: ./LichessClientTG_bot/data:/app/data

Безопасность

  • Токены Lichess API хранятся в базе данных и используются только для запросов к Lichess
  • Веб-интерфейс работает без пароля - доступен всем кто знает URL
  • Telegram бот токен хранится в config.py (можно вынести в .env)