add pinned messages

This commit is contained in:
Mikhail Kilin
2026-01-27 04:38:29 +03:00
parent 4d5625f950
commit 81dc5b9007
5 changed files with 395 additions and 13 deletions

View File

@@ -1,7 +1,7 @@
use std::env;
use std::collections::HashMap;
use std::time::Instant;
use tdlib_rs::enums::{AuthorizationState, ChatAction, ChatList, ChatType, ConnectionState, MessageContent, MessageSender, Update, User, UserStatus};
use tdlib_rs::enums::{AuthorizationState, ChatAction, ChatList, ChatType, ConnectionState, MessageContent, MessageSender, SearchMessagesFilter, Update, User, UserStatus};
use tdlib_rs::types::TextEntity;
/// Максимальный размер кэшей пользователей
@@ -226,6 +226,8 @@ pub struct TdClient {
pub network_state: NetworkState,
/// Typing status для текущего чата: (user_id, action_text, timestamp)
pub typing_status: Option<(i64, String, Instant)>,
/// Последнее закреплённое сообщение текущего чата
pub current_pinned_message: Option<MessageInfo>,
}
#[allow(dead_code)]
@@ -257,6 +259,7 @@ impl TdClient {
user_statuses: LruCache::new(MAX_USER_CACHE_SIZE),
network_state: NetworkState::Connecting,
typing_status: None,
current_pinned_message: None,
}
}
@@ -1103,6 +1106,65 @@ impl TdClient {
Ok(all_messages)
}
/// Загрузка закреплённых сообщений чата
pub async fn get_pinned_messages(&mut self, chat_id: i64) -> Result<Vec<MessageInfo>, String> {
let result = functions::search_chat_messages(
chat_id,
"".to_string(), // query
None, // sender_id
0, // from_message_id
0, // offset
100, // limit
Some(SearchMessagesFilter::Pinned), // filter
0, // message_thread_id
0, // saved_messages_topic_id
self.client_id,
)
.await;
match result {
Ok(tdlib_rs::enums::FoundChatMessages::FoundChatMessages(found)) => {
let mut messages: Vec<MessageInfo> = Vec::new();
for m in found.messages {
messages.push(self.convert_message(&m, chat_id));
}
// Сообщения приходят от новых к старым, оставляем как есть
Ok(messages)
}
Err(e) => Err(format!("Ошибка загрузки закреплённых: {:?}", e)),
}
}
/// Загружает последнее закреплённое сообщение для текущего чата
pub async fn load_current_pinned_message(&mut self, chat_id: i64) {
let result = functions::search_chat_messages(
chat_id,
"".to_string(),
None,
0,
0,
1, // Только одно сообщение
Some(SearchMessagesFilter::Pinned),
0,
0,
self.client_id,
)
.await;
match result {
Ok(tdlib_rs::enums::FoundChatMessages::FoundChatMessages(found)) => {
if let Some(m) = found.messages.first() {
self.current_pinned_message = Some(self.convert_message(m, chat_id));
} else {
self.current_pinned_message = None;
}
}
Err(_) => {
self.current_pinned_message = None;
}
}
}
/// Загрузка старых сообщений (для скролла вверх)
pub async fn load_older_messages(
&mut self,