Skip to content

Telegram: не повторять отправку при ошибке "chat not found"#113

Open
orkhv wants to merge 1 commit into
danuk:masterfrom
orkhv:fix-telegram-chat-not-found
Open

Telegram: не повторять отправку при ошибке "chat not found"#113
orkhv wants to merge 1 commit into
danuk:masterfrom
orkhv:fix-telegram-chat-not-found

Conversation

@orkhv

@orkhv orkhv commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

Проблема

Пользователь может попасть в SHM без запуска бота: регистрация через Telegram Login Widget (web_auth с register_if_not_exists), привязка телеграма через внешний API. В настройках появляются валидные chat_id/user_id/status: member, но личного чата с ботом на стороне Telegram не существует — чат создаётся только когда пользователь сам нажимает Start.

Каждая отправка такому пользователю падает с 400 Bad Request: chat not found, задачи в spool повторяются бесконечно, лог заполняется ошибками:

ERROR message: {{ {"ok":false,"error_code":400,"description":"Bad Request: chat not found"} }}
	Core::System::Logger::error at /app/lib/Core/Transport/Telegram.pm line 562
	Core::Transport::Telegram::http at /app/lib/Core/Transport/Telegram.pm line 341
	Core::Transport::Telegram::send at LOCAL_PAYMENT line 21

Решение

Расширяет существующий механизм 403 -> kicked в http():

  • http(): обработка ошибок API вынесена в метод set_profile_status_by_error(): 403 -> kicked (как раньше), 400 + chat not found -> новый статус chat_not_found. Одна точка на все вызовы API (send, task_send, bot-команды).
  • send(): профили со статусом chat_not_found пропускаются до похода в API — рядом с существующей проверкой kicked/left.
  • profile(): сброс кэша user_tg_settings при смене профиля. Без этого в цикле отправки по профилям статус читался от предыдущего профиля.

Жизненный цикл статуса

member ──(send: chat not found)──> chat_not_found   [дальше skip, лог чистый]
chat_not_found ──(пользователь нажал Start: auth)──> member   [отправка работает]
любой ──(403)──> kicked   [без изменений]

Данные лечатся сами: битые записи помечаются при первой отправке, после запуска бота пользователем auth() возвращает member — как и раньше. Миграция не нужна. Найти всех пользователей без чата можно запросом по status = 'chat_not_found'.

🤖 Generated with Claude Code

… отправку

Пользователь может попасть в SHM без запуска бота (Telegram Login Widget,
внешний API) — chat_id записан, но личного чата с ботом не существует.
Каждая отправка падала с "Bad Request: chat not found", задачи в spool
бесконечно повторялись.

- http(): обработка ошибок API вынесена в set_profile_status_by_error();
  403 -> kicked (как раньше), 400 "chat not found" -> chat_not_found
- send(): профили со статусом chat_not_found пропускаются до похода в API
- profile(): сброс кэша user_tg_settings при смене профиля, иначе в цикле
  отправки по профилям статус читался от предыдущего профиля

Статус восстанавливается в member при первом сообщении пользователя
боту (auth), как и раньше.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant