diff options
author | Dennis Kobert <d-kobert@web.de> | 2019-06-11 23:50:39 +0200 |
---|---|---|
committer | Dennis Kobert <d-kobert@web.de> | 2019-06-11 23:50:39 +0200 |
commit | c28c9fafa2c74b101f7ce777aac722dcdeecefc6 (patch) | |
tree | a91f7c7db62c4191cf5788d6c4909c87ac4302c8 /game_server/src/scribble_group.rs | |
parent | aec4f2e64ac4fb44bf14b026ac22b326e7007d02 (diff) | |
parent | 286be2a2fe89927c1a7bb6855b3d001a70dd312d (diff) |
Merge branch 'webhogg'
Diffstat (limited to 'game_server/src/scribble_group.rs')
-rw-r--r-- | game_server/src/scribble_group.rs | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/game_server/src/scribble_group.rs b/game_server/src/scribble_group.rs new file mode 100644 index 0000000..8980e7b --- /dev/null +++ b/game_server/src/scribble_group.rs @@ -0,0 +1,65 @@ +use crate::group::{Group, GroupId}; +use crate::server::{UserId, GameClient, + ClientSender, ClientReceiver, + GameServerError}; +use std::collections::HashMap; +use std::sync::{Arc, Mutex}; + +pub struct ScribbleGroup { + id: GroupId, + name: String, + senders: Arc<Mutex<HashMap<UserId, ClientSender>>> +} + +impl Group for ScribbleGroup { + fn id(&self) -> GroupId { + self.id + } + + fn group_type(&self) -> String { + "scribble".to_string() + } + + fn name(&self) -> String { + self.name.clone() + } + + fn run(&mut self) { + info!("a new group {}:'{}' runs now", self.id, self.name); + } + + fn add_client(&mut self, id: UserId, client: GameClient) -> Result<(), GameServerError> { + debug!("user {} joined the group {}:'{}'", id, self.id, self.name); + let (sen, rec) = client.split(); + self.senders.lock().unwrap().insert(id, sen); + let senders_mutex = self.senders.clone(); + let self_uid = id; + std::thread::spawn(move || Self::broadcast_clients(self_uid, rec, senders_mutex)); + Ok(()) + } +} + +impl ScribbleGroup { + pub fn new(id: GroupId, name: String) -> Self { + Self { id, name, senders: Arc::new(Mutex::new(HashMap::new())) } + } + + fn broadcast_clients(self_uid: UserId, mut rec: ClientReceiver, senders_mutex: Arc<Mutex<HashMap<UserId, ClientSender>>>) { + loop { + let message = match rec.recv_message() { + Ok(x) => x, + _ => break + }; + //trace!("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) + .unwrap_or_else(|_| debug!("tried to send message to {}, but failed", *uid)); + } + } + } + senders_mutex.lock().unwrap().remove(&self_uid); + info!("client {} has left", self_uid); + } +} |