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 } |