gameServer2/src/server/handlers/lobby.rs
changeset 13419 81e0ed105f5d
parent 13416 cdf69667593b
child 13427 6f6a866c86a2
equal deleted inserted replaced
13418:bb24c3414b0d 13419:81e0ed105f5d
     1 use mio;
     1 use mio;
     2 
     2 
     3 use server::{
     3 use server::{
     4     server::HWServer,
     4     server::HWServer,
       
     5     client::ClientId,
     5     actions::{Action, Action::*}
     6     actions::{Action, Action::*}
     6 };
     7 };
     7 use protocol::messages::{
     8 use protocol::messages::{
     8     HWProtocolMessage,
     9     HWProtocolMessage,
     9     HWServerMessage::*
    10     HWServerMessage::*
    10 };
    11 };
    11 use utils::is_name_illegal;
    12 use utils::is_name_illegal;
    12 
    13 
    13 pub fn handle(server: &mut HWServer, token: usize, message: HWProtocolMessage) {
    14 pub fn handle(server: &mut HWServer, client_id: ClientId, message: HWProtocolMessage) {
    14     use protocol::messages::HWProtocolMessage::*;
    15     use protocol::messages::HWProtocolMessage::*;
    15     match message {
    16     match message {
    16         CreateRoom(name, password) => {
    17         CreateRoom(name, password) => {
    17             let actions =
    18             let actions =
    18                 if is_name_illegal(&name) {
    19                 if is_name_illegal(&name) {
    20                 } else if server.has_room(&name) {
    21                 } else if server.has_room(&name) {
    21                     vec![Warn("A room with the same name already exists.".to_string())]
    22                     vec![Warn("A room with the same name already exists.".to_string())]
    22                 } else {
    23                 } else {
    23                     let flags_msg = ClientFlags(
    24                     let flags_msg = ClientFlags(
    24                         "+hr".to_string(),
    25                         "+hr".to_string(),
    25                         vec![server.clients[token].nick.clone()]);
    26                         vec![server.clients[client_id].nick.clone()]);
    26                     vec![AddRoom(name, password),
    27                     vec![AddRoom(name, password),
    27                          SendMe(flags_msg)]
    28                          flags_msg.send_self().action()]
    28                 };
    29                 };
    29             server.react(token, actions);
    30             server.react(client_id, actions);
    30         },
    31         },
    31         Chat(msg) => {
    32         Chat(msg) => {
    32             let chat_msg = ChatMsg(server.clients[token].nick.clone(), msg);
    33             let chat_msg = ChatMsg(server.clients[client_id].nick.clone(), msg);
    33             server.react(token, vec![SendAllButMe(chat_msg)]);
    34             server.react(client_id, vec![chat_msg.send_all().but_self().action()]);
    34         },
    35         },
    35         JoinRoom(name, password) => {
    36         JoinRoom(name, password) => {
    36             let actions;
    37             let actions;
    37             {
    38             {
    38                 let room = server.rooms.iter().find(|(_, r)| r.name == name);
    39                 let room = server.rooms.iter().find(|(_, r)| r.name == name);
    39                 let room_id = room.map(|(_, r)| r.id);
    40                 let room_id = room.map(|(_, r)| r.id);
    40                 let nicks = server.clients.iter()
    41                 let nicks = server.clients.iter()
    41                     .filter(|(_, c)| c.room_id == room_id)
    42                     .filter(|(_, c)| c.room_id == room_id)
    42                     .map(|(_, c)| c.nick.clone())
    43                     .map(|(_, c)| c.nick.clone())
    43                     .collect();
    44                     .collect();
    44                 let c = &mut server.clients[token];
    45                 let c = &mut server.clients[client_id];
    45                 actions = match room {
    46                 actions = match room {
    46                     None => vec![Warn("No such room.".to_string())],
    47                     None => vec![Warn("No such room.".to_string())],
    47                     Some((_, r)) => {
    48                     Some((_, r)) => {
    48                         if c.protocol_number != r.protocol_number {
    49                         if c.protocol_number != r.protocol_number {
    49                             vec![Warn("Room version incompatible to your Hedgewars version!".to_string())]
    50                             vec![Warn("Room version incompatible to your Hedgewars version!".to_string())]
    50                         } else {
    51                         } else {
    51                             vec![MoveToRoom(r.id),
    52                             vec![MoveToRoom(r.id),
    52                                  SendMe(RoomJoined(nicks))]
    53                                  RoomJoined(nicks).send_self().action()]
    53                         }
    54                         }
    54                     }
    55                     }
    55                 };
    56                 };
    56             }
    57             }
    57             server.react(token, actions);
    58             server.react(client_id, actions);
    58         },
    59         },
    59         List => warn!("Deprecated LIST message received"),
    60         List => warn!("Deprecated LIST message received"),
    60         _ => warn!("Incorrect command in lobby state"),
    61         _ => warn!("Incorrect command in lobby state"),
    61     }
    62     }
    62 }
    63 }