mirror of
https://gitlab.computer.surgery/matrix/grapevine.git
synced 2025-12-17 15:51:23 +01:00
MSC3575: factor out TodoRoom
This commit is contained in:
parent
6d4f165629
commit
e75fe7b75a
1 changed files with 52 additions and 40 deletions
|
|
@ -19,7 +19,7 @@ use ruma::{
|
||||||
room::member::{MembershipState, RoomMemberEventContent},
|
room::member::{MembershipState, RoomMemberEventContent},
|
||||||
StateEventType, TimelineEventType,
|
StateEventType, TimelineEventType,
|
||||||
},
|
},
|
||||||
uint, JsOption, UInt, UserId,
|
uint, JsOption, OwnedRoomId, RoomId, UInt, UserId,
|
||||||
};
|
};
|
||||||
use tracing::{debug, error};
|
use tracing::{debug, error};
|
||||||
|
|
||||||
|
|
@ -29,6 +29,38 @@ use crate::{
|
||||||
services, Ar, Error, Ra, Result,
|
services, Ar, Error, Ra, Result,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct TodoRoom {
|
||||||
|
required_state_request: BTreeSet<(StateEventType, String)>,
|
||||||
|
timeline_limit: u64,
|
||||||
|
roomsince: u64,
|
||||||
|
}
|
||||||
|
impl TodoRoom {
|
||||||
|
fn update(
|
||||||
|
&mut self,
|
||||||
|
required_state: Vec<(StateEventType, String)>,
|
||||||
|
timeline_limit: UInt,
|
||||||
|
known_rooms: Option<&BTreeMap<OwnedRoomId, u64>>,
|
||||||
|
room_id: &RoomId,
|
||||||
|
) {
|
||||||
|
self.required_state_request.extend(required_state);
|
||||||
|
self.timeline_limit =
|
||||||
|
self.timeline_limit.max(u64::from(timeline_limit).min(100));
|
||||||
|
// 0 means unknown because it got out of date
|
||||||
|
self.roomsince = self.roomsince.min(
|
||||||
|
known_rooms.and_then(|k| k.get(room_id)).copied().unwrap_or(0),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Default for TodoRoom {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
required_state_request: BTreeSet::new(),
|
||||||
|
timeline_limit: 0,
|
||||||
|
roomsince: u64::MAX,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[allow(clippy::too_many_lines)]
|
#[allow(clippy::too_many_lines)]
|
||||||
pub(crate) async fn sync_events_v4_route(
|
pub(crate) async fn sync_events_v4_route(
|
||||||
body: Ar<sync_events::v4::Request>,
|
body: Ar<sync_events::v4::Request>,
|
||||||
|
|
@ -296,7 +328,7 @@ pub(crate) async fn sync_events_v4_route(
|
||||||
|
|
||||||
let mut lists = BTreeMap::new();
|
let mut lists = BTreeMap::new();
|
||||||
// and required state
|
// and required state
|
||||||
let mut todo_rooms = BTreeMap::new();
|
let mut todo_rooms: BTreeMap<OwnedRoomId, TodoRoom> = BTreeMap::new();
|
||||||
|
|
||||||
for (list_id, list) in body.lists {
|
for (list_id, list) in body.lists {
|
||||||
if list.filters.and_then(|f| f.is_invite).unwrap_or(false) {
|
if list.filters.and_then(|f| f.is_invite).unwrap_or(false) {
|
||||||
|
|
@ -322,27 +354,11 @@ pub(crate) async fn sync_events_v4_route(
|
||||||
|
|
||||||
new_known_rooms.extend(room_ids.iter().cloned());
|
new_known_rooms.extend(room_ids.iter().cloned());
|
||||||
for room_id in &room_ids {
|
for room_id in &room_ids {
|
||||||
let todo_room = todo_rooms.entry(room_id.clone()).or_insert((
|
todo_rooms.entry(room_id.clone()).or_default().update(
|
||||||
BTreeSet::new(),
|
list.room_details.required_state.clone(),
|
||||||
0,
|
list.room_details.timeline_limit.unwrap_or(uint!(10)),
|
||||||
u64::MAX,
|
known_rooms.get(&list_id),
|
||||||
));
|
room_id,
|
||||||
let limit = list
|
|
||||||
.room_details
|
|
||||||
.timeline_limit
|
|
||||||
.map_or(10, u64::from)
|
|
||||||
.min(100);
|
|
||||||
todo_room
|
|
||||||
.0
|
|
||||||
.extend(list.room_details.required_state.iter().cloned());
|
|
||||||
todo_room.1 = todo_room.1.max(limit);
|
|
||||||
// 0 means unknown because it got out of date
|
|
||||||
todo_room.2 = todo_room.2.min(
|
|
||||||
known_rooms
|
|
||||||
.get(&list_id)
|
|
||||||
.and_then(|k| k.get(room_id))
|
|
||||||
.copied()
|
|
||||||
.unwrap_or(0),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
ops.push(sync_events::v4::SyncOp {
|
ops.push(sync_events::v4::SyncOp {
|
||||||
|
|
@ -380,21 +396,11 @@ pub(crate) async fn sync_events_v4_route(
|
||||||
if !services().rooms.metadata.exists(room_id)? {
|
if !services().rooms.metadata.exists(room_id)? {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
let todo_room = todo_rooms.entry(room_id.clone()).or_insert((
|
todo_rooms.entry(room_id.clone()).or_default().update(
|
||||||
BTreeSet::new(),
|
room.required_state.clone(),
|
||||||
0,
|
room.timeline_limit.unwrap_or(uint!(10)),
|
||||||
u64::MAX,
|
known_rooms.get("subscriptions"),
|
||||||
));
|
room_id,
|
||||||
let limit = room.timeline_limit.map_or(10, u64::from).min(100);
|
|
||||||
todo_room.0.extend(room.required_state.iter().cloned());
|
|
||||||
todo_room.1 = todo_room.1.max(limit);
|
|
||||||
// 0 means unknown because it got out of date
|
|
||||||
todo_room.2 = todo_room.2.min(
|
|
||||||
known_rooms
|
|
||||||
.get("subscriptions")
|
|
||||||
.and_then(|k| k.get(room_id))
|
|
||||||
.copied()
|
|
||||||
.unwrap_or(0),
|
|
||||||
);
|
);
|
||||||
known_subscription_rooms.insert(room_id.clone());
|
known_subscription_rooms.insert(room_id.clone());
|
||||||
}
|
}
|
||||||
|
|
@ -425,8 +431,14 @@ pub(crate) async fn sync_events_v4_route(
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut rooms = BTreeMap::new();
|
let mut rooms = BTreeMap::new();
|
||||||
for (room_id, (required_state_request, timeline_limit, roomsince)) in
|
for (
|
||||||
&todo_rooms
|
room_id,
|
||||||
|
TodoRoom {
|
||||||
|
required_state_request,
|
||||||
|
timeline_limit,
|
||||||
|
roomsince,
|
||||||
|
},
|
||||||
|
) in &todo_rooms
|
||||||
{
|
{
|
||||||
let roomsincecount = PduCount::Normal(*roomsince);
|
let roomsincecount = PduCount::Normal(*roomsince);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue