3 use crate::core::server::{AddTeamError, SetTeamCountError}; |
3 use crate::core::server::{AddTeamError, SetTeamCountError}; |
4 use crate::{ |
4 use crate::{ |
5 core::{ |
5 core::{ |
6 room::{HwRoom, RoomFlags, MAX_TEAMS_IN_ROOM}, |
6 room::{HwRoom, RoomFlags, MAX_TEAMS_IN_ROOM}, |
7 server::{ |
7 server::{ |
8 ChangeMasterError, ChangeMasterResult, HwRoomControl, LeaveRoomResult, ModifyTeamError, |
8 ChangeMasterError, ChangeMasterResult, HwRoomControl, HwServer, LeaveRoomResult, |
9 StartGameError, |
9 ModifyTeamError, StartGameError, |
10 }, |
10 }, |
11 types, |
11 types, |
12 types::{ClientId, GameCfg, RoomId, VoteType, Voting, MAX_HEDGEHOGS_PER_TEAM}, |
12 types::{ClientId, GameCfg, RoomId, VoteType, Voting, MAX_HEDGEHOGS_PER_TEAM}, |
13 }, |
13 }, |
14 protocol::messages::{ |
14 protocol::messages::{ |
233 .send_all() |
233 .send_all() |
234 .in_room(room_id), |
234 .in_room(room_id), |
235 ); |
235 ); |
236 |
236 |
237 let room = room_control.room(); |
237 let room = room_control.room(); |
238 let room_master = if let Some(id) = room.master_id { |
238 let room_master = room.master_id.map(|id| room_control.server().client(id)); |
239 Some(room_control.server().client(id)) |
|
240 } else { |
|
241 None |
|
242 }; |
|
243 super::common::get_room_update(None, room, room_master, response); |
239 super::common::get_room_update(None, room, room_master, response); |
244 } |
240 } |
245 Err(AddTeamError::TooManyTeams) => response.warn(TOO_MANY_TEAMS), |
241 Err(AddTeamError::TooManyTeams) => response.warn(TOO_MANY_TEAMS), |
246 Err(AddTeamError::TooManyHedgehogs) => response.warn(TOO_MANY_HEDGEHOGS), |
242 Err(AddTeamError::TooManyHedgehogs) => response.warn(TOO_MANY_HEDGEHOGS), |
247 Err(AddTeamError::TeamAlreadyExists) => response.warn(TEAM_EXISTS), |
243 Err(AddTeamError::TeamAlreadyExists) => response.warn(TEAM_EXISTS), |
363 } |
359 } |
364 CallVote(None) => { |
360 CallVote(None) => { |
365 response.add(server_chat("Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs <number>".to_string()) |
361 response.add(server_chat("Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs <number>".to_string()) |
366 .send_self()); |
362 .send_self()); |
367 } |
363 } |
368 /*CallVote(Some(kind)) => { |
364 CallVote(Some(kind)) => { |
369 let is_in_game = room.game_info.is_some(); |
365 use crate::core::server::StartVoteError; |
370 let error = match &kind { |
366 let room_id = room_control.room().id; |
371 VoteType::Kick(nick) => { |
367 if super::common::check_vote( |
372 if room_control.server() |
368 room_control.server(), |
373 .find_client(&nick) |
369 room_control.room(), |
374 .filter(|c| c.room_id == Some(room_id)) |
370 &kind, |
375 .is_some() |
371 response, |
376 { |
372 ) { |
377 None |
373 match room_control.start_vote(kind.clone()) { |
378 } else { |
374 Ok(()) => { |
379 Some("/callvote kick: No such user!".to_string()) |
375 let msg = voting_description(&kind); |
380 } |
376 response.add(server_chat(msg).send_all().in_room(room_id)); |
381 } |
377 let vote_result = room_control.vote(types::Vote { |
382 VoteType::Map(None) => { |
|
383 let names: Vec<_> = room.saves.keys().cloned().collect(); |
|
384 if names.is_empty() { |
|
385 Some("/callvote map: No maps saved in this room!".to_string()) |
|
386 } else { |
|
387 Some(format!("Available maps: {}", names.join(", "))) |
|
388 } |
|
389 } |
|
390 VoteType::Map(Some(name)) => { |
|
391 if room.saves.get(&name[..]).is_some() { |
|
392 None |
|
393 } else { |
|
394 Some("/callvote map: No such map!".to_string()) |
|
395 } |
|
396 } |
|
397 VoteType::Pause => { |
|
398 if is_in_game { |
|
399 None |
|
400 } else { |
|
401 Some("/callvote pause: No game in progress!".to_string()) |
|
402 } |
|
403 } |
|
404 VoteType::NewSeed => None, |
|
405 VoteType::HedgehogsPerTeam(number) => match number { |
|
406 1..=MAX_HEDGEHOGS_PER_TEAM => None, |
|
407 _ => Some("/callvote hedgehogs: Specify number from 1 to 8.".to_string()), |
|
408 }, |
|
409 }; |
|
410 |
|
411 match error { |
|
412 None => { |
|
413 let msg = voting_description(&kind); |
|
414 let voting = Voting::new(kind, room_control.server().room_clients(client_id).collect()); |
|
415 let room = room_control.server().room_mut(room_id); |
|
416 room.voting = Some(voting); |
|
417 response.add(server_chat(msg).send_all().in_room(room_id)); |
|
418 super::common::submit_vote( |
|
419 room_control.server(), |
|
420 types::Vote { |
|
421 is_pro: true, |
378 is_pro: true, |
422 is_forced: false, |
379 is_forced: false, |
423 }, |
380 }); |
424 response, |
381 super::common::handle_vote(room_control, vote_result, response); |
425 ); |
382 } |
426 } |
383 Err(StartVoteError::VotingInProgress) => { |
427 Some(msg) => { |
384 response.add( |
428 response.add(server_chat(msg).send_self()); |
385 server_chat("There is already voting in progress".to_string()) |
429 } |
386 .send_self(), |
430 } |
387 ); |
431 }*/ |
388 } |
432 /*Vote(vote) => { |
389 } |
433 super::common::submit_vote( |
390 } |
434 room_control.server(), |
391 } |
435 types::Vote { |
392 Vote(vote) => { |
436 is_pro: vote, |
393 let vote_result = room_control.vote(types::Vote { |
437 is_forced: false, |
394 is_pro: vote, |
438 }, |
395 is_forced: false, |
439 response, |
396 }); |
440 ); |
397 super::common::handle_vote(room_control, vote_result, response); |
441 }*/ |
398 } |
442 /*ForceVote(vote) => { |
399 ForceVote(vote) => { |
443 let is_forced = client.is_admin(); |
400 let is_forced = client.is_admin(); |
444 super::common::submit_vote( |
401 let vote_result = room_control.vote(types::Vote { |
445 room_control.server(), |
402 is_pro: vote, |
446 types::Vote { |
403 is_forced, |
447 is_pro: vote, |
404 }); |
448 is_forced, |
405 super::common::handle_vote(room_control, vote_result, response); |
449 }, |
406 } |
450 response, |
|
451 ); |
|
452 }*/ |
|
453 ToggleRestrictJoin | ToggleRestrictTeams | ToggleRegisteredOnly => { |
407 ToggleRestrictJoin | ToggleRestrictTeams | ToggleRegisteredOnly => { |
454 if room_control.toggle_flag(room_message_flag(&message)) { |
408 if room_control.toggle_flag(room_message_flag(&message)) { |
455 let (client, room) = room_control.get(); |
409 let (client, room) = room_control.get(); |
456 super::common::get_room_update(None, room, Some(&client), response); |
410 super::common::get_room_update(None, room, Some(&client), response); |
457 } |
411 } |