From e8faca34e22a9ba31d6b9a42fb75fe17a7f1c05d Mon Sep 17 00:00:00 2001 From: Alex Emmet <111742636+Alex-Emmet@users.noreply.github.com> Date: Wed, 28 Jan 2026 13:22:04 +0100 Subject: [PATCH] [Fix] Anonymous users now have names --- .../anonymous_client_connection.rs | 6 +++-- src/anonymous_clients/anonymous_manager.rs | 19 ++++++++++++-- src/omega/omega_connection.rs | 26 +++++++++++++++++++ 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/src/anonymous_clients/anonymous_client_connection.rs b/src/anonymous_clients/anonymous_client_connection.rs index 9df3bf1..3d11cb3 100644 --- a/src/anonymous_clients/anonymous_client_connection.rs +++ b/src/anonymous_clients/anonymous_client_connection.rs @@ -10,6 +10,7 @@ use tokio_util::compat::Compat; use tungstenite::Utf8Bytes; use uuid::Uuid; +use crate::anonymous_clients::anonymous_manager::generate_username; use crate::calls::call_manager; use crate::data::{ communication::{CommunicationType, CommunicationValue, DataTypes}, @@ -38,6 +39,7 @@ impl AnonymousClientConnection { sender: WebSocketSender>, receiver: WebSocketReceiver>, ) -> Arc { + let username: String = generate_username(); Arc::new(Self { sender: Arc::new(RwLock::new(sender)), receiver: Arc::new(RwLock::new(receiver)), @@ -50,8 +52,8 @@ impl AnonymousClientConnection { ping: Arc::new(RwLock::new(-1)), interested_users: Arc::new(RwLock::new(Vec::new())), is_open: Arc::new(RwLock::new(true)), - user_name: Arc::new(RwLock::new(String::new())), - display_name: Arc::new(RwLock::new(String::new())), + user_name: Arc::new(RwLock::new(username.to_lowercase())), + display_name: Arc::new(RwLock::new(username)), avatar: Arc::new(RwLock::new(String::new())), }) } diff --git a/src/anonymous_clients/anonymous_manager.rs b/src/anonymous_clients/anonymous_manager.rs index 6fb3521..b72bb30 100644 --- a/src/anonymous_clients/anonymous_manager.rs +++ b/src/anonymous_clients/anonymous_manager.rs @@ -1,7 +1,8 @@ -use std::sync::Arc; - use dashmap::DashMap; use once_cell::sync::Lazy; +use rand::Rng; +use rand::seq::SliceRandom; +use std::sync::Arc; use crate::anonymous_clients::anonymous_client_connection::AnonymousClientConnection; @@ -34,3 +35,17 @@ pub async fn get_anonymous_user_by_name( return None; } + +// TODO: implement check if taken +pub fn generate_username() -> String { + let adjectives = ["Swift", "Clever", "Brave", "Sneaky", "Fierce"]; + let nouns = ["Tiger", "Eagle", "Shark", "Wolf", "Dragon"]; + + let mut rng = rand::thread_rng(); + let adj = adjectives.choose(&mut rng).unwrap(); + let noun = nouns.choose(&mut rng).unwrap(); + + let number: u16 = rng.gen_range(0..10000); + + format!("{}{}{}", adj, noun, number) +} diff --git a/src/omega/omega_connection.rs b/src/omega/omega_connection.rs index 9d89561..162767b 100755 --- a/src/omega/omega_connection.rs +++ b/src/omega/omega_connection.rs @@ -401,11 +401,37 @@ impl OmegaConnection { OMEGA_CONNECTION.send_message(&cv).await; } + pub async fn await_connection(&self, timeout_duration: Option) -> Result<(), String> { + if *self.is_connected.read().await { + return Ok(()); + } + let timeout = timeout_duration.unwrap_or(Duration::from_secs(10)); + + let start = Instant::now(); + loop { + { + if *self.is_connected.read().await { + return Ok(()); + } + } + + if start.elapsed() >= timeout { + return Err(format!( + "Connection not established within {} seconds", + timeout.as_secs() + )); + } + + sleep(Duration::from_millis(100)).await; // short interval polling + } + } + pub async fn await_response( &self, cv: &CommunicationValue, timeout_duration: Option, ) -> Result { + let _ = self.await_connection(timeout_duration).await; let (tx, mut rx) = mpsc::channel(1); let msg_id = cv.get_id();