add pinned messages
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user