Commit graph

37 commits

Author SHA1 Message Date
vrubel
8058080c3a fix: reduce chess-results.com request volume by ~20-50x
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 5s
- check_all_subscriptions: quick pre-check (1 req, art=4 only) before
  full fetch; full fetch only when results_count or current_round changed.
  Interval 60s → 300s. Saves ~10,000 req/day per active subscription.
- rescan_existing_tournaments: filter to tournaments ended within last 30
  days (or no end_date). Drops from ~2000 cached TNRs to ~30-100 active
  ones per run, saving ~22,000 req/day.
- warmup: sleep 1s per TNR instead of 20ms per 500 — spreads initial
  full-scan over hours rather than minutes.
- parser: extract _normalize_url helper, add fetch_tournament_quick().

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-21 07:47:38 +00:00
vrubel
66b10d9425 feat: rapid/blitz ratings, instant addplayer, hyperlinks, bug fixes
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 7s
- fetch_fide_player: parse rapid and blitz ratings from FIDE profile
- subscriptions: add rapid/blitz columns (auto-migration)
- /myplayers card: show rapid (📍) and blitz () ratings
- /addplayer confirmation: show rapid/blitz alongside standard rating
- find_player_in_cache: extract instant SQL-only search from scan_for_player
- /addplayer: use find_player_in_cache instead of full HTTP scan — instant response
- tournament names in /myplayers and /addplayer are now hyperlinks
- add_player_watch: ON CONFLICT DO UPDATE to reactivate deleted players
- my_players: try/except per card with plain-text fallback, error logged to stderr

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20 23:35:49 +00:00
vrubel
39f1f7e857 feat: inline remove button in /myplayers, localized no-players message
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 14s
- /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>
2026-06-20 23:04:32 +00:00
vrubel
293c1d90c8 fix: player tracking subscription flow and /myplayers display
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 4s
- 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>
2026-06-20 22:54:01 +00:00
vrubel
282c651821 docs: comprehensive README with player tracking, cache, and jobs
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 3s
2026-06-20 22:14:38 +00:00
vrubel
d18c5016ce feat: rescan_existing_tournaments — detect new players in cached tournaments every 2h
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 6s
2026-06-20 22:09:48 +00:00
vrubel
07b016bff9 perf: SQL LIKE query instead of Python loop; skip warmup if cache >1000
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 7s
2026-06-20 09:06:11 +00:00
vrubel
34dc8b7ac6 perf: check tnr_cache before discover_max_tnr (instant search) 2026-06-20 08:56:18 +00:00
vrubel
9a583c8fa5 fix: match player by SNo, not name (Latin/Cyrillic mismatch) 2026-06-20 08:55:09 +00:00
vrubel
ba293dcb70 feat: pairings output - show ±5 around subscribed player
- _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
2026-06-20 07:53:43 +00:00
vrubel
89f5861ee3 fix: auto-tournament search via local tnr_cache index
- Extract canonical FIDE ID from profile page (profile-info-id)
- Add tnr_cache table for local tournament index with players
- scan_for_player uses cache-only search (instant SQL, 0 HTTP)
- warmup_cache builds full index at step 1 (1445000→1434000)
- Save/resume warmup progress via tnr_state
- Auto-migrate missing columns (start_date/end_date)
- Add hourly rescan_new_tournaments job
- Fix discover_max_tnr (larger probe steps, lower default)
- Use asyncio.to_thread() for warmup (no crutches)
2026-06-20 07:15:16 +00:00
vrubel
7ebe1aa66e Подписка на игроков: /addplayer, /myplayers, /removeplayer, фоновая проверка результатов и жеребьёвки
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 11s
2026-06-19 18:35:12 +00:00
vrubel
cfd410d5fe Локализация таблицы (ru/en): колонка О→Оч/Pts, детект языка клиента Telegram
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 5s
2026-06-19 16:30:55 +00:00
vrubel
22a0e27763 Парсер: поддержка латиницы (международные турниры) + таблица: колонки Рейт и Доп1
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 8s
2026-06-19 14:51:15 +00:00
vrubel
7f627beeec Убрал название турнира из шапки жеребьёвки, оставил только номер тура
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 6s
2026-06-15 18:16:54 +00:00
vrubel
c7c0067881 Добавлен счётчик уникальных пользователей за сегодня в /stat
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 7s
2026-06-15 18:12:42 +00:00
vrubel
6259dcb3e5 Fix: убрал raw-строки — \n теперь настоящие переносы, а не литералы в MarkdownV2
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 4s
2026-06-15 18:01:51 +00:00
vrubel
14d5a13afb Заменил box-drawing юникод на ASCII (│→|, ─→-, ┼→+, …→...) — гарантированное выравнивание на всех платформах
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 8s
2026-06-15 17:44:38 +00:00
vrubel
bc6e57b91d Дублирующий пересчёт очков в fetch_tournament для надёжности
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 5s
2026-06-15 17:43:34 +00:00
vrubel
98a8febf37 Сжат формат таблицы для телефонов: w=25 символов, имена по 17 символов с обрезкой
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 4s
2026-06-15 17:25:59 +00:00
vrubel
62e1c73cdd Fix: корректный _display_width — кириллица это 1 колонка в моноширинном шрифте, не 2
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 8s
2026-06-15 17:15:19 +00:00
vrubel
dd9d01e7e0 Fix: пересчёт очков в _apply_round_results после применения результатов сыгранного тура
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 4s
2026-06-15 16:53:57 +00:00
vrubel
e0a897fd67 Пробинг туров: если тур уже сыгран — продвигаемся дальше вместо остановки
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 4s
2026-06-15 10:47:18 +00:00
vrubel
4b43432ecd Fix CI test step: use docker run instead of compose
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 2s
2026-06-14 21:47:37 +00:00
vrubel
780e776294 Add CI/CD pipeline (Forgejo) and prod docker-compose
Some checks failed
CI/CD Pipeline / build-and-deploy (push) Failing after 28s
2026-06-14 21:41:07 +00:00
Roman Vrubel
d21f4d696d Переписан README под текущую реализацию
- Основной интерфейс: Telegram-боты (клиентский + админский)
- CLI оставлен для отладки
- Архитектура дополнена bots/ и docker-compose сервисами
- Точность: 4 из 5 турниров 100%, один 85% (ручные bye)
- Актуализированы ограничения и техдолг
2026-06-14 21:23:40 +00:00
Roman Vrubel
755290e43b Починено выравнивание: обрезанные имена теперь добиваются пробелами до ширины колонки
- _pad_col: после truncate + pad до точной ширины (не оставлял хвост)
- _display_width: добавлены U+2026 (…) и U+2116 (№) в wide-символы
2026-06-14 21:16:54 +00:00
Roman Vrubel
c6d799e82f Исправлено: обрезка длинных имён + разделители между парами
- _pad_col теперь обрезает имена длиннее колонки (с многоточием)
- Разделительная линия (────┼────┼────) после каждой пары
- chunk_size кратен 3 (white + black + border)
- Очки выровнены по самой длинной фамилии
2026-06-14 21:13:48 +00:00
Roman Vrubel
bd8cb7d9fc Починен краш Message_too_long: умная разбивка на чанки с code-блоками
- format_pairings возвращает структуру (title/rows/header/footer)
- _render_chunks разбивает пары на группы по ~30 пар
- Каждый чанк — свой code-блок с заголовком
- Убраны разделители между парами (экономия ~50% размера)
- Fallback plain text при любой ошибке MarkdownV2
2026-06-14 21:10:31 +00:00
Roman Vrubel
6bb1d238aa Таблица: ширина колонки — по самой длинной фамилии +3 пробела, разделители между парами
- w_name вычисляется динамически (max + 3, до 42)
- Горизонтальная линия (───┼───┼───) между каждой парой
2026-06-14 21:08:04 +00:00
Roman Vrubel
70ff9bfc4b Таблица в code-блоке: 3 колонки, 2 строки на пару, влезает на телефон
Формат:
#  │ Игрок                  │ О
───┼────────────────────────┼────
1  │ Мармылев Александр Д.  │ 4.0
   │ Нестеров Мирон А.      │ 4.0

