# HG changeset patch # User alfadur # Date 1549320016 -10800 # Node ID 9377ee00f1f15c1947ed6aedffbf9c71c731d1e0 # Parent dfe652c534703a6f2840417066206181508f0e19 Server action refactoring part 7 of N diff -r dfe652c53470 -r 9377ee00f1f1 rust/hedgewars-server/src/server/handlers/inroom.rs --- a/rust/hedgewars-server/src/server/handlers/inroom.rs Tue Feb 05 00:48:40 2019 +0300 +++ b/rust/hedgewars-server/src/server/handlers/inroom.rs Tue Feb 05 01:40:16 2019 +0300 @@ -225,61 +225,50 @@ } }, SetHedgehogsNumber(team_name, number) => { - if let (c, Some(r)) = server.client_and_room(client_id) { - let addable_hedgehogs = r.addable_hedgehogs(); - let actions = if let Some((_, team)) = r.find_team_and_owner_mut(|t| t.name == team_name) { - if !c.is_master() { - vec![ProtocolError("You're not the room master!".to_string())] + if let (client, Some(room)) = server.client_and_room(client_id) { + let addable_hedgehogs = room.addable_hedgehogs(); + if let Some((_, team)) = room.find_team_and_owner_mut(|t| t.name == team_name) { + if !client.is_master() { + response.add(Error("You're not the room master!".to_string()).send_self()); } else if number < 1 || number > MAX_HEDGEHOGS_PER_TEAM || number > addable_hedgehogs + team.hedgehogs_number { - vec![HedgehogsNumber(team.name.clone(), team.hedgehogs_number) - .send_self().action()] + response.add(HedgehogsNumber(team.name.clone(), team.hedgehogs_number).send_self()); } else { team.hedgehogs_number = number; - vec![HedgehogsNumber(team.name.clone(), number) - .send_all().in_room(room_id).but_self().action()] + response.add(HedgehogsNumber(team.name.clone(), number) + .send_all().in_room(room_id).but_self()); } } else { - vec![(Warn("No such team.".to_string()))] - }; - server.react(client_id, actions); + response.add(Warning("No such team.".to_string()).send_self()); + } } }, SetTeamColor(team_name, color) => { - if let (c, Some(r)) = server.client_and_room(client_id) { - let mut owner_id = None; - let actions = if let Some((owner, team)) = r.find_team_and_owner_mut(|t| t.name == team_name) { - if !c.is_master() { - vec![ProtocolError("You're not the room master!".to_string())] - } else if false { - Vec::new() + if let (client, Some(room)) = server.client_and_room(client_id) { + if let Some((owner, team)) = room.find_team_and_owner_mut(|t| t.name == team_name) { + if !client.is_master() { + response.add(Error("You're not the room master!".to_string()).send_self()); } else { - owner_id = Some(owner); team.color = color; - vec![TeamColor(team.name.clone(), color) - .send_all().in_room(room_id).but_self().action()] + response.add(TeamColor(team.name.clone(), color) + .send_all().in_room(room_id).but_self()); + server.clients[owner].clan = Some(color); } } else { - vec![(Warn("No such team.".to_string()))] - }; - - if let Some(id) = owner_id { - server.clients[id].clan = Some(color); + response.add(Warning("No such team.".to_string()).send_self()); } - - server.react(client_id, actions); - }; + } }, Cfg(cfg) => { - if let (c, Some(r)) = server.client_and_room(client_id) { - let actions = if r.is_fixed() { - vec![Warn("Access denied.".to_string())] - } else if !c.is_master() { - vec![ProtocolError("You're not the room master!".to_string())] + if let (client, Some(room)) = server.client_and_room(client_id) { + if room.is_fixed() { + response.add(Warning("Access denied.".to_string()).send_self()); + } else if !client.is_master() { + response.add(Error("You're not the room master!".to_string()).send_self()); } else { let cfg = match cfg { GameCfg::Scheme(name, mut values) => { - if c.protocol_number == 49 && values.len() >= 2 { + if client.protocol_number == 49 && values.len() >= 2 { let mut s = "X".repeat(50); s.push_str(&values.pop().unwrap()); values.push(s); @@ -289,71 +278,64 @@ cfg => cfg }; - let v = vec![cfg.to_server_msg() - .send_all().in_room(r.id).but_self().action()]; - r.set_config(cfg); - v - }; - server.react(client_id, actions); + response.add(cfg.to_server_msg() + .send_all().in_room(room.id).but_self()); + room.set_config(cfg); + } } } Save(name, location) => { - let actions = vec![server_chat(format!("Room config saved as {}", name)) - .send_all().in_room(room_id).action()]; + response.add(server_chat(format!("Room config saved as {}", name)) + .send_all().in_room(room_id)); server.rooms[room_id].save_config(name, location); - server.react(client_id, actions); } SaveRoom(filename) => { if server.clients[client_id].is_admin() { - let actions = match server.rooms[room_id].get_saves() { + match server.rooms[room_id].get_saves() { Ok(text) => match server.io.write_file(&filename, &text) { - Ok(_) => vec![server_chat("Room configs saved successfully.".to_string()) - .send_self().action()], + Ok(_) => response.add(server_chat("Room configs saved successfully.".to_string()) + .send_self()), Err(e) => { warn!("Error while writing the config file \"{}\": {}", filename, e); - vec![Warn("Unable to save the room configs.".to_string())] + response.add(Warning("Unable to save the room configs.".to_string()).send_self()); } } Err(e) => { warn!("Error while serializing the room configs: {}", e); - vec![Warn("Unable to serialize the room configs.".to_string())] + response.add(Warning("Unable to serialize the room configs.".to_string()).send_self()) } - }; - server.react(client_id, actions); + } } } LoadRoom(filename) => { if server.clients[client_id].is_admin() { - let actions = match server.io.read_file(&filename) { + match server.io.read_file(&filename) { Ok(text) => match server.rooms[room_id].set_saves(&text) { - Ok(_) => vec![server_chat("Room configs loaded successfully.".to_string()) - .send_self().action()], + Ok(_) => response.add(server_chat("Room configs loaded successfully.".to_string()) + .send_self()), Err(e) => { warn!("Error while deserializing the room configs: {}", e); - vec![Warn("Unable to deserialize the room configs.".to_string())] + response.add(Warning("Unable to deserialize the room configs.".to_string()).send_self()); } } Err(e) => { warn!("Error while reading the config file \"{}\": {}", filename, e); - vec![Warn("Unable to load the room configs.".to_string())] + response.add(Warning("Unable to load the room configs.".to_string()).send_self()); } - }; - server.react(client_id, actions); + } } } Delete(name) => { - let actions = if !server.rooms[room_id].delete_config(&name) { - vec![Warn(format!("Save doesn't exist: {}", name))] + if !server.rooms[room_id].delete_config(&name) { + response.add(Warning(format!("Save doesn't exist: {}", name)).send_self()); } else { - vec![server_chat(format!("Room config {} has been deleted", name)) - .send_all().in_room(room_id).action()] - }; - server.react(client_id, actions); + response.add(server_chat(format!("Room config {} has been deleted", name)) + .send_all().in_room(room_id)); + } } CallVote(None) => { - server.react(client_id, vec![ - server_chat("Available callvote commands: kick , map , pause, newseed, hedgehogs ".to_string()) - .send_self().action()]) + response.add(server_chat("Available callvote commands: kick , map , pause, newseed, hedgehogs ".to_string()) + .send_self()); } CallVote(Some(kind)) => { let is_in_game = server.rooms[room_id].game_info.is_some(); @@ -402,13 +384,11 @@ let msg = voting_description(&kind); let voting = Voting::new(kind, server.room_clients(client_id)); server.rooms[room_id].voting = Some(voting); - server.react(client_id, vec![ - server_chat(msg).send_all().in_room(room_id).action(), - AddVote{ vote: true, is_forced: false}]); + response.add(server_chat(msg).send_all().in_room(room_id)); + //AddVote{ vote: true, is_forced: false} } Some(msg) => { - server.react(client_id, vec![ - server_chat(msg).send_self().action()]) + response.add(server_chat(msg).send_self()); } } } @@ -481,9 +461,8 @@ nick: server.clients[client_id].nick.clone(), msg: echo.join(" ") }; - server.react(client_id, vec![ - chat_msg.send_all().in_room(room_id).action(), - result.send_all().in_room(room_id).action()]) + response.add(chat_msg.send_all().in_room(room_id)); + response.add(result.send_all().in_room(room_id)); }, _ => warn!("Unimplemented!") }