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