|
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 12s
The bot's request_queue.py 4s FIFO gate wasn't protecting against Lichess's rate limiter — that's already handled downstream in LichessWebServices/ rate_limiter.py (0.2s, shared across all callers of our stats service). The bot-side gate only paced calls to our own local service, and since it awaited each request to full completion before dequeuing the next, real dispatch gaps were max(4s, previous request's duration) — with 454 tracked gamer/user pairs, any burst (e.g. after a restart) piled into the queue and took 10-20+ minutes to drain. Replace it with a paced-dispatch + bounded-concurrency design: a hard 2s floor between dispatches (still never lets 2+ requests through in that window), decoupled from completion time, with up to 10 requests actually in flight at once via a semaphore. Doesn't touch the real Lichess-facing rate limit at all. Also add deterministic per-(user,gamer) checkpoint jitter: previously every pair sharing the same period_minutes re-locked onto the same wall-clock phase on every restart (backlog collapse snaps period_end_approx to `now` for everyone overdue at once), recreating the pileup each time. Jitter is stable across restarts (crc32-based, not Python's salted hash()) and capped well under the 2h stale-backlog threshold. Small startup stagger added too, purely cosmetic smoothing on top of the jitter fix. |
||
|---|---|---|
| .forgejo/workflows | ||
| docs | ||
| LichessClientTG_bot | ||
| LichessWebServices | ||
| .env.example | ||
| .gitattributes | ||
| .gitignore | ||
| about.md | ||
| analyze_notifications.py | ||
| CHANGELOG.md | ||
| check_recent_games.py | ||
| check_today_activity.py | ||
| docker-compose.prod.yml | ||
| docker-compose.yml | ||
| export_db.sh | ||
| import_db.sh | ||
| logs.sh | ||
| README.md | ||
| start.sh | ||
Lichess Statistics Ecosystem
Полнофункциональная система для отслеживания статистики игроков Lichess.org с Telegram ботом.
🎯 Описание проекта
Система состоит из двух взаимосвязанных компонентов:
- LichessWebServices - REST API для получения статистики игроков Lichess
- LichessClientTG_bot - Telegram бот для управления подписками и уведомлений
🏗️ Архитектура
┌─────────────────────────────────────────────────────────────┐
│ Telegram Users │
│ │
│ ┌────────────────────────────────────────────────────┐ │
│ │ LichessClientTG_bot │ │
│ │ (Управление подписками, уведомления) │ │
│ └────────┬───────────────────────────────────────────┘ │
│ │ │
│ ┌────────▼───────────┐ │
│ │ LichessWebServices │ │
│ │ │ │
│ │ REST API для │ │
│ │ получения │ │
│ │ статистики │ │
│ └────────┬────────────┘ │
│ │ │
└───────────┼──────────────────────────────────────────────┘
│
▼
┌───────────────┐
│ Lichess API │
└───────────────┘
🚀 Быстрый старт
Установка и запуск
# Клонируем репозиторий
git clone https://github.com/vrubelroman/LichessStatTgWeb.git
cd LichessStatTgWeb
# Запускаем все сервисы
./start.sh
Скрипт start.sh запустит все контейнеры в правильном порядке.
Доступные сервисы
После запуска доступны:
- API документация: http://localhost:8001/docs
- Telegram бот: работает в фоне
📦 Структура проекта
LichessStatTgWeb/
├── LichessWebServices/ # REST API сервис
│ ├── main.py # FastAPI приложение
│ ├── stats_service.py # Логика обработки статистики
│ ├── lichess_client.py # Клиент для Lichess API
│ └── models.py # Pydantic модели
│
├── LichessClientTG_bot/ # Telegram бот
│ ├── bot.py # Основная логика бота
│ ├── database.py # Работа с БД
│ ├── lichess_api.py # API клиент
│ ├── formatters.py # Форматирование ответов
│ └── config.py # Конфигурация
│
├── docker-compose.yml # Общая конфигурация контейнеров
├── start.sh # Скрипт запуска всех сервисов
└── README.md # Этот файл
🔧 Компоненты
1. LichessWebServices (API)
REST API для получения статистики игроков Lichess.
Возможности:
- Статистика за сегодня/вчера/неделю
- Статистика игр по режимам (Bullet, Blitz, Rapid)
- Статистика решения задач (puzzles)
- Получение игр за произвольный период
Endpoints:
GET /stats/{username}/today- статистика за сегодняGET /stats/{username}/yesterday- статистика за вчераGET /stats/{username}/week- статистика за неделюGET /games/{username}/period- игры за периодGET /puzzle/period- задачи за период (требует токен)
2. LichessClientTG_bot (Telegram бот)
Telegram бот для управления отслеживанием игроков Lichess.
Возможности:
- Добавление игроков для отслеживания (друзья, соперники, ученики)
- Выбор активного игрока
- Получение статистики по всем отслеживаемым игрокам (сегодня/вчера/неделя)
- Статистика за последний год или последние 1000 рейтинговых игр
- Статистика по режимам (Bullet, Blitz, Rapid, Classical, Correspondence)
- Статистика решения задач (puzzles)
- Настройка периодических уведомлений с гибкими интервалами (15 минут - 24 часа)
- Информативные сообщения о процессе обработки запросов
- Каждый пользователь имеет свой набор игроков
- Версионность бота (отображается в команде /support)
- Многоязычная поддержка: Русский и английский языки с автоматическим определением и ручным выбором через
/set_lang - Очередь запросов: Автоматическая задержка 7 секунд между запросами к Lichess API для периодических уведомлений
Команды:
/start- начало работы с ботом и добавление первого игрока/addgamer- добавить игрока Lichess (только имя пользователя)/addtoken- добавить игрока с токеном (для статистики по задачам)/getgamers- выбрать активного игрока/delgamer- удалить игрока из списка/today- статистика за сегодня по всем отслеживаемым игрокам с активностью/yesterday- статистика за вчера по всем отслеживаемым игрокам с активностью/week- статистика за неделю по всем отслеживаемым игрокам с активностью/lastYear_or_1000games- статистика за последний год или последние 1000 рейтинговых игр (по всем игрокам с активностью)/setperiod- настроить периодические уведомления для активного игрока/set_lang- выбрать язык бота (🇬🇧 English / 🇷🇺 Русский)/support- контактная информация для обратной связи с разработчиком
Подробнее о боте: см. about.md
🗄️ База данных
Система использует SQLite базу данных с таблицами:
telegram_users- пользователи Telegramgamers- игроки Lichessuser_gamers- связь пользователей с игроками и настройки
Структура:
- Каждый пользователь видит только своих игроков
- У каждого пользователя свой активный игрок
- Период отслеживания привязывается к паре пользователь-игрок
🐳 Docker
Все компоненты запускаются в Docker контейнерах:
# Запуск всех сервисов
docker-compose up -d
# Просмотр логов
docker-compose logs -f
# Остановка всех сервисов
docker-compose down
🔑 Конфигурация
Telegram бот
Токены ботов задаются переменными окружения в .env (см. .env.example):
TELEGRAM_BOT_TOKEN=YOUR_BOT_TOKEN
ADMINPANEL_TELEGRAM_BOT_TOKEN=YOUR_ADMIN_BOT_TOKEN
LichessClientTG_bot/config.py читает их через os.getenv(...). Разделение на тестовый и
продакшн стенды обеспечивается не флагом в коде, а раздельными .env на каждом окружении:
на локальном/тестовом стенде — тестовые токены, на проде — свои, боевые.
Lichess API
Для получения статистики по задачам нужен токен Lichess:
- Зайдите на https://lichess.org/account/oauth/token/create
- Создайте токен с правами на чтение
- Используйте токен при добавлении игрока в боте
📊 API документация
Полная документация API доступна по адресу: http://localhost:8001/docs
Включает:
- Swagger UI для интерактивного тестирования
- Описание всех endpoints
- Примеры запросов и ответов
🛠️ Разработка
Локальная разработка
# API сервис
cd LichessWebServices
docker-compose up -d
# Telegram бот
cd LichessClientTG_bot
docker-compose up -d
Логи
# Логи API
docker logs lichesswebservices_lichess-api_1 -f
# Логи бота
docker logs lichess-telegram-bot -f
📝 Лицензия
MIT
👤 Автор
Roman Vrubel
📖 Дополнительная информация
- О боте - подробное описание функций бота, для кого он предназначен и примеры использования
- История изменений - список всех изменений и обновлений проекта