fix: presence timer not working

This commit is contained in:
Holger Huo 2025-01-08 17:57:12 +08:00 committed by strawberry
parent 0074f903d8
commit 6f15c9b3f4
3 changed files with 24 additions and 12 deletions

View file

@ -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 {

View file

@ -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),
};
},
};

View file

@ -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(),