diff --git a/src/api/client/presence.rs b/src/api/client/presence.rs index 1a3ad26e..d19e6ae1 100644 --- a/src/api/client/presence.rs +++ b/src/api/client/presence.rs @@ -82,14 +82,19 @@ pub(crate) async fn get_presence_route( presence.content.status_msg }; + let last_active_ago = match presence.content.currently_active { + | Some(true) => None, + | _ => presence + .content + .last_active_ago + .map(|millis| Duration::from_millis(millis.into())), + }; + Ok(get_presence::v3::Response { // TODO: Should ruma just use the presenceeventcontent type here? status_msg, currently_active: presence.content.currently_active, - last_active_ago: presence - .content - .last_active_ago - .map(|millis| Duration::from_millis(millis.into())), + last_active_ago, presence: presence.content.presence, }) } else { diff --git a/src/api/client/sync/v3.rs b/src/api/client/sync/v3.rs index b7ecd6b9..910a15d4 100644 --- a/src/api/client/sync/v3.rs +++ b/src/api/client/sync/v3.rs @@ -382,7 +382,16 @@ async fn process_presence_updates( .ready_fold(PresenceUpdates::new(), |mut updates, (user_id, event)| { match updates.entry(user_id.into()) { | Entry::Vacant(slot) => { - slot.insert(event); + let mut new_event = event; + new_event.content.last_active_ago = match new_event.content.currently_active { + | Some(true) => None, + | _ => new_event + .content + .last_active_ago + .or(new_event.content.last_active_ago), + }; + + slot.insert(new_event); }, | Entry::Occupied(mut slot) => { let curr_event = slot.get_mut(); @@ -394,8 +403,6 @@ async fn process_presence_updates( curr_content.status_msg = new_content .status_msg .or_else(|| curr_content.status_msg.take()); - curr_content.last_active_ago = - new_content.last_active_ago.or(curr_content.last_active_ago); curr_content.displayname = new_content .displayname .or_else(|| curr_content.displayname.take()); @@ -405,6 +412,10 @@ async fn process_presence_updates( curr_content.currently_active = new_content .currently_active .or(curr_content.currently_active); + curr_content.last_active_ago = match curr_content.currently_active { + | Some(true) => None, + | _ => new_content.last_active_ago.or(curr_content.last_active_ago), + }; }, }; diff --git a/src/service/presence/presence.rs b/src/service/presence/presence.rs index b88a004b..b322dfb4 100644 --- a/src/service/presence/presence.rs +++ b/src/service/presence/presence.rs @@ -46,11 +46,7 @@ impl Presence { users: &users::Service, ) -> PresenceEvent { let now = utils::millis_since_unix_epoch(); - let last_active_ago = if self.currently_active { - None - } else { - Some(UInt::new_saturating(now.saturating_sub(self.last_active_ts))) - }; + let last_active_ago = Some(UInt::new_saturating(now.saturating_sub(self.last_active_ts))); PresenceEvent { sender: user_id.to_owned(),