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

132 lines
5.6 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 бот для отслеживания игроков
3. **LichessWebView** - Веб-интерфейс для просмотра пользователей и игроков
## Структура базы данных
### Таблицы
#### 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)
- **lichess-web-view**: Веб-интерфейс на порту 5000
База данных монтируется как bind mount: `./LichessClientTG_bot/data:/app/data`
## Безопасность
- Токены Lichess API хранятся в базе данных и используются только для запросов к Lichess
- Веб-интерфейс работает **без пароля** - доступен всем кто знает URL
- Telegram бот токен хранится в `config.py` (можно вынести в `.env`)