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 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 { Ok(get_presence::v3::Response {
// TODO: Should ruma just use the presenceeventcontent type here? // TODO: Should ruma just use the presenceeventcontent type here?
status_msg, status_msg,
currently_active: presence.content.currently_active, currently_active: presence.content.currently_active,
last_active_ago: presence last_active_ago,
.content
.last_active_ago
.map(|millis| Duration::from_millis(millis.into())),
presence: presence.content.presence, presence: presence.content.presence,
}) })
} else { } else {

View file

@ -382,7 +382,16 @@ async fn process_presence_updates(
.ready_fold(PresenceUpdates::new(), |mut updates, (user_id, event)| { .ready_fold(PresenceUpdates::new(), |mut updates, (user_id, event)| {
match updates.entry(user_id.into()) { match updates.entry(user_id.into()) {
| Entry::Vacant(slot) => { | 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) => { | Entry::Occupied(mut slot) => {
let curr_event = slot.get_mut(); let curr_event = slot.get_mut();
@ -394,8 +403,6 @@ async fn process_presence_updates(
curr_content.status_msg = new_content curr_content.status_msg = new_content
.status_msg .status_msg
.or_else(|| curr_content.status_msg.take()); .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 curr_content.displayname = new_content
.displayname .displayname
.or_else(|| curr_content.displayname.take()); .or_else(|| curr_content.displayname.take());
@ -405,6 +412,10 @@ async fn process_presence_updates(
curr_content.currently_active = new_content curr_content.currently_active = new_content
.currently_active .currently_active
.or(curr_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, users: &users::Service,
) -> PresenceEvent { ) -> PresenceEvent {
let now = utils::millis_since_unix_epoch(); let now = utils::millis_since_unix_epoch();
let last_active_ago = if self.currently_active { let last_active_ago = Some(UInt::new_saturating(now.saturating_sub(self.last_active_ts)));
None
} else {
Some(UInt::new_saturating(now.saturating_sub(self.last_active_ts)))
};
PresenceEvent { PresenceEvent {
sender: user_id.to_owned(), sender: user_id.to_owned(),