From 4cb40909c5c6a6234f8e8db6628f770f1dabb33a Mon Sep 17 00:00:00 2001 From: YoursFunny Date: Sun, 16 Aug 2026 17:00:31 +0800 Subject: [PATCH] fix(send): run post_send_actions after retried sends MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A task only reaches the queue after a failed send, so the fresh attempt never ran post_send_actions (edit-before-forward prompt / channel forward) — it failed before that point. The old guard skipped post_send_actions for resumed tasks (batch_index > 0 or sent ids present), which meant any send that needed a retry after partial progress silently lost its forward and edit prompt. post_send_actions is now run unconditionally on a successful queue send; it executes exactly once, after the whole sequence completed. --- crates/xmedia-bot/src/send.rs | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/crates/xmedia-bot/src/send.rs b/crates/xmedia-bot/src/send.rs index 9a1d7da..7720bfd 100644 --- a/crates/xmedia-bot/src/send.rs +++ b/crates/xmedia-bot/src/send.rs @@ -1321,18 +1321,6 @@ pub async fn handle_task(payload: serde_json::Value) -> Result<(), QueueError> { } }; let bot = BOT.clone(); - // A resumed multi-batch send already ran post_send_actions (edit prompt / - // forward) when it first started; running them again on the resume would - // open a duplicate edit prompt and double-forward. SendAnimation is - // atomic (always a fresh run), so only SendMediaSequence can resume. - let resumed = matches!( - &task, - Task::SendMediaSequence { - batch_index, - sent_message_ids, - .. - } if *batch_index > 0 || !sent_message_ids.is_empty() - ); match task { Task::SendMediaSequence { .. } | Task::SendAnimation { .. } => { let message_ids = match send_media_or_animation(&bot, &task).await { @@ -1356,9 +1344,14 @@ pub async fn handle_task(payload: serde_json::Value) -> Result<(), QueueError> { }); } }; - if !resumed { - post_send_actions(&bot, &task, message_ids).await; - } + // A task only reaches the queue after a failed send, so this + // successful run is the first time post_send_actions can fire — + // the fresh attempt failed before it ever got here. Run it + // unconditionally: `post_send_actions` executes once, after the + // whole sequence (every batch) completed, so the channel forward + // and the edit-before-forward prompt must not be lost just + // because the send needed a retry. + post_send_actions(&bot, &task, message_ids).await; release_keep_alive(&task); Ok(()) }