Формат:
# │ Игрок │ О
───┼────────────────────────┼────
1 │ Мармылев Александр Д. │ 4.0
│ Нестеров Мирон А. │ 4.0
Внутри code-блока MarkdownV2 не нужен (literal text).
- Очки теперь через _md_escape (4.0 → 4\.0)
- Каждая пара в две строки (белые сверху, чёрные снизу)
- Защита: при ошибке MarkdownV2 парсинга — plain text
- Экранрованы точки в статусных сообщениях
- client_bot.py: вывод пар в моноширинной таблице ()
с учётом ширины кириллицы и обрезкой длинных имён
- admin_bot.py: /stat в MarkdownV2
- Оба бота: все сообщения в ParseMode.MARKDOWN_V2
- Клиентский бот: принимает ссылку на chess-results.com,
проверяет наличие результатов/жеребьёвки, считает пары
следующего тура, выводит в HTML-формате
- Админский бот: /stat — уникальные пользователи,
всего запросов, запросов за сегодня
- Статистика через SQLite (volume bot-data)
- Оба бота в docker-compose с автоперезапуском
- .env.example с тестовыми токенами
- .env в .gitignore
Основные изменения:
- swiss.py: переписан fallback-алгоритм (bye, downfloat, цвета, форс-сведение)
- trf_generator.py: генератор TRF-16 для bbpPairings
- bbp_wrapper.py: обёртка subprocess для bbpPairings.exe
- parser.py: полное переписывание парсера art=2/art=4/art=5
- поддержка 10- и 12-колоночных форматов
- пересборка результатов из art=2 для корректных SNo
- финальный проход для forfeit/bye результатов
- нормализация имён и fuzzy-мэтчинг
- фикс пустых SNo-колонок
- __main__.py: починен JSON-вывод, поддержка bye
- display.py: отображение bye и источника расчёта
Ключевой фикс точности: убран XXC rank из TRF — bbpPairings
теперь использует порядок из турнирной таблицы вместо поля Rank.
Проверено на 5 турнирах (4 из 5 — 100%, 1 — 85% из-за ручных bye).
Принимает URL турнира, показывает пары следующего тура в Telegram-формате.
- parser.py: парсинг chess-results.com
- swiss.py: FIDE Dutch System
- display.py: форматирование для Telegram
- Docker: docker compose run --rm chess-calc 'URL'