Внутри code-блока MarkdownV2 не нужен (literal text).
2026-06-14 21:03:59 +00:00
Roman Vrubel
a17e21c983 Починены краши MarkdownV2: экранирование точек в очках, fallback на plain text
- Очки теперь через _md_escape (4.0 → 4\.0)
- Каждая пара в две строки (белые сверху, чёрные снизу)
- Защита: при ошибке MarkdownV2 парсинга — plain text
- Экранрованы точки в статусных сообщениях
2026-06-14 21:01:10 +00:00
Roman Vrubel
566daf5bb4 Убрал таблицу, заменил на компактный список (влезает на телефон)
Каждая пара — одна строка: номер, белые (очки) — чёрные (очки).
Убрал мёртвый код: _display_width, _make_table_* и др.
2026-06-14 20:51:24 +00:00
Roman Vrubel
35fb54a887 Перевёл Telegram-ботов на MarkdownV2 с таблицами в code-блоках
- client_bot.py: вывод пар в моноширинной таблице ()
  с учётом ширины кириллицы и обрезкой длинных имён
- admin_bot.py: /stat в MarkdownV2
- Оба бота: все сообщения в ParseMode.MARKDOWN_V2
2026-06-14 20:48:02 +00:00
Roman Vrubel
5c4b2536e7 Добавлены Telegram-боты (клиентский + админский)
- Клиентский бот: принимает ссылку на chess-results.com,
  проверяет наличие результатов/жеребьёвки, считает пары
  следующего тура, выводит в HTML-формате
- Админский бот: /stat — уникальные пользователи,
  всего запросов, запросов за сегодня
- Статистика через SQLite (volume bot-data)
- Оба бота в docker-compose с автоперезапуском
- .env.example с тестовыми токенами
- .env в .gitignore
2026-06-14 20:39:19 +00:00
Roman Vrubel
bbbfe61094 chessCalc: исправлена точность жеребьёвки до 100%
Основные изменения:
- 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).
2026-06-14 20:29:27 +00:00
Roman Vrubel
cf7fafd2ba chessCalc: парсер chess-results.com + FIDE Swiss + Docker
Принимает URL турнира, показывает пары следующего тура в Telegram-формате.
- parser.py: парсинг chess-results.com
- swiss.py: FIDE Dutch System
- display.py: форматирование для Telegram
- Docker: docker compose run --rm chess-calc 'URL'
2026-06-14 13:57:32 +00:00