- /myplayers: each player card gets inline 🗑 button — tap to remove instantly
- removal via CallbackQueryHandler (remove:<fide_id>), no text command needed
- /removeplayer command removed
- no-players message localized (ru/en) via LOCALE
- /myplayers header and labels (round, pts) also localized
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- scan_for_player: remove hardcoded TNR range (1434k-1450k), search full cache
- discover_max_tnr: start from cache MAX(tnr) instead of stuck-at-500k value
- addplayer: if no tournament found, add fide_only watch instead of asking for URL
- rescan_new_tournaments: deactivate fide_only entry when real tournament found
- /myplayers: card layout grouped by player, removal by FIDE ID
- /removeplayer: now accepts FIDE ID, removes all subscriptions for that player
- fix MarkdownV2 escaping: dates (hyphens), <> in messages, title='None'
- check_all_subscriptions: skip fide_only entries; interval 5min → 1min
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- _build_table_rows: filter to ±5 boards around player
- Normalize names (strip commas) for matching FIDE vs pairings format
- Highlight subscribed player with ✅ emoji
- Reduce name column width to compensate for emoji
- Add tournament name to pairing header
- Manual URL flow: look up subscription to highlight player
- Fix MarkdownV2 escaping for em-dash
- _pad_col теперь обрезает имена длиннее колонки (с многоточием)
- Разделительная линия (────┼────┼────) после каждой пары
- chunk_size кратен 3 (white + black + border)
- Очки выровнены по самой длинной фамилии
- format_pairings возвращает структуру (title/rows/header/footer)
- _render_chunks разбивает пары на группы по ~30 пар
- Каждый чанк — свой code-блок с заголовком
- Убраны разделители между парами (экономия ~50% размера)
- Fallback plain text при любой ошибке MarkdownV2
Формат:
# │ Игрок │ О
───┼────────────────────────┼────
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