fix: handle UpdateMessageSendSucceeded to prevent edit errors

Fixes "Message not found" error when editing immediately after sending.

**Problem**:
When sending a message, TDLib may return a temporary ID, then send
UpdateMessageSendSucceeded with the real server ID. We weren't handling
this update, so the cache kept the old ID while the server had a different
one, causing "Message not found" errors during edits.

**Solution**:
1. Added UpdateMessageSendSucceeded handler (client.rs:801-830)
   - Finds message with temporary ID
   - Replaces it with new message containing real server ID
   - Preserves reply_info if present

2. Added validation before editing (main_input.rs:574-589)
   - Checks message exists in cache
   - Better error messages with chat_id and message_id

3. Added positive ID check in start_editing_selected (mod.rs:240)
   - Blocks editing messages with temporary IDs (negative)

**Test**:
- Added test_edit_immediately_after_send (edit_message.rs:156-181)
- Verifies editing works right after send_message
- All 22 edit_message tests pass

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Mikhail Kilin
2026-02-01 01:47:12 +03:00
parent c5078a54f4
commit 9df8138a46
4 changed files with 86 additions and 2 deletions

View File

@@ -798,6 +798,36 @@ impl TdClient {
}
}
}
Update::MessageSendSucceeded(update) => {
// Сообщение успешно отправлено, заменяем временный ID на настоящий
let old_id = MessageId::new(update.old_message_id);
let chat_id = ChatId::new(update.message.chat_id);
// Обрабатываем только если это текущий открытый чат
if Some(chat_id) == self.current_chat_id() {
// Находим сообщение с временным ID
if let Some(idx) = self
.current_chat_messages()
.iter()
.position(|m| m.id() == old_id)
{
// Конвертируем новое сообщение
let mut new_msg = self.convert_message(&update.message, chat_id);
// Сохраняем reply_info из старого сообщения (если было)
let old_reply = self.current_chat_messages()[idx]
.interactions
.reply_to
.clone();
if let Some(reply) = old_reply {
new_msg.interactions.reply_to = Some(reply);
}
// Заменяем старое сообщение на новое
self.current_chat_messages_mut()[idx] = new_msg;
}
}
}
_ => {}
}
}