Feature/invitation court and program - #163
Conversation
В напоминании корт назван, а в приглашении его не было: чтобы понять, куда ехать, человек должен был открыть ссылку. Строка «Корт: …» встаёт сразу после времени и мест — там, где её ищут. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Программа обрезалась по 160 символам как строка, и в приглашении висело «Подачи на т...» — блок не прочитать, а сколько их не поместилось, непонятно. Режем по целым блокам и считаем пропущенные: «+ ещё 7». Предел поднят до 600 символов, он остался только затем, чтобы длинный план не выбил сообщение за лимит телеграма в 4096. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Телеграм рисует превью из своего кэша и обновляет его когда захочет: под приглашением на игру #2 висела карточка чужого корта и даты недельной давности, хотя og-теги на странице верные. Всё нужное есть в самом тексте, так что sendMessage теперь просит превью не рисовать. Кому оно понадобится — есть link_preview: true. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Приглашение уходит в телеграм с parse_mode: HTML, поэтому всё, что ввели люди — название корта, имена, названия блоков, — экранируется. В письме тот же текст собирается без разметки: @Body вставляется и в текстовый шаблон, где теги были бы видны как есть. Хост для ссылки берём у game_url: он пришёл из запроса и верен и на проде, и локально. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
На тренировку на один корт выходит хоть десять человек, а приглашение писало «0 мест свободно» — это читается как «не приходи», хотя зовут именно тебя. Счёт мест остался у игры, где он и осмыслен. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Ссылка на корт понадобилась во втором сообщении, поэтому и разметка, и экранирование переехали в Telegram::Helpers::Markup — иначе логика расползлась бы по job и по сервису приглашений. Напоминание теперь тоже уходит с parse_mode: HTML, а значит имена тренеров и участников, названия блоков и корта экранируются. В письме корт остаётся просто именем. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f0d8c5df30
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| break if kept.any? && (kept + [ title ]).join(", ").length > limit | ||
| kept << title |
There was a problem hiding this comment.
Enforce the limit for the first training block
When the first block title alone exceeds limit, kept.any? is false, so the block is appended without any bound. A sufficiently long user-provided title can therefore make invitation and reminder messages exceed Telegram's 4096-character limit and be rejected, despite this method being intended to prevent that; truncate or otherwise cap an oversized individual block.
Useful? React with 👍 / 👎.
Ревью прочитало исключение для первого блока как дыру, через которую сообщение выйдет за лимит телеграма. Выйти оно не может: TrainingBlock валидирует title в 100 символов с самого появления модели. Комментарий рядом с условием, чтобы вопрос не возникал заново. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
No description provided.