Skip to content

Commit

Permalink
refactor presence to not involve rooms.
Browse files Browse the repository at this point in the history
Signed-off-by: Jason Volk <[email protected]>
  • Loading branch information
jevolk committed Apr 4, 2024
1 parent 4b62f72 commit 020f923
Show file tree
Hide file tree
Showing 11 changed files with 262 additions and 280 deletions.
21 changes: 5 additions & 16 deletions src/api/client_server/presence.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {})
}
Expand All @@ -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;
}
Expand Down
20 changes: 12 additions & 8 deletions src/api/client_server/profile.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {})
}
Expand Down Expand Up @@ -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 {})
}
Expand Down
32 changes: 21 additions & 11 deletions src/api/client_server/sync.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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?;
}
}
}

Expand Down Expand Up @@ -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);
Expand Down
17 changes: 7 additions & 10 deletions src/api/server_server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -338,16 +338,13 @@ pub async fn send_transaction_message_route(
}

for update in presence.push {
for room_id in services().rooms.state_cache.rooms_joined(&update.user_id) {
services().presence.set_presence(
&room_id?,
&update.user_id,
update.presence.clone(),
Some(update.currently_active),
Some(update.last_active_ago),
update.status_msg.clone(),
)?;
}
services().presence.set_presence(
&update.user_id,
&update.presence,
Some(update.currently_active),
Some(update.last_active_ago),
update.status_msg.clone(),
)?;
}
},
Edu::Receipt(receipt) => {
Expand Down
6 changes: 4 additions & 2 deletions src/config/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,8 @@ pub struct Config {
pub presence_idle_timeout_s: u64,
#[serde(default = "default_presence_offline_timeout_s")]
pub presence_offline_timeout_s: u64,
#[serde(default = "true_fn")]
pub presence_timeout_remote_users: bool,

#[serde(default = "true_fn")]
pub allow_incoming_read_receipts: bool,
Expand Down Expand Up @@ -718,9 +720,9 @@ fn default_notification_push_path() -> String { "/_matrix/push/v1/notify".to_own

fn default_turn_ttl() -> u64 { 60 * 60 * 24 }

fn default_presence_idle_timeout_s() -> u64 { 2 * 60 }
fn default_presence_idle_timeout_s() -> u64 { 5 * 60 }

fn default_presence_offline_timeout_s() -> u64 { 15 * 60 }
fn default_presence_offline_timeout_s() -> u64 { 30 * 60 }

fn default_typing_federation_timeout_s() -> u64 { 30 }

Expand Down
Loading

0 comments on commit 020f923

Please sign in to comment.