- Удалены лишние .gitignore из подпапок (теперь один общий в корне) - Добавлен import_db.sh для импорта базы данных - Создана документация: docs/ARCHITECTURE.md для разработчиков - Создана документация: docs/USER_GUIDE.md для пользователей - Обновлен .gitignore для исключения временных файлов
5.6 KiB
Архитектура проекта Lichess Statistics Ecosystem
Обзор проекта
Проект состоит из трех основных компонентов:
- LichessWebServices - REST API для получения статистики с Lichess
- LichessClientTG_bot - Telegram бот для отслеживания игроков
- 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():
- Проверяет есть ли токены в
gamers.token - Если есть и их нет в
user_gamers.token, переносит их - Логирует сколько токенов перенесено
Это нужно для перехода со старой схемы (глобальный токен) на новую (токен на пару).
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)