diff options
author | Dennis Kobert <d-kobert@web.de> | 2019-05-31 16:44:02 +0200 |
---|---|---|
committer | Dennis Kobert <d-kobert@web.de> | 2019-05-31 16:44:02 +0200 |
commit | c1e589d622ebb2e2209e2e984d141d185d32ee87 (patch) | |
tree | 5e52ff4d3342cad60b3d201427b006c5c043f61e /game_server/src | |
parent | 4cdb0d88a065df2456b3e12389836eebc9b2fa4a (diff) | |
parent | 3527f10f8767b3b62b876f8a3f3bc5bd3ba56b2d (diff) |
Merge branch 'wasm' into webhogg
Diffstat (limited to 'game_server/src')
-rw-r--r-- | game_server/src/backend_connection.rs | 4 | ||||
-rw-r--r-- | game_server/src/group.rs | 4 | ||||
-rw-r--r-- | game_server/src/lobby.rs | 16 | ||||
-rw-r--r-- | game_server/src/scribble_group.rs | 50 | ||||
-rw-r--r-- | game_server/src/server.rs | 40 | ||||
-rw-r--r-- | game_server/src/webhogg_group.rs | 4 |
6 files changed, 71 insertions, 47 deletions
diff --git a/game_server/src/backend_connection.rs b/game_server/src/backend_connection.rs index d32c58e..a751b30 100644 --- a/game_server/src/backend_connection.rs +++ b/game_server/src/backend_connection.rs @@ -1,8 +1,8 @@ use reqwest::{Response, Client, Url, UrlError, Error as ReqError}; use std::sync::mpsc::{Sender, Receiver}; use std::sync::mpsc; -use super::server::{UserId, Token}; -use super::group::GroupId; +use crate::server::{UserId, Token}; +use crate::group::GroupId; pub struct BackendConnection { host: String, diff --git a/game_server/src/group.rs b/game_server/src/group.rs index fcda12a..74a04f7 100644 --- a/game_server/src/group.rs +++ b/game_server/src/group.rs @@ -1,4 +1,4 @@ -use super::server::{UserId, GameClient}; +use crate::server::{UserId, GameClient, GameServerError}; pub type GroupId = u32; @@ -9,5 +9,5 @@ pub trait Group { fn run(&mut self); - fn add_client(&mut self, id: UserId, client: GameClient); + fn add_client(&mut self, id: UserId, client: GameClient) -> Result<(), GameServerError>; } diff --git a/game_server/src/lobby.rs b/game_server/src/lobby.rs index d03bd45..6d11a5f 100644 --- a/game_server/src/lobby.rs +++ b/game_server/src/lobby.rs @@ -1,14 +1,15 @@ use std::collections::HashMap; -use super::group::{Group, GroupId}; -use super::scribble_group::ScribbleGroup; +use crate::group::{Group, GroupId}; +use crate::scribble_group::ScribbleGroup; -use super::server::{UserId, GameClient}; +use crate::server::{UserId, GameClient, GameServerError}; pub struct Lobby { groups: HashMap<GroupId, Box<Group>>, } +#[allow(dead_code)] impl Lobby { pub fn new() -> Self { Self { @@ -21,7 +22,7 @@ impl Lobby { "scribble" => { Some(Box::new(ScribbleGroup::new(id, name.to_string()))) }, - other => None, + _ => None, } } @@ -30,17 +31,17 @@ impl Lobby { } pub fn add_client(&mut self, group_type: &str, group_id: GroupId, group_name: &str, - user_id: UserId, client: GameClient) { + user_id: UserId, client: GameClient) -> Result<(), GameServerError> { if !self.groups.contains_key(&group_id) { let mut group = match Self::generate_group(group_type, group_id, group_name) { Some(x) => x, - _ => return, + _ => return Err(GameServerError::GroupCreationError(format!("failed to generate '{}' group", group_type))), }; group.run(); self.groups.insert(group_id, group); } let group = self.groups.get_mut(&group_id).unwrap(); - group.add_client(user_id, client); + group.add_client(user_id, client) } pub fn iter<'b>(&'b self) -> GroupIterator<'b> { @@ -48,6 +49,7 @@ impl Lobby { } } +#[allow(dead_code)] pub struct GroupIterator<'a> { groups: std::collections::hash_map::Values<'a, GroupId, Box<Group>> } diff --git a/game_server/src/scribble_group.rs b/game_server/src/scribble_group.rs index 01090de..8980e7b 100644 --- a/game_server/src/scribble_group.rs +++ b/game_server/src/scribble_group.rs @@ -1,6 +1,7 @@ -use super::group::{Group, GroupId}; -use super::server::{UserId, GameClient, - ClientSender, ClientReceiver}; +use crate::group::{Group, GroupId}; +use crate::server::{UserId, GameClient, + ClientSender, ClientReceiver, + GameServerError}; use std::collections::HashMap; use std::sync::{Arc, Mutex}; @@ -27,30 +28,14 @@ impl Group for ScribbleGroup { info!("a new group {}:'{}' runs now", self.id, self.name); } - fn add_client(&mut self, id: UserId, client: GameClient) { + fn add_client(&mut self, id: UserId, client: GameClient) -> Result<(), GameServerError> { debug!("user {} joined the group {}:'{}'", id, self.id, self.name); - let (sen, mut rec) = client.split(); + 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 || { - 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); - }); + std::thread::spawn(move || Self::broadcast_clients(self_uid, rec, senders_mutex)); + Ok(()) } } @@ -58,4 +43,23 @@ 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); + } } diff --git a/game_server/src/server.rs b/game_server/src/server.rs index 6294e2c..5b1a7a9 100644 --- a/game_server/src/server.rs +++ b/game_server/src/server.rs @@ -8,9 +8,8 @@ use websocket::{OwnedMessage, use std::net::{SocketAddr, ToSocketAddrs, TcpStream}; use std::sync::{mpsc, mpsc::{Sender, Receiver}}; -use std::collections::HashMap; -use super::lobby::Lobby; -use super::backend_connection::BackendConnection; +use crate::lobby::Lobby; +use crate::backend_connection::BackendConnection; pub type ClientReceiver = receiver::Reader<<TcpStream as Splittable>::Reader>; pub type ClientSender = sender::Writer<<TcpStream as Splittable>::Writer>; @@ -25,7 +24,22 @@ pub enum GameServerError { BindError(std::io::Error), HandshakeRequestError, InvalidProtocolError, - AcceptError(std::io::Error) + AcceptError(std::io::Error), + GroupError(String), + GroupCreationError(String), +} + +impl std::fmt::Display for GameServerError { + fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { + match self { + GameServerError::BindError(e) => write!(f, "BindError: {}", e), + GameServerError::HandshakeRequestError => write!(f, "HandshakeRequestError"), + GameServerError::InvalidProtocolError => write!(f, "InvalidProtocolError"), + GameServerError::AcceptError(e) => write!(f, "AcceptError: {}", e), + GameServerError::GroupError(e) => write!(f, "GroupError: {}", e), + GameServerError::GroupCreationError(e) => write!(f, "GroupCreationError: {}", e), + } + } } pub struct GameServer { @@ -65,7 +79,7 @@ impl GameClient { } pub fn split(self) -> (ClientSender, ClientReceiver) { - let (mut rec, mut sen) = self.client.split().unwrap(); + let (rec, sen) = self.client.split().unwrap(); (sen, rec) } } @@ -112,7 +126,8 @@ impl GameServer { user_id, token, client.host_name(), group_name); //clients.lock().unwrap().insert(token, client); self.lobby.add_client(&group_type, group_id, - &group_name, user_id, client); + &group_name, user_id, client) + .unwrap_or_else(|e| warn!("failed to add client: {}", e)); } } } else { @@ -121,16 +136,19 @@ impl GameServer { } fn read_clients(&self) -> Receiver<ClientConnection> { - let (s, r): (Sender<ClientConnection>, Receiver<ClientConnection>) + let (sen, rec): (Sender<ClientConnection>, Receiver<ClientConnection>) = mpsc::channel(); let addr = self.addr; std::thread::spawn(move || { - let result = Self::handle_requests(addr, &s).or_else(|e| s.send(Err(e))); + match Self::handle_requests(addr, &sen) { + Err(e) => sen.send(Err(e)).unwrap(), + _ => (), + } }); - r + rec } - fn handle_requests(addr: SocketAddr, s: &Sender<ClientConnection>) -> Result<(), GameServerError> { + fn handle_requests(addr: SocketAddr, sen: &Sender<ClientConnection>) -> Result<(), GameServerError> { let server = match Server::<NoTlsAcceptor>::bind(addr) { Ok(v) => v, Err(e) => { @@ -140,7 +158,7 @@ impl GameServer { }; info!("webserver is being launched"); for req in server { - s.send(Ok(Self::handle_request(req)?)).unwrap(); + sen.send(Ok(Self::handle_request(req)?)).unwrap(); } info!("webserver is being shut down"); Ok(()) diff --git a/game_server/src/webhogg_group.rs b/game_server/src/webhogg_group.rs index 5a326d8..091f7f8 100644 --- a/game_server/src/webhogg_group.rs +++ b/game_server/src/webhogg_group.rs @@ -40,7 +40,7 @@ impl Group for WebhoggGroup { self.senders.lock().unwrap().insert(id, sen); let senders_mutex = self.senders.clone(); let self_uid = id; - std::thread::spawn(move || Self::launch_game(self_uid, rec, senders_mutex)); + std::thread::spawn(move || Self::broadcast_clients(self_uid, rec, senders_mutex)); Ok(()) } } @@ -50,7 +50,7 @@ impl WebhoggGroup { Self { id, name, senders: Arc::new(Mutex::new(HashMap::new())) } } - fn launch_game(self_uid: UserId, mut rec: ClientReceiver, senders_mutex: Arc<Mutex<HashMap<UserId, ClientSender>>>) { + 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, |