refactor presence to not involve rooms.
Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
parent
885224ab76
commit
ca1c77d76b
11 changed files with 263 additions and 281 deletions
|
@ -16,18 +16,9 @@ pub async fn set_presence_route(body: Ruma<set_presence::v3::Request>) -> Result
|
|||
}
|
||||
|
||||
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
|
||||
for room_id in services().rooms.state_cache.rooms_joined(sender_user) {
|
||||
let room_id = room_id?;
|
||||
|
||||
services().presence.set_presence(
|
||||
&room_id,
|
||||
sender_user,
|
||||
body.presence.clone(),
|
||||
None,
|
||||
None,
|
||||
body.status_msg.clone(),
|
||||
)?;
|
||||
}
|
||||
services()
|
||||
.presence
|
||||
.set_presence(sender_user, &body.presence, None, None, body.status_msg.clone())?;
|
||||
|
||||
Ok(set_presence::v3::Response {})
|
||||
}
|
||||
|
@ -46,14 +37,12 @@ pub async fn get_presence_route(body: Ruma<get_presence::v3::Request>) -> Result
|
|||
|
||||
let mut presence_event = None;
|
||||
|
||||
for room_id in services()
|
||||
for _room_id in services()
|
||||
.rooms
|
||||
.user
|
||||
.get_shared_rooms(vec![sender_user.clone(), body.user_id.clone()])?
|
||||
{
|
||||
let room_id = room_id?;
|
||||
|
||||
if let Some(presence) = services().presence.get_presence(&room_id, sender_user)? {
|
||||
if let Some(presence) = services().presence.get_presence(sender_user)? {
|
||||
presence_event = Some(presence);
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -86,10 +86,12 @@ pub async fn set_displayname_route(
|
|||
.await;
|
||||
}
|
||||
|
||||
// Presence update
|
||||
services()
|
||||
.presence
|
||||
.ping_presence(sender_user, PresenceState::Online)?;
|
||||
if services().globals.allow_local_presence() {
|
||||
// Presence update
|
||||
services()
|
||||
.presence
|
||||
.ping_presence(sender_user, &PresenceState::Online)?;
|
||||
}
|
||||
|
||||
Ok(set_display_name::v3::Response {})
|
||||
}
|
||||
|
@ -224,10 +226,12 @@ pub async fn set_avatar_url_route(body: Ruma<set_avatar_url::v3::Request>) -> Re
|
|||
.await;
|
||||
}
|
||||
|
||||
// Presence update
|
||||
services()
|
||||
.presence
|
||||
.ping_presence(sender_user, PresenceState::Online)?;
|
||||
if services().globals.allow_local_presence() {
|
||||
// Presence update
|
||||
services()
|
||||
.presence
|
||||
.ping_presence(sender_user, &PresenceState::Online)?;
|
||||
}
|
||||
|
||||
Ok(set_avatar_url::v3::Response {})
|
||||
}
|
||||
|
|
|
@ -171,9 +171,11 @@ async fn sync_helper(
|
|||
// bool = caching allowed
|
||||
) -> Result<(sync_events::v3::Response, bool), Error> {
|
||||
// Presence update
|
||||
services()
|
||||
.presence
|
||||
.ping_presence(&sender_user, body.set_presence)?;
|
||||
if services().globals.allow_local_presence() {
|
||||
services()
|
||||
.presence
|
||||
.ping_presence(&sender_user, &body.set_presence)?;
|
||||
}
|
||||
|
||||
// Setup watchers, so if there's no response, we can wait for them
|
||||
let watcher = services().globals.watch(&sender_user, &sender_device);
|
||||
|
@ -222,6 +224,10 @@ async fn sync_helper(
|
|||
.filter_map(Result::ok),
|
||||
);
|
||||
|
||||
if services().globals.allow_local_presence() {
|
||||
process_presence_updates(&mut presence_updates, since, &sender_user).await?;
|
||||
}
|
||||
|
||||
let all_joined_rooms = services()
|
||||
.rooms
|
||||
.state_cache
|
||||
|
@ -252,10 +258,6 @@ async fn sync_helper(
|
|||
if !joined_room.is_empty() {
|
||||
joined_rooms.insert(room_id.clone(), joined_room);
|
||||
}
|
||||
|
||||
if services().globals.allow_local_presence() {
|
||||
process_room_presence_updates(&mut presence_updates, &room_id, since).await?;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -522,11 +524,19 @@ async fn sync_helper(
|
|||
}
|
||||
}
|
||||
|
||||
async fn process_room_presence_updates(
|
||||
presence_updates: &mut HashMap<OwnedUserId, PresenceEvent>, room_id: &RoomId, since: u64,
|
||||
async fn process_presence_updates(
|
||||
presence_updates: &mut HashMap<OwnedUserId, PresenceEvent>, since: u64, syncing_user: &OwnedUserId,
|
||||
) -> Result<()> {
|
||||
// Take presence updates from this room
|
||||
for (user_id, _, presence_event) in services().presence.presence_since(room_id, since) {
|
||||
// Take presence updates
|
||||
for (user_id, _, presence_event) in services().presence.presence_since(since) {
|
||||
if !services()
|
||||
.rooms
|
||||
.state_cache
|
||||
.user_sees_user(syncing_user, &user_id)?
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
match presence_updates.entry(user_id) {
|
||||
Entry::Vacant(slot) => {
|
||||
slot.insert(presence_event);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue