重构组件样式系统为玻璃态设计风格并优化交互动效
Some checks failed
CI / Check / macos-latest (push) Has been cancelled
CI / Check / ubuntu-latest (push) Has been cancelled
CI / Check / windows-latest (push) Has been cancelled
CI / Test / macos-latest (push) Has been cancelled
CI / Test / ubuntu-latest (push) Has been cancelled
CI / Test / windows-latest (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Format (push) Has been cancelled
CI / Security Audit (push) Has been cancelled
CI / Secrets Scan (push) Has been cancelled
CI / Install Script Smoke Test (push) Has been cancelled
Some checks failed
CI / Check / macos-latest (push) Has been cancelled
CI / Check / ubuntu-latest (push) Has been cancelled
CI / Check / windows-latest (push) Has been cancelled
CI / Test / macos-latest (push) Has been cancelled
CI / Test / ubuntu-latest (push) Has been cancelled
CI / Test / windows-latest (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Format (push) Has been cancelled
CI / Security Audit (push) Has been cancelled
CI / Secrets Scan (push) Has been cancelled
CI / Install Script Smoke Test (push) Has been cancelled
This commit is contained in:
@@ -360,14 +360,25 @@ impl PresenceManager {
|
||||
.clone();
|
||||
|
||||
// Check if user is already in another session
|
||||
if let Some(existing_user) = self.users.get(&connection_id) {
|
||||
if existing_user.session_id != session_id {
|
||||
// Leave the previous session first
|
||||
self.leave_session(connection_id)?;
|
||||
} else {
|
||||
// Already in this session
|
||||
return Ok(existing_user.clone());
|
||||
// Note: We need to clone the data and drop the reference before calling leave_session
|
||||
// to avoid a deadlock with DashMap
|
||||
let should_leave = {
|
||||
let user_ref = self.users.get(&connection_id);
|
||||
match user_ref {
|
||||
Some(u) => {
|
||||
if u.session_id == session_id {
|
||||
// Already in this session - return the user
|
||||
return Ok(u.clone());
|
||||
}
|
||||
true // Need to leave the old session
|
||||
}
|
||||
None => false
|
||||
}
|
||||
};
|
||||
// user_ref is now dropped, we can safely call leave_session
|
||||
|
||||
if should_leave {
|
||||
self.leave_session(connection_id)?;
|
||||
}
|
||||
|
||||
// Check max participants
|
||||
@@ -535,11 +546,11 @@ impl PresenceManager {
|
||||
for mut entry in self.users.iter_mut() {
|
||||
let user = entry.value_mut();
|
||||
let elapsed = now.signed_duration_since(user.last_activity);
|
||||
let elapsed_secs = elapsed.num_seconds() as u64;
|
||||
let elapsed_ms = elapsed.num_milliseconds() as u128;
|
||||
|
||||
let new_status = if elapsed_secs > self.config.away_timeout.as_secs() {
|
||||
let new_status = if elapsed_ms > self.config.away_timeout.as_millis() {
|
||||
PresenceStatus::Away
|
||||
} else if elapsed_secs > self.config.idle_timeout.as_secs() {
|
||||
} else if elapsed_ms > self.config.idle_timeout.as_millis() {
|
||||
PresenceStatus::Idle
|
||||
} else {
|
||||
PresenceStatus::Active
|
||||
@@ -566,8 +577,9 @@ impl PresenceManager {
|
||||
for entry in self.users.iter() {
|
||||
let user = entry.value();
|
||||
let elapsed = now.signed_duration_since(user.last_activity);
|
||||
let elapsed_ms = elapsed.num_milliseconds() as u64;
|
||||
|
||||
if elapsed.num_seconds() as u64 > self.config.cleanup_timeout.as_secs() {
|
||||
if u128::from(elapsed_ms) > self.config.cleanup_timeout.as_millis() {
|
||||
removed.push(user.connection_id);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user