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::{ |
5 server::{ |
6 ChangeMasterError, ChangeMasterResult, HwServer, LeaveRoomResult, StartGameError, |
6 ChangeMasterError, ChangeMasterResult, HwServer, LeaveRoomResult, ModifyTeamError, |
|
7 StartGameError, |
7 }, |
8 }, |
8 types, |
9 types, |
9 types::{ClientId, GameCfg, RoomId, VoteType, Voting, MAX_HEDGEHOGS_PER_TEAM}, |
10 types::{ClientId, GameCfg, RoomId, VoteType, Voting, MAX_HEDGEHOGS_PER_TEAM}, |
10 }, |
11 }, |
11 protocol::messages::{ |
12 protocol::messages::{ |
172 } else { |
173 } else { |
173 room.max_teams = count; |
174 room.max_teams = count; |
174 } |
175 } |
175 } |
176 } |
176 RoomName(new_name) => { |
177 RoomName(new_name) => { |
177 if is_name_illegal(&new_name) { |
178 use crate::core::server::ModifyRoomNameError; |
178 response.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: $()*+?[]^{|}"); |
179 match server.set_room_name(client_id, room_id, new_name) { |
179 } else if server.has_room(&new_name) { |
180 Ok(old_name) => { |
180 response.warn("A room with the same name already exists."); |
181 let (client, room) = server.client_and_room(client_id, room_id); |
181 } else { |
182 super::common::get_room_update(Some(old_name), room, Some(client), response) |
182 let (client, room) = server.client_and_room_mut(client_id, room_id); |
183 } |
183 if room.is_fixed() || room.master_id != Some(client_id) { |
184 Err(ModifyRoomNameError::AccessDenied) => response.warn(ACCESS_DENIED), |
184 response.warn(ACCESS_DENIED); |
185 Err(ModifyRoomNameError::InvalidName) => response.warn(ILLEGAL_ROOM_NAME), |
185 } else { |
186 Err(ModifyRoomNameError::DuplicateName) => response.warn(ROOM_EXISTS), |
186 let mut old_name = new_name.clone(); |
|
187 swap(&mut room.name, &mut old_name); |
|
188 super::common::get_room_update(Some(old_name), room, Some(&client), response); |
|
189 } |
|
190 } |
187 } |
191 } |
188 } |
192 ToggleReady => { |
189 ToggleReady => { |
193 let flags = if client.is_ready() { |
190 let flags = if server.toggle_ready(client_id) { |
194 room.ready_players_number -= 1; |
191 add_flags(&[Flags::Ready]) |
|
192 } else { |
195 remove_flags(&[Flags::Ready]) |
193 remove_flags(&[Flags::Ready]) |
196 } else { |
|
197 room.ready_players_number += 1; |
|
198 add_flags(&[Flags::Ready]) |
|
199 }; |
194 }; |
|
195 let (client, room) = server.client_and_room(client_id, room_id); |
200 |
196 |
201 let msg = if client.protocol_number < 38 { |
197 let msg = if client.protocol_number < 38 { |
202 LegacyReady(client.is_ready(), vec![client.nick.clone()]) |
198 LegacyReady(client.is_ready(), vec![client.nick.clone()]) |
203 } else { |
199 } else { |
204 ClientFlags(flags, vec![client.nick.clone()]) |
200 ClientFlags(flags, vec![client.nick.clone()]) |
205 }; |
201 }; |
206 response.add(msg.send_all().in_room(room.id)); |
202 response.add(msg.send_all().in_room(room_id)); |
207 client.set_is_ready(!client.is_ready()); |
|
208 |
203 |
209 if room.is_fixed() && room.ready_players_number == room.players_number { |
204 if room.is_fixed() && room.ready_players_number == room.players_number { |
210 let result = server.start_game(room_id); |
205 let result = server.start_game(room_id); |
211 super::common::get_start_game_data(server, room_id, result, response); |
206 super::common::get_start_game_data(server, room_id, result, response); |
212 } |
207 } |
305 } else { |
300 } else { |
306 response.warn(NO_TEAM); |
301 response.warn(NO_TEAM); |
307 } |
302 } |
308 } |
303 } |
309 SetTeamColor(team_name, color) => { |
304 SetTeamColor(team_name, color) => { |
310 if let Some((owner, team)) = room.find_team_and_owner_mut(|t| t.name == team_name) { |
305 match server.set_team_color(client_id, room_id, &team_name, color) { |
311 if !client.is_master() { |
306 Ok(()) => response.add( |
312 response.error(NOT_MASTER); |
307 TeamColor(team_name, color) |
313 } else { |
308 .send_all() |
314 team.color = color; |
309 .in_room(room_id) |
315 response.add( |
310 .but_self(), |
316 TeamColor(team.name.clone(), color) |
311 ), |
317 .send_all() |
312 Err(ModifyTeamError::NoTeam) => response.warn(NO_TEAM), |
318 .in_room(room_id) |
313 Err(ModifyTeamError::NotMaster) => response.error(NOT_MASTER), |
319 .but_self(), |
|
320 ); |
|
321 server.client_mut(owner).clan = Some(color); |
|
322 } |
|
323 } else { |
|
324 response.warn(NO_TEAM); |
|
325 } |
314 } |
326 } |
315 } |
327 Cfg(cfg) => { |
316 Cfg(cfg) => { |
328 if room.is_fixed() { |
317 if room.is_fixed() { |
329 response.warn(ACCESS_DENIED); |
318 response.warn(ACCESS_DENIED); |