rust/hedgewars-server/src/server/handlers/inroom.rs
changeset 14676 9377ee00f1f1
parent 14675 dfe652c53470
child 14683 932ff7683653
equal deleted inserted replaced
14675:dfe652c53470 14676:9377ee00f1f1
   223                     }
   223                     }
   224                 }
   224                 }
   225             }
   225             }
   226         },
   226         },
   227         SetHedgehogsNumber(team_name, number) => {
   227         SetHedgehogsNumber(team_name, number) => {
   228             if let (c, Some(r)) = server.client_and_room(client_id) {
   228             if let (client, Some(room)) = server.client_and_room(client_id) {
   229                 let addable_hedgehogs = r.addable_hedgehogs();
   229                 let addable_hedgehogs = room.addable_hedgehogs();
   230                 let actions = if let Some((_, team)) = r.find_team_and_owner_mut(|t| t.name == team_name) {
   230                 if let Some((_, team)) = room.find_team_and_owner_mut(|t| t.name == team_name) {
   231                     if !c.is_master() {
   231                     if !client.is_master() {
   232                         vec![ProtocolError("You're not the room master!".to_string())]
   232                         response.add(Error("You're not the room master!".to_string()).send_self());
   233                     } else if number < 1 || number > MAX_HEDGEHOGS_PER_TEAM
   233                     } else if number < 1 || number > MAX_HEDGEHOGS_PER_TEAM
   234                            || number > addable_hedgehogs + team.hedgehogs_number {
   234                            || number > addable_hedgehogs + team.hedgehogs_number {
   235                         vec![HedgehogsNumber(team.name.clone(), team.hedgehogs_number)
   235                         response.add(HedgehogsNumber(team.name.clone(), team.hedgehogs_number).send_self());
   236                             .send_self().action()]
       
   237                     } else {
   236                     } else {
   238                         team.hedgehogs_number = number;
   237                         team.hedgehogs_number = number;
   239                         vec![HedgehogsNumber(team.name.clone(), number)
   238                         response.add(HedgehogsNumber(team.name.clone(), number)
   240                             .send_all().in_room(room_id).but_self().action()]
   239                             .send_all().in_room(room_id).but_self());
   241                     }
   240                     }
   242                 } else {
   241                 } else {
   243                     vec![(Warn("No such team.".to_string()))]
   242                     response.add(Warning("No such team.".to_string()).send_self());
   244                 };
   243                 }
   245                 server.react(client_id, actions);
       
   246             }
   244             }
   247         },
   245         },
   248         SetTeamColor(team_name, color) => {
   246         SetTeamColor(team_name, color) => {
   249             if let (c, Some(r)) = server.client_and_room(client_id) {
   247             if let (client, Some(room)) = server.client_and_room(client_id) {
   250                 let mut owner_id = None;
   248                 if let Some((owner, team)) = room.find_team_and_owner_mut(|t| t.name == team_name) {
   251                 let actions = if let Some((owner, team)) = r.find_team_and_owner_mut(|t| t.name == team_name) {
   249                     if !client.is_master() {
   252                     if !c.is_master() {
   250                         response.add(Error("You're not the room master!".to_string()).send_self());
   253                         vec![ProtocolError("You're not the room master!".to_string())]
   251                     } else {
   254                     } else if false  {
       
   255                         Vec::new()
       
   256                     } else {
       
   257                         owner_id = Some(owner);
       
   258                         team.color = color;
   252                         team.color = color;
   259                         vec![TeamColor(team.name.clone(), color)
   253                         response.add(TeamColor(team.name.clone(), color)
   260                             .send_all().in_room(room_id).but_self().action()]
   254                             .send_all().in_room(room_id).but_self());
   261                     }
   255                         server.clients[owner].clan = Some(color);
   262                 } else {
   256                     }
   263                     vec![(Warn("No such team.".to_string()))]
   257                 } else {
   264                 };
   258                     response.add(Warning("No such team.".to_string()).send_self());
   265 
   259                 }
   266                 if let Some(id) = owner_id {
   260             }
   267                     server.clients[id].clan = Some(color);
       
   268                 }
       
   269 
       
   270                 server.react(client_id, actions);
       
   271             };
       
   272         },
   261         },
   273         Cfg(cfg) => {
   262         Cfg(cfg) => {
   274             if let (c, Some(r)) = server.client_and_room(client_id) {
   263             if let (client, Some(room)) = server.client_and_room(client_id) {
   275                 let actions = if r.is_fixed() {
   264                 if room.is_fixed() {
   276                     vec![Warn("Access denied.".to_string())]
   265                     response.add(Warning("Access denied.".to_string()).send_self());
   277                 } else if !c.is_master() {
   266                 } else if !client.is_master() {
   278                     vec![ProtocolError("You're not the room master!".to_string())]
   267                     response.add(Error("You're not the room master!".to_string()).send_self());
   279                 } else {
   268                 } else {
   280                     let cfg = match cfg {
   269                     let cfg = match cfg {
   281                         GameCfg::Scheme(name, mut values) => {
   270                         GameCfg::Scheme(name, mut values) => {
   282                             if c.protocol_number == 49 && values.len() >= 2 {
   271                             if client.protocol_number == 49 && values.len() >= 2 {
   283                                 let mut s = "X".repeat(50);
   272                                 let mut s = "X".repeat(50);
   284                                 s.push_str(&values.pop().unwrap());
   273                                 s.push_str(&values.pop().unwrap());
   285                                 values.push(s);
   274                                 values.push(s);
   286                             }
   275                             }
   287                             GameCfg::Scheme(name, values)
   276                             GameCfg::Scheme(name, values)
   288                         }
   277                         }
   289                         cfg => cfg
   278                         cfg => cfg
   290                     };
   279                     };
   291 
   280 
   292                     let v = vec![cfg.to_server_msg()
   281                     response.add(cfg.to_server_msg()
   293                         .send_all().in_room(r.id).but_self().action()];
   282                         .send_all().in_room(room.id).but_self());
   294                     r.set_config(cfg);
   283                     room.set_config(cfg);
   295                     v
   284                 }
   296                 };
       
   297                 server.react(client_id, actions);
       
   298             }
   285             }
   299         }
   286         }
   300         Save(name, location) => {
   287         Save(name, location) => {
   301             let actions = vec![server_chat(format!("Room config saved as {}", name))
   288             response.add(server_chat(format!("Room config saved as {}", name))
   302                 .send_all().in_room(room_id).action()];
   289                 .send_all().in_room(room_id));
   303             server.rooms[room_id].save_config(name, location);
   290             server.rooms[room_id].save_config(name, location);
   304             server.react(client_id, actions);
       
   305         }
   291         }
   306         SaveRoom(filename) => {
   292         SaveRoom(filename) => {
   307             if server.clients[client_id].is_admin() {
   293             if server.clients[client_id].is_admin() {
   308                 let actions = match server.rooms[room_id].get_saves() {
   294                 match server.rooms[room_id].get_saves() {
   309                     Ok(text) => match server.io.write_file(&filename, &text) {
   295                     Ok(text) => match server.io.write_file(&filename, &text) {
   310                         Ok(_) => vec![server_chat("Room configs saved successfully.".to_string())
   296                         Ok(_) => response.add(server_chat("Room configs saved successfully.".to_string())
   311                             .send_self().action()],
   297                             .send_self()),
   312                         Err(e) => {
   298                         Err(e) => {
   313                             warn!("Error while writing the config file \"{}\": {}", filename, e);
   299                             warn!("Error while writing the config file \"{}\": {}", filename, e);
   314                             vec![Warn("Unable to save the room configs.".to_string())]
   300                             response.add(Warning("Unable to save the room configs.".to_string()).send_self());
   315                         }
   301                         }
   316                     }
   302                     }
   317                     Err(e) => {
   303                     Err(e) => {
   318                         warn!("Error while serializing the room configs: {}", e);
   304                         warn!("Error while serializing the room configs: {}", e);
   319                         vec![Warn("Unable to serialize the room configs.".to_string())]
   305                         response.add(Warning("Unable to serialize the room configs.".to_string()).send_self())
   320                     }
   306                     }
   321                 };
   307                 }
   322                 server.react(client_id, actions);
       
   323             }
   308             }
   324         }
   309         }
   325         LoadRoom(filename) => {
   310         LoadRoom(filename) => {
   326             if server.clients[client_id].is_admin() {
   311             if server.clients[client_id].is_admin() {
   327                 let actions = match server.io.read_file(&filename) {
   312                 match server.io.read_file(&filename) {
   328                     Ok(text) => match server.rooms[room_id].set_saves(&text) {
   313                     Ok(text) => match server.rooms[room_id].set_saves(&text) {
   329                         Ok(_) => vec![server_chat("Room configs loaded successfully.".to_string())
   314                         Ok(_) => response.add(server_chat("Room configs loaded successfully.".to_string())
   330                             .send_self().action()],
   315                             .send_self()),
   331                         Err(e) => {
   316                         Err(e) => {
   332                             warn!("Error while deserializing the room configs: {}", e);
   317                             warn!("Error while deserializing the room configs: {}", e);
   333                             vec![Warn("Unable to deserialize the room configs.".to_string())]
   318                             response.add(Warning("Unable to deserialize the room configs.".to_string()).send_self());
   334                         }
   319                         }
   335                     }
   320                     }
   336                     Err(e) => {
   321                     Err(e) => {
   337                         warn!("Error while reading the config file \"{}\": {}", filename, e);
   322                         warn!("Error while reading the config file \"{}\": {}", filename, e);
   338                         vec![Warn("Unable to load the room configs.".to_string())]
   323                         response.add(Warning("Unable to load the room configs.".to_string()).send_self());
   339                     }
   324                     }
   340                 };
   325                 }
   341                 server.react(client_id, actions);
       
   342             }
   326             }
   343         }
   327         }
   344         Delete(name) => {
   328         Delete(name) => {
   345             let actions = if !server.rooms[room_id].delete_config(&name) {
   329             if !server.rooms[room_id].delete_config(&name) {
   346                 vec![Warn(format!("Save doesn't exist: {}", name))]
   330                 response.add(Warning(format!("Save doesn't exist: {}", name)).send_self());
   347             } else {
   331             } else {
   348                 vec![server_chat(format!("Room config {} has been deleted", name))
   332                 response.add(server_chat(format!("Room config {} has been deleted", name))
   349                     .send_all().in_room(room_id).action()]
   333                     .send_all().in_room(room_id));
   350             };
   334             }
   351             server.react(client_id, actions);
       
   352         }
   335         }
   353         CallVote(None) => {
   336         CallVote(None) => {
   354             server.react(client_id, vec![
   337             response.add(server_chat("Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs <number>".to_string())
   355                 server_chat("Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs <number>".to_string())
   338                 .send_self());
   356                     .send_self().action()])
       
   357         }
   339         }
   358         CallVote(Some(kind)) => {
   340         CallVote(Some(kind)) => {
   359             let is_in_game = server.rooms[room_id].game_info.is_some();
   341             let is_in_game = server.rooms[room_id].game_info.is_some();
   360             let error = match &kind {
   342             let error = match &kind {
   361                 VoteType::Kick(nick) => {
   343                 VoteType::Kick(nick) => {
   400             match error {
   382             match error {
   401                 None => {
   383                 None => {
   402                     let msg = voting_description(&kind);
   384                     let msg = voting_description(&kind);
   403                     let voting = Voting::new(kind, server.room_clients(client_id));
   385                     let voting = Voting::new(kind, server.room_clients(client_id));
   404                     server.rooms[room_id].voting = Some(voting);
   386                     server.rooms[room_id].voting = Some(voting);
   405                     server.react(client_id, vec![
   387                     response.add(server_chat(msg).send_all().in_room(room_id));
   406                         server_chat(msg).send_all().in_room(room_id).action(),
   388                     //AddVote{ vote: true, is_forced: false}
   407                         AddVote{ vote: true, is_forced: false}]);
       
   408                 }
   389                 }
   409                 Some(msg) => {
   390                 Some(msg) => {
   410                     server.react(client_id, vec![
   391                     response.add(server_chat(msg).send_self());
   411                         server_chat(msg).send_self().action()])
       
   412                 }
   392                 }
   413             }
   393             }
   414         }
   394         }
   415         Vote(vote) => {
   395         Vote(vote) => {
   416             server.react(client_id, vec![AddVote{ vote, is_forced: false }]);
   396             server.react(client_id, vec![AddVote{ vote, is_forced: false }]);
   479             echo.extend(v.into_iter());
   459             echo.extend(v.into_iter());
   480             let chat_msg = ChatMsg {
   460             let chat_msg = ChatMsg {
   481                 nick: server.clients[client_id].nick.clone(),
   461                 nick: server.clients[client_id].nick.clone(),
   482                 msg: echo.join(" ")
   462                 msg: echo.join(" ")
   483             };
   463             };
   484             server.react(client_id, vec![
   464             response.add(chat_msg.send_all().in_room(room_id));
   485                 chat_msg.send_all().in_room(room_id).action(),
   465             response.add(result.send_all().in_room(room_id));
   486                 result.send_all().in_room(room_id).action()])
       
   487         },
   466         },
   488         _ => warn!("Unimplemented!")
   467         _ => warn!("Unimplemented!")
   489     }
   468     }
   490 }
   469 }