diff --git a/src/service/presence/mod.rs b/src/service/presence/mod.rs index 3b0bdd159..a6eb1bcd8 100644 --- a/src/service/presence/mod.rs +++ b/src/service/presence/mod.rs @@ -170,6 +170,44 @@ impl Service { self.db.remove_presence(user_id).await; } + // Unset online/unavailable presence to offline on startup + pub async fn unset_all_presence(&self) -> Result<()> { + for user_id in &self + .services + .users + .list_local_users() + .map(UserId::to_owned) + .collect::>() + .await + { + let presence = self.db.get_presence(user_id).await; + + let presence = match presence { + | Ok((_, ref presence)) => &presence.content, + | _ => return Ok(()), + }; + + let need_reset = match presence.presence { + | PresenceState::Unavailable | PresenceState::Online => true, + | _ => false, + }; + + if !need_reset { + return Ok(()); + } + + self.set_presence( + user_id, + &PresenceState::Offline, + Some(false), + presence.last_active_ago, + presence.status_msg.clone(), + ) + .await?; + } + Ok(()) + } + /// Returns the most recent presence updates that happened after the event /// with id `since`. pub fn presence_since( diff --git a/src/service/services.rs b/src/service/services.rs index 9f9d10f54..241519479 100644 --- a/src/service/services.rs +++ b/src/service/services.rs @@ -123,6 +123,11 @@ impl Services { .start() .await?; + // clear online statuses + if self.server.config.allow_local_presence { + _ = self.presence.unset_all_presence().await; + } + // set the server user as online if self.server.config.allow_local_presence { _ = self