Files
continuwuity/src/api/client/sync/mod.rs
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

86 lines
2.1 KiB
Rust
Raw Normal View History

2024-10-16 05:32:27 +00:00
mod v3;
mod v4;
mod v5;
2024-10-16 05:32:27 +00:00
2024-12-14 21:58:01 -05:00
use conduwuit::{
Error, PduCount, Result,
matrix::pdu::PduEvent,
2025-04-06 21:59:18 +00:00
utils::stream::{BroadbandExt, ReadyExt, TryIgnore},
2024-12-04 00:00:40 +00:00
};
use conduwuit_service::Services;
use futures::{StreamExt, pin_mut};
use ruma::{
RoomId, UserId,
events::TimelineEventType::{
self, Beacon, CallInvite, PollStart, RoomEncrypted, RoomMessage, Sticker,
},
};
2024-10-16 05:32:27 +00:00
pub(crate) use self::{
v3::sync_events_route, v4::sync_events_v4_route, v5::sync_events_v5_route,
};
2024-10-16 05:32:27 +00:00
pub(crate) const DEFAULT_BUMP_TYPES: &[TimelineEventType; 6] =
&[CallInvite, PollStart, Beacon, RoomEncrypted, RoomMessage, Sticker];
2024-10-16 05:32:27 +00:00
async fn load_timeline(
services: &Services,
sender_user: &UserId,
room_id: &RoomId,
roomsincecount: PduCount,
next_batch: Option<PduCount>,
limit: usize,
2024-10-16 05:32:27 +00:00
) -> Result<(Vec<(PduCount, PduEvent)>, bool), Error> {
2024-10-16 06:58:37 +00:00
let last_timeline_count = services
2024-10-16 05:32:27 +00:00
.rooms
.timeline
.last_timeline_count(Some(sender_user), room_id)
2024-10-16 06:58:37 +00:00
.await?;
if last_timeline_count <= roomsincecount {
return Ok((Vec::new(), false));
}
let non_timeline_pdus = services
2024-10-16 06:58:37 +00:00
.rooms
.timeline
.pdus_rev(Some(sender_user), room_id, None)
.ignore_err()
.ready_skip_while(|&(pducount, _)| pducount > next_batch.unwrap_or_else(PduCount::max))
.ready_take_while(|&(pducount, _)| pducount > roomsincecount);
2024-10-16 06:58:37 +00:00
// Take the last events for the timeline
pin_mut!(non_timeline_pdus);
let timeline_pdus: Vec<_> = non_timeline_pdus.by_ref().take(limit).collect().await;
let timeline_pdus: Vec<_> = timeline_pdus.into_iter().rev().collect();
2024-10-16 05:32:27 +00:00
2024-10-16 06:58:37 +00:00
// They /sync response doesn't always return all messages, so we say the output
// is limited unless there are events in non_timeline_pdus
let limited = non_timeline_pdus.next().await.is_some();
2024-10-16 05:32:27 +00:00
Ok((timeline_pdus, limited))
}
async fn share_encrypted_room(
services: &Services,
sender_user: &UserId,
user_id: &UserId,
ignore_room: Option<&RoomId>,
2024-10-16 05:32:27 +00:00
) -> bool {
services
.rooms
2024-11-20 20:21:31 +00:00
.state_cache
2024-10-16 05:32:27 +00:00
.get_shared_rooms(sender_user, user_id)
.ready_filter(|&room_id| Some(room_id) != ignore_room)
2025-02-21 17:47:44 +00:00
.map(ToOwned::to_owned)
.broad_any(|other_room_id| async move {
2024-10-16 05:32:27 +00:00
services
.rooms
.state_accessor
2025-02-21 17:47:44 +00:00
.is_encrypted_room(&other_room_id)
.await
2024-10-16 05:32:27 +00:00
})
.await
}