diff --git a/native/mtproto-rs/src/client/dispatch.rs b/native/mtproto-rs/src/client/dispatch.rs index c0773fc7..adb89470 100644 --- a/native/mtproto-rs/src/client/dispatch.rs +++ b/native/mtproto-rs/src/client/dispatch.rs @@ -454,6 +454,36 @@ pub fn search_messages_filtered( }) } +pub fn search_messages_page( + handle: u64, + chat_id: i64, + query: String, + filter: String, + offset_id: i32, + add_offset: i32, + limit: i32, +) -> Result { + with_client_mut(handle, |state| { + let page = call_with_migrate(state, |state| { + with_peer_refresh(state, chat_id, |state| { + crate::messages::search_messages_page( + &mut state.snapshot, + state.api_id, + &mut state.peers, + &mut state.media, + chat_id, + &query, + &filter, + offset_id, + add_offset, + limit, + ) + }) + })?; + Ok(page) + }) +} + pub fn contacts_search( handle: u64, query: String, diff --git a/native/mtproto-rs/src/dialogs/message_map.rs b/native/mtproto-rs/src/dialogs/message_map.rs index 3285e5e3..05b76fcb 100644 --- a/native/mtproto-rs/src/dialogs/message_map.rs +++ b/native/mtproto-rs/src/dialogs/message_map.rs @@ -347,14 +347,19 @@ pub(crate) fn dtos_from_messages_page( response: MessagesMessages, peers: &mut HashMap, media_index: &mut MediaIndex, -) -> Result<(Vec, i32), MtprotoError> { - let (messages, users, chats, next_rate) = match response { - MessagesMessages::MessagesMessages(m) => (m.messages, m.users, m.chats, 0), +) -> Result<(Vec, i32, i32), MtprotoError> { + let (messages, users, chats, next_rate, total_count) = match response { + MessagesMessages::MessagesMessages(m) => { + let count = vector_boxed_items(&m.messages).count() as i32; + (m.messages, m.users, m.chats, 0, count) + } MessagesMessages::MessagesMessagesSlice(m) => { - (m.messages, m.users, m.chats, m.next_rate.unwrap_or(0)) + (m.messages, m.users, m.chats, m.next_rate.unwrap_or(0), m.count) + } + MessagesMessages::MessagesChannelMessages(m) => { + (m.messages, m.users, m.chats, 0, m.count) } - MessagesMessages::MessagesChannelMessages(m) => (m.messages, m.users, m.chats, 0), - MessagesMessages::MessagesMessagesNotModified(_) => return Ok((Vec::new(), 0)), + MessagesMessages::MessagesMessagesNotModified(_) => return Ok((Vec::new(), 0, 0)), _ => return Err(MtprotoError::Message("unexpected messages.messages".into())), }; let user_list = vector_boxed_items(&users).cloned().collect::>(); @@ -373,7 +378,7 @@ pub(crate) fn dtos_from_messages_page( }) .collect(); fill_missing_reply_quotes(&mut dtos); - Ok((dtos, next_rate)) + Ok((dtos, next_rate, total_count)) } #[derive(serde::Serialize)] diff --git a/native/mtproto-rs/src/dto.rs b/native/mtproto-rs/src/dto.rs index 60bf6a0e..af78ce75 100644 --- a/native/mtproto-rs/src/dto.rs +++ b/native/mtproto-rs/src/dto.rs @@ -179,6 +179,12 @@ pub struct MessageDto { pub forum_topic: bool, } +#[derive(Debug, Clone, uniffi::Record)] +pub struct MessagesPageDto { + pub messages: Vec, + pub total_count: i32, +} + #[derive(Debug, Clone, uniffi::Record)] pub struct SavedGifDto { pub document_id: i64, diff --git a/native/mtproto-rs/src/ffi.rs b/native/mtproto-rs/src/ffi.rs index 1f878c67..feb56b1e 100644 --- a/native/mtproto-rs/src/ffi.rs +++ b/native/mtproto-rs/src/ffi.rs @@ -27,7 +27,7 @@ use crate::waveform; use crate::{ AuthCodeSent, AuthSignedIn, BotCallbackAnswerDto, ChatDto, ContactsSearchDto, DiscussionDto, FolderDto, ForumTopicsPageDto, GlobalMessageSearchDto, InlineBotResultsDto, InstantViewDto, - JoinChatDto, LottieSize, MessageDto, MtprotoError, NotifyExceptionDto, NotifySettingsDto, + JoinChatDto, LottieSize, MessageDto, MessagesPageDto, MtprotoError, NotifyExceptionDto, NotifySettingsDto, ProfileDto, ReactionChoiceDto, ResolvedPeerDto, SavedGifDto, StickerCatalogDto, StickerListDto, StickerPackDto, UpdateEventDto, UpdatesStateDto, UploadItemDto, VpxAlphaFrame, VpxFrame, @@ -469,6 +469,19 @@ pub fn search_messages_filtered( client::search_messages_filtered(handle, chat_id, query, filter, offset_id, add_offset, limit) } +#[uniffi::export] +pub fn search_messages_page( + handle: u64, + chat_id: i64, + query: String, + filter: String, + offset_id: i32, + add_offset: i32, + limit: i32, +) -> Result { + client::search_messages_page(handle, chat_id, query, filter, offset_id, add_offset, limit) +} + #[uniffi::export] pub fn contacts_search( handle: u64, diff --git a/native/mtproto-rs/src/messages/search.rs b/native/mtproto-rs/src/messages/search.rs index 960fdb45..1ae9e5ed 100644 --- a/native/mtproto-rs/src/messages/search.rs +++ b/native/mtproto-rs/src/messages/search.rs @@ -188,6 +188,36 @@ pub fn get_pinned_messages( ) } +pub fn search_messages_page( + snapshot: &mut Snapshot, + api_id: i32, + peers: &mut HashMap, + media_index: &mut MediaIndex, + chat_id: i64, + query: &str, + filter: &str, + offset_id: i32, + add_offset: i32, + limit: i32, +) -> Result { + let (messages, total_count) = search_messages_with_filter_and_count( + snapshot, + api_id, + peers, + media_index, + chat_id, + query, + offset_id, + add_offset, + limit, + messages_filter(filter), + )?; + Ok(crate::dto::MessagesPageDto { + messages, + total_count, + }) +} + pub(crate) fn search_messages_with_filter( snapshot: &mut Snapshot, api_id: i32, @@ -200,6 +230,32 @@ pub(crate) fn search_messages_with_filter( limit: i32, filter: MessagesFilter, ) -> Result, MtprotoError> { + Ok(search_messages_with_filter_and_count( + snapshot, + api_id, + peers, + media_index, + chat_id, + query, + offset_id, + add_offset, + limit, + filter, + )?.0) +} + +pub(crate) fn search_messages_with_filter_and_count( + snapshot: &mut Snapshot, + api_id: i32, + peers: &mut HashMap, + media_index: &mut MediaIndex, + chat_id: i64, + query: &str, + offset_id: i32, + add_offset: i32, + limit: i32, + filter: MessagesFilter, +) -> Result<(Vec, i32), MtprotoError> { let cached = peers::require_usable_peer(peers, chat_id)?; let request = MessagesSearchRequest { flags: 0, @@ -221,5 +277,6 @@ pub(crate) fn search_messages_with_filter( }; let response: tellers_mtproto::latest::api::MessagesMessages = api_invoke::invoke_api(snapshot, api_id, request)?; - crate::dialogs::dtos_from_messages(response, peers, media_index) + let (dtos, _, total_count) = crate::dialogs::dtos_from_messages_page(response, peers, media_index)?; + Ok((dtos, total_count)) } diff --git a/native/mtproto-rs/src/messages/search_rpc.rs b/native/mtproto-rs/src/messages/search_rpc.rs index 26bb35b9..4c4e4967 100644 --- a/native/mtproto-rs/src/messages/search_rpc.rs +++ b/native/mtproto-rs/src/messages/search_rpc.rs @@ -128,7 +128,7 @@ pub fn search_global( }; let response: tellers_mtproto::latest::api::MessagesMessages = api_invoke::invoke_api(snapshot, api_id, request)?; - let (messages, next_rate) = dialogs::dtos_from_messages_page(response, peers, media)?; + let (messages, next_rate, _) = dialogs::dtos_from_messages_page(response, peers, media)?; let (next_rate, next_peer_id, next_offset_id) = next_global_page(&messages, next_rate); Ok(GlobalMessageSearchDto { messages,