1 use super::{common::rnd_reply, strings::*}; |
1 use super::{common::rnd_reply, strings::*}; |
2 use crate::{ |
2 use crate::{ |
3 core::{ |
3 core::{ |
4 room::{HwRoom, RoomFlags, MAX_TEAMS_IN_ROOM}, |
4 room::{HwRoom, RoomFlags, MAX_TEAMS_IN_ROOM}, |
5 server::{HwServer, LeaveRoomResult}, |
5 server::{ChangeMasterError, ChangeMasterResult, HwServer, LeaveRoomResult}, |
6 types, |
6 types, |
7 types::{ClientId, GameCfg, RoomId, VoteType, Voting, MAX_HEDGEHOGS_PER_TEAM}, |
7 types::{ClientId, GameCfg, RoomId, VoteType, Voting, MAX_HEDGEHOGS_PER_TEAM}, |
8 }, |
8 }, |
9 protocol::messages::{ |
9 protocol::messages::{ |
10 add_flags, remove_flags, server_chat, HwProtocolMessage, HwServerMessage::*, |
10 add_flags, remove_flags, server_chat, HwProtocolMessage, HwServerMessage::*, |
569 Rnd(v) => { |
569 Rnd(v) => { |
570 let result = rnd_reply(&v); |
570 let result = rnd_reply(&v); |
571 let mut echo = vec!["/rnd".to_string()]; |
571 let mut echo = vec!["/rnd".to_string()]; |
572 echo.extend(v.into_iter()); |
572 echo.extend(v.into_iter()); |
573 let chat_msg = ChatMsg { |
573 let chat_msg = ChatMsg { |
574 nick: server.clients[client_id].nick.clone(), |
574 nick: server.client(client_id).nick.clone(), |
575 msg: echo.join(" "), |
575 msg: echo.join(" "), |
576 }; |
576 }; |
577 response.add(chat_msg.send_all().in_room(room_id)); |
577 response.add(chat_msg.send_all().in_room(room_id)); |
578 response.add(result.send_all().in_room(room_id)); |
578 response.add(result.send_all().in_room(room_id)); |
579 } |
579 } |
580 Delegate(nick) => { |
580 Delegate(nick) => match server.change_master(client_id, room_id, nick) { |
581 let delegate_id = server.find_client(&nick).map(|c| (c.id, c.room_id)); |
581 Ok(ChangeMasterResult { |
582 let client = &server.clients[client_id]; |
582 old_master_id, |
583 if !(client.is_admin() || client.is_master()) { |
583 new_master_id, |
|
584 }) => { |
|
585 if let Some(master_id) = old_master_id { |
|
586 response.add( |
|
587 ClientFlags( |
|
588 remove_flags(&[Flags::RoomMaster]), |
|
589 vec![server.client(master_id).nick.clone()], |
|
590 ) |
|
591 .send_all() |
|
592 .in_room(room_id), |
|
593 ); |
|
594 } |
|
595 response.add( |
|
596 ClientFlags( |
|
597 add_flags(&[Flags::RoomMaster]), |
|
598 vec![server.client(new_master_id).nick.clone()], |
|
599 ) |
|
600 .send_all() |
|
601 .in_room(room_id), |
|
602 ); |
|
603 } |
|
604 Err(ChangeMasterError::NoAccess) => { |
584 response.warn("You're not the room master or a server admin!") |
605 response.warn("You're not the room master or a server admin!") |
585 } else { |
606 } |
586 match delegate_id { |
607 Err(ChangeMasterError::AlreadyMaster) => { |
587 None => response.warn("Player is not online."), |
608 response.warn("You're already the room master.") |
588 Some((id, _)) if id == client_id => { |
609 } |
589 response.warn("You're already the room master.") |
610 Err(ChangeMasterError::NoClient) => response.warn("Player is not online."), |
590 } |
611 Err(ChangeMasterError::ClientNotInRoom) => { |
591 Some((_, id)) if id != Some(room_id) => { |
612 response.warn("The player is not in your room.") |
592 response.warn("The player is not in your room.") |
613 } |
593 } |
614 }, |
594 Some((id, _)) => { |
|
595 super::common::change_master(server, room_id, id, response); |
|
596 } |
|
597 } |
|
598 } |
|
599 } |
|
600 _ => warn!("Unimplemented!"), |
615 _ => warn!("Unimplemented!"), |
601 } |
616 } |
602 } |
617 } |