From f5b1643f53595a58a143c83e4fd09720b55d495d Mon Sep 17 00:00:00 2001 From: dv Date: Fri, 8 May 2026 11:00:31 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B5=D1=89=D0=B5=20=D0=BF=D0=BE=D0=BF=D1=8B?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20=D1=84=D0=B8=D0=BA=D1=81=D0=B0=20=D0=B3?= =?UTF-8?q?=D1=86=D1=83=D0=BF=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot/telegram.py | 51 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/bot/telegram.py b/bot/telegram.py index 0a86923..8623b29 100644 --- a/bot/telegram.py +++ b/bot/telegram.py @@ -169,12 +169,36 @@ def recreate_post( disable_web_page_preview=True, reply_markup=markup, ) + log.info(f"recreate_post sent for task {task_id}, message_id={msg.message_id}") # save_message_id сначала создаёт/обновляет строку, потом сохраняем события database.save_message_id(task_id, msg.message_id, task_number, group_id, base_text) if added: database.save_stored_events(task_id, stored) except ApiTelegramException as e: - log.error(f"recreate_post failed for task {task_id}: {e}") + err_text = str(e).lower() + is_markdown_error = any(x in err_text for x in ( + "can't parse entities", + "can't find end of the entity", + "entity starting at byte offset", + )) + if is_markdown_error: + log.error(f"recreate_post markdown failed for task {task_id}, fallback to plain text: {e}") + try: + msg = bot.send_message( + config.CHANNEL_ID, + full_text, + parse_mode=None, + disable_web_page_preview=True, + reply_markup=markup, + ) + database.save_message_id(task_id, msg.message_id, task_number, group_id, base_text) + if added: + database.save_stored_events(task_id, stored) + log.warning(f"recreate_post sent without markdown for task {task_id}, message_id={msg.message_id}") + except ApiTelegramException as e2: + log.error(f"recreate_post fallback failed for task {task_id}: {e2}") + else: + log.error(f"recreate_post failed for task {task_id}: {e}") # ── Callbacks: смена статуса ────────────────────────────────────────────────── @@ -338,7 +362,18 @@ def _is_stale_error(e: Exception) -> bool: "message to edit not found", "message is not modified", "message can't be edited", - "bad request", + "message to delete not found", + "message_id_invalid", + )) + + +def _is_missing_message_error(e: Exception) -> bool: + """True for Telegram errors when target message no longer exists.""" + s = str(e).lower() + return any(x in s for x in ( + "message to edit not found", + "message to delete not found", + "message_id_invalid", )) @@ -376,6 +411,18 @@ def _refresh_responsible(call, task_id: int, task_number: str): reply_markup=markup, ) except ApiTelegramException as e: + if _is_missing_message_error(e): + log.warning( + f"_refresh_responsible: message missing for task {task_id}, recreating post" + ) + recreate_post( + task_id=task_id, + task_number=task_number, + base_text=data["base_text"], + group_id=data.get("group_id") or 0, + new_event_lines=None, + ) + return if not _is_stale_error(e): log.warning(f"_refresh_responsible failed: {e}")