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) => { |