add draft messages

This commit is contained in:
Mikhail Kilin
2026-01-27 12:31:31 +03:00
parent dc76e01f3c
commit ac684da820
5 changed files with 118 additions and 7 deletions

View File

@@ -112,6 +112,8 @@ pub struct ChatInfo {
pub folder_ids: Vec<i32>,
/// Чат замьючен (уведомления отключены)
pub is_muted: bool,
/// Черновик сообщения
pub draft_text: Option<String>,
}
/// Информация о сообщении, на которое отвечают
@@ -592,6 +594,19 @@ impl TdClient {
}
}
}
Update::ChatDraftMessage(update) => {
// Обновляем черновик в списке чатов
if let Some(chat) = self.chats.iter_mut().find(|c| c.id == update.chat_id) {
chat.draft_text = update.draft_message.as_ref().and_then(|draft| {
// Извлекаем текст из InputMessageText
if let tdlib_rs::enums::InputMessageContent::InputMessageText(text_msg) = &draft.input_message_text {
Some(text_msg.text.text.clone())
} else {
None
}
});
}
}
_ => {}
}
}
@@ -678,6 +693,7 @@ impl TdClient {
last_read_outbox_message_id: td_chat.last_read_outbox_message_id,
folder_ids,
is_muted,
draft_text: None,
};
if let Some(existing) = self.chats.iter_mut().find(|c| c.id == td_chat.id) {
@@ -1348,6 +1364,57 @@ impl TdClient {
}
/// Редактирование текстового сообщения с поддержкой Markdown
/// Устанавливает черновик для чата через TDLib API
pub async fn set_draft_message(&self, chat_id: i64, text: String) -> Result<(), String> {
use tdlib_rs::types::{FormattedText, InputMessageText, DraftMessage};
use tdlib_rs::enums::InputMessageContent;
if text.is_empty() {
// Очищаем черновик
let result = functions::set_chat_draft_message(
chat_id,
0, // message_thread_id
None, // draft_message (None = очистить)
self.client_id,
).await;
match result {
Ok(_) => Ok(()),
Err(e) => Err(format!("Ошибка очистки черновика: {:?}", e)),
}
} else {
// Создаём черновик
let formatted_text = FormattedText {
text: text.clone(),
entities: vec![],
};
let input_message = InputMessageContent::InputMessageText(InputMessageText {
text: formatted_text,
link_preview_options: None,
clear_draft: false,
});
let draft = DraftMessage {
reply_to: None,
date: 0, // TDLib установит текущее время
input_message_text: input_message,
};
let result = functions::set_chat_draft_message(
chat_id,
0, // message_thread_id
Some(draft),
self.client_id,
).await;
match result {
Ok(_) => Ok(()),
Err(e) => Err(format!("Ошибка установки черновика: {:?}", e)),
}
}
}
pub async fn edit_message(&self, chat_id: i64, message_id: i64, text: String) -> Result<MessageInfo, String> {
use tdlib_rs::types::{FormattedText, InputMessageText, TextParseModeMarkdown};
use tdlib_rs::enums::{InputMessageContent, TextParseMode};