@@ -88,7 +88,7 @@ use matrix_sdk::{
8888use modalkit:: errors:: UIError ;
8989use modalkit:: prelude:: { EditInfo , InfoMessage } ;
9090
91- use crate :: base:: Need ;
91+ use crate :: base:: MessageNeed ;
9292use crate :: notifications:: register_notifications;
9393use crate :: {
9494 base:: {
@@ -216,7 +216,7 @@ async fn update_event_receipts(info: &mut RoomInfo, room: &MatrixRoom, event_id:
216216
217217#[ derive( Debug ) ]
218218enum Plan {
219- Messages ( OwnedRoomId , Option < String > ) ,
219+ Messages ( OwnedRoomId , Option < String > , Vec < MessageNeed > ) ,
220220 Members ( OwnedRoomId ) ,
221221}
222222
@@ -225,8 +225,8 @@ async fn load_plans(store: &AsyncProgramStore) -> Vec<Plan> {
225225 let ChatStore { need_load, rooms, .. } = & mut locked. application ;
226226 let mut plan = Vec :: with_capacity ( need_load. rooms ( ) * 2 ) ;
227227
228- for ( room_id, mut need) in std:: mem:: take ( need_load) . into_iter ( ) {
229- if need . contains ( Need :: MESSAGES ) {
228+ for ( room_id, need) in std:: mem:: take ( need_load) . into_iter ( ) {
229+ if let Some ( message_need ) = need . messages {
230230 let info = rooms. get_or_default ( room_id. clone ( ) ) ;
231231
232232 if !info. recently_fetched ( ) && !info. fetching {
@@ -239,16 +239,11 @@ async fn load_plans(store: &AsyncProgramStore) -> Vec<Plan> {
239239 RoomFetchStatus :: NotStarted => None ,
240240 } ;
241241
242- plan. push ( Plan :: Messages ( room_id. to_owned ( ) , fetch_id) ) ;
243- need. remove ( Need :: MESSAGES ) ;
242+ plan. push ( Plan :: Messages ( room_id. to_owned ( ) , fetch_id, message_need) ) ;
244243 }
245244 }
246- if need. contains ( Need :: MEMBERS ) {
245+ if need. members {
247246 plan. push ( Plan :: Members ( room_id. to_owned ( ) ) ) ;
248- need. remove ( Need :: MEMBERS ) ;
249- }
250- if !need. is_empty ( ) {
251- need_load. insert ( room_id, need) ;
252247 }
253248 }
254249
@@ -258,14 +253,14 @@ async fn load_plans(store: &AsyncProgramStore) -> Vec<Plan> {
258253async fn run_plan ( client : & Client , store : & AsyncProgramStore , plan : Plan , permits : & Semaphore ) {
259254 let permit = permits. acquire ( ) . await ;
260255 match plan {
261- Plan :: Messages ( room_id, fetch_id) => {
256+ Plan :: Messages ( room_id, fetch_id, message_need ) => {
262257 let limit = MIN_MSG_LOAD ;
263258 let client = client. clone ( ) ;
264259 let store_clone = store. clone ( ) ;
265260
266261 let res = load_older_one ( & client, & room_id, fetch_id, limit) . await ;
267262 let mut locked = store. lock ( ) . await ;
268- load_insert ( room_id, res, locked. deref_mut ( ) , store_clone) ;
263+ load_insert ( room_id, res, locked. deref_mut ( ) , store_clone, message_need ) ;
269264 } ,
270265 Plan :: Members ( room_id) => {
271266 let res = members_load ( client, & room_id) . await ;
@@ -328,6 +323,7 @@ fn load_insert(
328323 res : MessageFetchResult ,
329324 locked : & mut ProgramStore ,
330325 store : AsyncProgramStore ,
326+ message_needs : Vec < MessageNeed > ,
331327) {
332328 let ChatStore { presences, rooms, worker, picker, settings, .. } = & mut locked. application ;
333329 let info = rooms. get_or_default ( room_id. clone ( ) ) ;
@@ -373,12 +369,25 @@ fn load_insert(
373369 }
374370
375371 info. fetch_id = fetch_id. map_or ( RoomFetchStatus :: Done , RoomFetchStatus :: HaveMore ) ;
372+
373+ // check if more are needed
374+ let needs: Vec < _ > = message_needs
375+ . into_iter ( )
376+ . filter ( |need| !info. keys . contains_key ( & need. event_id ) && need. ttl > 0 )
377+ . map ( |mut need| {
378+ need. ttl -= 1 ;
379+ need
380+ } )
381+ . collect ( ) ;
382+ if !needs. is_empty ( ) {
383+ locked. application . need_load . need_messages_all ( room_id, needs) ;
384+ }
376385 } ,
377386 Err ( e) => {
378387 warn ! ( room_id = room_id. as_str( ) , err = e. to_string( ) , "Failed to load older messages" ) ;
379388
380389 // Wait and try again.
381- locked. application . need_load . insert ( room_id, Need :: MESSAGES ) ;
390+ locked. application . need_load . need_messages_all ( room_id, message_needs ) ;
382391 } ,
383392 }
384393}
@@ -573,12 +582,12 @@ pub async fn do_first_sync(client: &Client, store: &AsyncProgramStore) -> Result
573582
574583 for room in sync_info. rooms . iter ( ) {
575584 let room_id = room. as_ref ( ) . 0 . room_id ( ) . to_owned ( ) ;
576- need_load. insert ( room_id, Need :: MESSAGES ) ;
585+ need_load. need_messages ( room_id) ;
577586 }
578587
579588 for room in sync_info. dms . iter ( ) {
580589 let room_id = room. as_ref ( ) . 0 . room_id ( ) . to_owned ( ) ;
581- need_load. insert ( room_id, Need :: MESSAGES ) ;
590+ need_load. need_messages ( room_id) ;
582591 }
583592
584593 Ok ( ( ) )
0 commit comments