fixes
This commit is contained in:
+29
-8
@@ -36,6 +36,12 @@ pub struct PresenceUser {
|
||||
pub color: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
struct PresenceConnection {
|
||||
identity: String,
|
||||
user: PresenceUser,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum RoomEvent {
|
||||
Document(NoteUpdate),
|
||||
@@ -58,7 +64,7 @@ pub struct AppState {
|
||||
pub anonymous_access_token_ttl_days: i64,
|
||||
pub user_session_ttl_days: i64,
|
||||
channels: RwLock<HashMap<String, broadcast::Sender<RoomEvent>>>,
|
||||
presence: RwLock<HashMap<String, HashMap<u64, PresenceUser>>>,
|
||||
presence: RwLock<HashMap<String, HashMap<u64, PresenceConnection>>>,
|
||||
next_connection_id: AtomicU64,
|
||||
}
|
||||
|
||||
@@ -127,15 +133,20 @@ impl AppState {
|
||||
key: &str,
|
||||
nickname: String,
|
||||
color: Option<String>,
|
||||
identity: Option<String>,
|
||||
) -> (u64, Vec<PresenceUser>) {
|
||||
let id = self.next_connection_id.fetch_add(1, Ordering::Relaxed);
|
||||
let identity = identity.unwrap_or_else(|| format!("connection:{id}"));
|
||||
let mut presence = self.presence.write().await;
|
||||
let room = presence.entry(key.to_owned()).or_default();
|
||||
room.insert(
|
||||
id,
|
||||
PresenceUser {
|
||||
name: nickname,
|
||||
color,
|
||||
PresenceConnection {
|
||||
identity,
|
||||
user: PresenceUser {
|
||||
name: nickname,
|
||||
color,
|
||||
},
|
||||
},
|
||||
);
|
||||
(id, sorted_users(room))
|
||||
@@ -148,8 +159,12 @@ impl AppState {
|
||||
) -> Vec<PresenceUser> {
|
||||
let mut presence = self.presence.write().await;
|
||||
if let Some(room) = presence.get_mut(key) {
|
||||
if let Some(user) = room.get_mut(&id) {
|
||||
user.color = color;
|
||||
if let Some(identity) = room.get(&id).map(|connection| connection.identity.clone()) {
|
||||
for connection in room.values_mut() {
|
||||
if connection.identity == identity {
|
||||
connection.user.color = color.clone();
|
||||
}
|
||||
}
|
||||
}
|
||||
sorted_users(room)
|
||||
} else {
|
||||
@@ -172,8 +187,14 @@ impl AppState {
|
||||
}
|
||||
}
|
||||
|
||||
fn sorted_users(room: &HashMap<u64, PresenceUser>) -> Vec<PresenceUser> {
|
||||
let mut users: Vec<PresenceUser> = room.values().cloned().collect();
|
||||
fn sorted_users(room: &HashMap<u64, PresenceConnection>) -> Vec<PresenceUser> {
|
||||
let mut by_identity: HashMap<&str, PresenceUser> = HashMap::new();
|
||||
for connection in room.values() {
|
||||
by_identity
|
||||
.entry(&connection.identity)
|
||||
.or_insert_with(|| connection.user.clone());
|
||||
}
|
||||
let mut users: Vec<PresenceUser> = by_identity.into_values().collect();
|
||||
users.sort_by_key(|value| value.name.to_lowercase());
|
||||
users
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user