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

129 lines
5.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Архитектура проекта Lichess Statistics Ecosystem
## Обзор проекта
Проект состоит из двух основных компонентов:
1. **LichessWebServices** - REST API для получения статистики с Lichess
2. **LichessClientTG_bot** - Telegram бот для отслеживания игроков
## Структура базы данных
### Таблицы
#### telegram_users
Хранит информацию о пользователях Telegram бота.
```sql
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 (уникальные).
```sql
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. Хранит индивидуальные настройки.
```sql
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`)