presence: simplify update surface
This commit is contained in:
@@ -28,7 +28,6 @@ pub(crate) async fn set_presence_route(
|
|||||||
body.sender_device.as_deref(),
|
body.sender_device.as_deref(),
|
||||||
&body.presence,
|
&body.presence,
|
||||||
body.status_msg.clone(),
|
body.status_msg.clone(),
|
||||||
PresenceUpdateReason::ClientRequest,
|
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ use tuwunel_core::{
|
|||||||
Error, Result, checked, debug, debug_warn, error,
|
Error, Result, checked, debug, debug_warn, error,
|
||||||
result::LogErr,
|
result::LogErr,
|
||||||
trace,
|
trace,
|
||||||
utils::{future::OptionFutureExt, option::OptionExt},
|
utils::future::OptionFutureExt,
|
||||||
};
|
};
|
||||||
|
|
||||||
use self::{aggregate::PresenceAggregator, data::Data, presence::Presence};
|
use self::{aggregate::PresenceAggregator, data::Data, presence::Presence};
|
||||||
@@ -176,7 +176,6 @@ impl Service {
|
|||||||
currently_active: Option<bool>,
|
currently_active: Option<bool>,
|
||||||
last_active_ago: Option<UInt>,
|
last_active_ago: Option<UInt>,
|
||||||
status_msg: Option<String>,
|
status_msg: Option<String>,
|
||||||
reason: PresenceUpdateReason,
|
|
||||||
refresh_window_ms: Option<u64>,
|
refresh_window_ms: Option<u64>,
|
||||||
) -> Result {
|
) -> Result {
|
||||||
let now = tuwunel_core::utils::millis_since_unix_epoch();
|
let now = tuwunel_core::utils::millis_since_unix_epoch();
|
||||||
@@ -186,7 +185,6 @@ impl Service {
|
|||||||
?state,
|
?state,
|
||||||
currently_active,
|
currently_active,
|
||||||
last_active_ago = last_active_ago.map(u64::from),
|
last_active_ago = last_active_ago.map(u64::from),
|
||||||
?reason,
|
|
||||||
"Presence update received"
|
"Presence update received"
|
||||||
);
|
);
|
||||||
self.device_presence
|
self.device_presence
|
||||||
@@ -262,7 +260,6 @@ impl Service {
|
|||||||
Some(aggregated.currently_active),
|
Some(aggregated.currently_active),
|
||||||
last_active_ago,
|
last_active_ago,
|
||||||
status_msg,
|
status_msg,
|
||||||
reason,
|
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
@@ -334,7 +331,6 @@ impl Service {
|
|||||||
Some(currently_active),
|
Some(currently_active),
|
||||||
UInt::new(0),
|
UInt::new(0),
|
||||||
None,
|
None,
|
||||||
PresenceUpdateReason::Ping,
|
|
||||||
Some(REFRESH_TIMEOUT),
|
Some(REFRESH_TIMEOUT),
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -357,7 +353,6 @@ impl Service {
|
|||||||
device_id: Option<&DeviceId>,
|
device_id: Option<&DeviceId>,
|
||||||
state: &PresenceState,
|
state: &PresenceState,
|
||||||
status_msg: Option<String>,
|
status_msg: Option<String>,
|
||||||
reason: PresenceUpdateReason,
|
|
||||||
) -> Result {
|
) -> Result {
|
||||||
let currently_active = *state == PresenceState::Online;
|
let currently_active = *state == PresenceState::Online;
|
||||||
self.apply_device_presence_update(
|
self.apply_device_presence_update(
|
||||||
@@ -367,7 +362,6 @@ impl Service {
|
|||||||
Some(currently_active),
|
Some(currently_active),
|
||||||
None,
|
None,
|
||||||
status_msg,
|
status_msg,
|
||||||
reason,
|
|
||||||
None,
|
None,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
@@ -381,7 +375,6 @@ impl Service {
|
|||||||
currently_active: bool,
|
currently_active: bool,
|
||||||
last_active_ago: UInt,
|
last_active_ago: UInt,
|
||||||
status_msg: Option<String>,
|
status_msg: Option<String>,
|
||||||
reason: PresenceUpdateReason,
|
|
||||||
) -> Result {
|
) -> Result {
|
||||||
self.apply_device_presence_update(
|
self.apply_device_presence_update(
|
||||||
user_id,
|
user_id,
|
||||||
@@ -390,7 +383,6 @@ impl Service {
|
|||||||
Some(currently_active),
|
Some(currently_active),
|
||||||
Some(last_active_ago),
|
Some(last_active_ago),
|
||||||
status_msg,
|
status_msg,
|
||||||
reason,
|
|
||||||
None,
|
None,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
@@ -416,56 +408,12 @@ impl Service {
|
|||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
if let Some(count) = count {
|
if let Some(count) = count {
|
||||||
if (self.timeout_remote_users || self.services.globals.user_is_local(user_id))
|
let is_local = self.services.globals.user_is_local(user_id);
|
||||||
&& user_id != self.services.globals.server_user
|
let is_server_user = user_id == self.services.globals.server_user;
|
||||||
{
|
let allow_timeout = self.timeout_remote_users || is_local;
|
||||||
let timeout = match presence_state {
|
|
||||||
| PresenceState::Online =>
|
|
||||||
self.services
|
|
||||||
.server
|
|
||||||
.config
|
|
||||||
.presence_idle_timeout_s,
|
|
||||||
| _ =>
|
|
||||||
self.services
|
|
||||||
.server
|
|
||||||
.config
|
|
||||||
.presence_offline_timeout_s,
|
|
||||||
};
|
|
||||||
|
|
||||||
let timeout_kind = match presence_state {
|
|
||||||
| PresenceState::Online => "idle_timeout_s",
|
|
||||||
| _ => "offline_timeout_s",
|
|
||||||
};
|
|
||||||
|
|
||||||
debug!(
|
|
||||||
?user_id,
|
|
||||||
?presence_state,
|
|
||||||
currently_active,
|
|
||||||
last_active_ago = last_active_ago.map(u64::from),
|
|
||||||
status_msg = status_msg_log.as_deref(),
|
|
||||||
count,
|
|
||||||
timeout_s = timeout,
|
|
||||||
timeout_kind,
|
|
||||||
timeout_remote_users = self.timeout_remote_users,
|
|
||||||
is_local,
|
|
||||||
is_server_user,
|
|
||||||
"Scheduling presence timer"
|
|
||||||
);
|
|
||||||
|
|
||||||
|
if allow_timeout && !is_server_user {
|
||||||
self.schedule_presence_timer(user_id, presence_state, count)?;
|
self.schedule_presence_timer(user_id, presence_state, count)?;
|
||||||
} else {
|
|
||||||
debug!(
|
|
||||||
?user_id,
|
|
||||||
?presence_state,
|
|
||||||
currently_active,
|
|
||||||
last_active_ago = last_active_ago.map(u64::from),
|
|
||||||
status_msg = status_msg_log.as_deref(),
|
|
||||||
count,
|
|
||||||
timeout_remote_users = self.timeout_remote_users,
|
|
||||||
is_local,
|
|
||||||
is_server_user,
|
|
||||||
"Presence timer not scheduled"
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -597,19 +545,12 @@ impl Service {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if let Some(new_state) = new_state {
|
if let Some(new_state) = new_state {
|
||||||
let reason = match new_state {
|
|
||||||
| PresenceState::Unavailable => PresenceUpdateReason::TimerIdle,
|
|
||||||
| PresenceState::Offline => PresenceUpdateReason::TimerOffline,
|
|
||||||
| _ => PresenceUpdateReason::Ping,
|
|
||||||
};
|
|
||||||
|
|
||||||
self.set_presence(
|
self.set_presence(
|
||||||
user_id,
|
user_id,
|
||||||
&new_state,
|
&new_state,
|
||||||
Some(false),
|
Some(false),
|
||||||
last_active_ago,
|
last_active_ago,
|
||||||
status_msg,
|
status_msg,
|
||||||
reason,
|
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
}
|
}
|
||||||
@@ -624,12 +565,6 @@ impl Service {
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
let reason = match aggregated.state {
|
|
||||||
| PresenceState::Unavailable => PresenceUpdateReason::TimerIdle,
|
|
||||||
| PresenceState::Offline => PresenceUpdateReason::TimerOffline,
|
|
||||||
| _ => PresenceUpdateReason::Ping,
|
|
||||||
};
|
|
||||||
|
|
||||||
let status_msg = aggregated.status_msg.or_else(|| presence.status_msg());
|
let status_msg = aggregated.status_msg.or_else(|| presence.status_msg());
|
||||||
let last_active_ago =
|
let last_active_ago =
|
||||||
Some(UInt::new_saturating(now.saturating_sub(aggregated.last_active_ts)));
|
Some(UInt::new_saturating(now.saturating_sub(aggregated.last_active_ts)));
|
||||||
@@ -640,7 +575,6 @@ impl Service {
|
|||||||
Some(aggregated.currently_active),
|
Some(aggregated.currently_active),
|
||||||
last_active_ago,
|
last_active_ago,
|
||||||
status_msg,
|
status_msg,
|
||||||
reason,
|
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user