From 0027b4d746b122b612bf546f35382fb91feca536 Mon Sep 17 00:00:00 2001 From: harald Date: Sat, 21 Feb 2026 08:24:31 +0100 Subject: [PATCH] fix(telegram): treat "message is not modified" as success in finalize_draft Telegram returns 400 with "message is not modified" when editMessageText is called with content identical to the current message. This happens when streaming deltas have already updated the draft to the final text. Previously this triggered a fallback to sendMessage, producing a duplicate message. Co-Authored-By: Claude Opus 4.6 --- src/channels/telegram.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/channels/telegram.rs b/src/channels/telegram.rs index ca0e03b..0d9aa1f 100644 --- a/src/channels/telegram.rs +++ b/src/channels/telegram.rs @@ -1607,6 +1607,16 @@ impl Channel for TelegramChannel { return Ok(()); } + // Check if edit failed because content is identical (Telegram returns 400 + // with "message is not modified" when the draft already has the final text). + let status = resp.status(); + let resp_body = resp.text().await.unwrap_or_default(); + if status == reqwest::StatusCode::BAD_REQUEST + && resp_body.contains("message is not modified") + { + return Ok(()); + } + // Markdown failed — retry without parse_mode let plain_body = serde_json::json!({ "chat_id": chat_id, @@ -1625,6 +1635,15 @@ impl Channel for TelegramChannel { return Ok(()); } + // Also check plain-text edit for "not modified" + let status = resp.status(); + let resp_body = resp.text().await.unwrap_or_default(); + if status == reqwest::StatusCode::BAD_REQUEST + && resp_body.contains("message is not modified") + { + return Ok(()); + } + // Edit failed entirely — fall back to new message tracing::warn!("Telegram finalize_draft edit failed; falling back to sendMessage"); self.send_text_chunks(text, &chat_id, thread_id.as_deref())