rust/hedgewars-server/src/server/handlers/lobby.rs
changeset 14457 98ef2913ec73
parent 14415 06672690d71b
child 14504 6cc0fce249f9
equal deleted inserted replaced
14456:a077aac9df01 14457:98ef2913ec73
     1 use mio;
     1 use mio;
     2 
     2 
       
     3 use super::common::rnd_reply;
     3 use crate::{
     4 use crate::{
       
     5     protocol::messages::{HWProtocolMessage, HWServerMessage::*},
     4     server::{
     6     server::{
       
     7         actions::{Action, Action::*},
     5         core::HWServer,
     8         core::HWServer,
     6         coretypes::ClientId,
     9         coretypes::ClientId,
     7         actions::{Action, Action::*}
       
     8     },
    10     },
     9     protocol::messages::{
    11     utils::is_name_illegal,
    10         HWProtocolMessage,
       
    11         HWServerMessage::*
       
    12     },
       
    13     utils::is_name_illegal
       
    14 };
    12 };
    15 use super::common::rnd_reply;
       
    16 use log::*;
    13 use log::*;
    17 
    14 
    18 pub fn handle(server: &mut HWServer, client_id: ClientId, message: HWProtocolMessage) {
    15 pub fn handle(server: &mut HWServer, client_id: ClientId, message: HWProtocolMessage) {
    19     use crate::protocol::messages::HWProtocolMessage::*;
    16     use crate::protocol::messages::HWProtocolMessage::*;
    20     match message {
    17     match message {
    21         CreateRoom(name, password) => {
    18         CreateRoom(name, password) => {
    22             let actions =
    19             let actions = if is_name_illegal(&name) {
    23                 if is_name_illegal(&name) {
    20                 vec![Warn("Illegal room name! A room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}".to_string())]
    24                     vec![Warn("Illegal room name! A room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}".to_string())]
    21             } else if server.has_room(&name) {
    25                 } else if server.has_room(&name) {
    22                 vec![Warn(
    26                     vec![Warn("A room with the same name already exists.".to_string())]
    23                     "A room with the same name already exists.".to_string(),
    27                 } else {
    24                 )]
    28                     let flags_msg = ClientFlags(
    25             } else {
    29                         "+hr".to_string(),
    26                 let flags_msg = ClientFlags(
    30                         vec![server.clients[client_id].nick.clone()]);
    27                     "+hr".to_string(),
    31                     vec![AddRoom(name, password),
    28                     vec![server.clients[client_id].nick.clone()],
    32                          flags_msg.send_self().action()]
    29                 );
    33                 };
    30                 vec![AddRoom(name, password), flags_msg.send_self().action()]
       
    31             };
    34             server.react(client_id, actions);
    32             server.react(client_id, actions);
    35         },
    33         }
    36         Chat(msg) => {
    34         Chat(msg) => {
    37             let actions = vec![ChatMsg {nick: server.clients[client_id].nick.clone(), msg}
    35             let actions = vec![ChatMsg {
    38                 .send_all().in_room(server.lobby_id).but_self().action()];
    36                 nick: server.clients[client_id].nick.clone(),
       
    37                 msg,
       
    38             }
       
    39             .send_all()
       
    40             .in_room(server.lobby_id)
       
    41             .but_self()
       
    42             .action()];
    39             server.react(client_id, actions);
    43             server.react(client_id, actions);
    40         },
    44         }
    41         JoinRoom(name, _password) => {
    45         JoinRoom(name, _password) => {
    42             let room = server.rooms.iter().find(|(_, r)| r.name == name);
    46             let room = server.rooms.iter().find(|(_, r)| r.name == name);
    43             let room_id = room.map(|(_, r)| r.id);
    47             let room_id = room.map(|(_, r)| r.id);
    44             let nicks = server.clients.iter()
    48             let nicks = server
       
    49                 .clients
       
    50                 .iter()
    45                 .filter(|(_, c)| c.room_id == room_id)
    51                 .filter(|(_, c)| c.room_id == room_id)
    46                 .map(|(_, c)| c.nick.clone())
    52                 .map(|(_, c)| c.nick.clone())
    47                 .collect();
    53                 .collect();
    48             let c = &mut server.clients[client_id];
    54             let c = &mut server.clients[client_id];
    49 
    55 
    50             let actions = if let Some((_, r)) = room {
    56             let actions = if let Some((_, r)) = room {
    51                 if c.protocol_number != r.protocol_number {
    57                 if c.protocol_number != r.protocol_number {
    52                     vec![Warn("Room version incompatible to your Hedgewars version!".to_string())]
    58                     vec![Warn(
       
    59                         "Room version incompatible to your Hedgewars version!".to_string(),
       
    60                     )]
    53                 } else if r.is_join_restricted() {
    61                 } else if r.is_join_restricted() {
    54                     vec![Warn("Access denied. This room currently doesn't allow joining.".to_string())]
    62                     vec![Warn(
       
    63                         "Access denied. This room currently doesn't allow joining.".to_string(),
       
    64                     )]
    55                 } else if r.players_number == u8::max_value() {
    65                 } else if r.players_number == u8::max_value() {
    56                     vec![Warn("This room is already full".to_string())]
    66                     vec![Warn("This room is already full".to_string())]
    57                 } else {
    67                 } else {
    58                     vec![MoveToRoom(r.id),
    68                     vec![MoveToRoom(r.id), RoomJoined(nicks).send_self().action()]
    59                          RoomJoined(nicks).send_self().action()]
       
    60                 }
    69                 }
    61             } else {
    70             } else {
    62                 vec![Warn("No such room.".to_string())]
    71                 vec![Warn("No such room.".to_string())]
    63             };
    72             };
    64             server.react(client_id, actions);
    73             server.react(client_id, actions);
    65         },
    74         }
    66         Rnd(v) => {
    75         Rnd(v) => {
    67             server.react(client_id, vec![rnd_reply(&v).send_self().action()]);
    76             server.react(client_id, vec![rnd_reply(&v).send_self().action()]);
    68         },
    77         }
    69         List => warn!("Deprecated LIST message received"),
    78         List => warn!("Deprecated LIST message received"),
    70         _ => warn!("Incorrect command in lobby state"),
    79         _ => warn!("Incorrect command in lobby state"),
    71     }
    80     }
    72 }
    81 }