summaryrefslogtreecommitdiff
path: root/game_server/src/scribble_group.rs
diff options
context:
space:
mode:
Diffstat (limited to 'game_server/src/scribble_group.rs')
-rw-r--r--game_server/src/scribble_group.rs29
1 files changed, 21 insertions, 8 deletions
diff --git a/game_server/src/scribble_group.rs b/game_server/src/scribble_group.rs
index c240264..e68c6df 100644
--- a/game_server/src/scribble_group.rs
+++ b/game_server/src/scribble_group.rs
@@ -1,11 +1,13 @@
use super::group::{Group, GroupId};
-use super::server::{UserId, GameClient};
+use super::server::{UserId, GameClient,
+ ClientSender, ClientReceiver};
use std::collections::HashMap;
+use std::sync::{Arc, Mutex};
pub struct ScribbleGroup {
id: GroupId,
name: String,
- clients: HashMap<UserId, GameClient>
+ senders: Arc<Mutex<HashMap<UserId, ClientSender>>>
}
impl Group for ScribbleGroup {
@@ -27,16 +29,27 @@ impl Group for ScribbleGroup {
fn add_client(&mut self, id: UserId, client: GameClient) {
debug!("user {} joined the group {}:'{}'", id, self.id, self.name);
- self.clients.insert(id, client);
- }
-
- fn get_client(&self, client_id: UserId) -> Option<&GameClient> {
- self.clients.get(&client_id)
+ let (sen, mut rec) = client.split();
+ self.senders.lock().unwrap().insert(id, sen);
+ let senders_mutex = self.senders.clone();
+ let self_uid = id;
+ std::thread::spawn(move || {
+ loop {
+ let message = rec.recv_message().unwrap();
+ info!("got message: '{:?}'", message);
+ let mut senders = senders_mutex.lock().unwrap();
+ for (uid, sender) in senders.iter_mut() {
+ if self_uid != *uid {
+ sender.send_message(&message);
+ }
+ }
+ }
+ });
}
}
impl ScribbleGroup {
pub fn new(id: GroupId, name: String) -> Self {
- Self { id, name, clients: HashMap::new() }
+ Self { id, name, senders: Arc::new(Mutex::new(HashMap::new())) }
}
}