LichessStatTgWeb/docs/ARCHITECTURE.md
vrubelroman 75e62b57a1
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 43s
remove admin web panel (LichessWebView) from the project
Unused component that also carried several security issues (default
admin credentials, hardcoded Flask secret key, debug mode, plaintext
passwords). Cleaned up compose files, CI/CD pipeline, and docs
accordingly; also dropped the stale IS_PROD config docs in favor of
the current .env-based setup.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-02 18:32:06 +00:00

5.3 KiB
Raw Permalink Blame History

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

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

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

  1. LichessWebServices - REST API для получения статистики с Lichess
  2. LichessClientTG_bot - Telegram бот для отслеживания игроков

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

Таблицы

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)

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

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

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