Skip to content

Commit 728cc61

Browse files
authored
refactor(client): improve readability of handle_server_message (#55)
1 parent eb5893c commit 728cc61

1 file changed

Lines changed: 80 additions & 29 deletions

File tree

crates/client/src/client.rs

Lines changed: 80 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::instructions;
22
use shared::{
33
logger::Logger,
44
messages::{
5-
self, receive_message, send_message, Action, Hint, Message, RegisterTeam,
5+
self, receive_message, send_message, Action, Challenge, Hint, Message, RegisterTeam,
66
RegisterTeamResult, SubscribePlayer, SubscribePlayerResult,
77
},
88
radar::{decode_base64, extract_data},
@@ -93,7 +93,7 @@ impl GameClient {
9393
.spawn(move || {
9494
let mut stream = Self::connect_to_server(&config.server_addr, max_retries);
9595
let subscribe_msg = Message::SubscribePlayer(SubscribePlayer {
96-
name: agent_name,
96+
name: agent_name.clone(),
9797
registration_token: agent_token,
9898
});
9999

@@ -105,7 +105,7 @@ impl GameClient {
105105
}
106106

107107
while let Ok(msg) = receive_message(&mut stream) {
108-
Self::handle_server_message(&mut stream, msg, &secrets_sum);
108+
Self::handle_server_message(&mut stream, &agent_name, msg, &secrets_sum);
109109
}
110110
})
111111
.map_err(|e| format!("Failed to spawn thread: {}", e))?;
@@ -121,54 +121,39 @@ impl GameClient {
121121

122122
fn handle_server_message(
123123
stream: &mut TcpStream,
124+
thread_name: &str,
124125
message: Message,
125126
secrets_sum: &SecretSumModulo,
126127
) {
127128
let logger = Logger::get_instance();
128129
let thread = std::thread::current();
129-
let name = thread.name().unwrap_or("Unknown");
130130

131-
logger.debug(&format!("{} received message: {:?}", name, message));
131+
logger.debug(&format!("{} received message: {:?}", thread_name, message));
132132

133133
match message {
134134
Message::SubscribePlayerResult(result) => match result {
135135
SubscribePlayerResult::Ok => {
136-
logger.info(&format!("{} has successfully subscribed to game", name));
136+
logger.info(&format!("{} has successfully subscribed to game", thread_name));
137137
}
138138
SubscribePlayerResult::Err(err) => {
139-
logger.error(&format!("{} failed to subscribe: {:?}", name, err));
139+
logger.error(&format!("{} failed to subscribe: {:?}", thread_name, err));
140140
}
141141
},
142142
Message::RadarView(view) => {
143-
let (horizontal, vertical, cells) = extract_data(&decode_base64(&view.0));
144-
let action = instructions::right_hand_solver(horizontal, vertical);
145-
let is_win = instructions::check_win_condition(cells, action.clone());
146-
match send_message(stream, &Message::Action(action)) {
147-
Ok(_) => {}
148-
Err(e) => {
149-
logger.error(&format!("Failed to send action: {}", e));
150-
}
151-
}
152-
153-
if is_win {
154-
logger.info(&format!("{} has found the exit!", name));
155-
}
143+
Self::handle_radar_view(stream, logger, thread_name, view);
156144
}
157-
Message::Hint(hint) => match hint {
158-
Hint::Secret(secret) => {
145+
Message::Hint(hint) => {
146+
if let Hint::Secret(secret) = hint {
159147
if let Ok(mut secrets) = secrets_sum.secrets.lock() {
160148
secrets.insert(thread.id(), secret);
161149
}
162150
}
163-
_ => {
164-
logger.warn(&format!("{} received unhandled hint: {:?}", name, hint));
165-
}
166-
},
151+
}
167152
Message::Challenge(value) => {
168-
logger.info(&format!("{} received challenge: {:?}", name, value));
153+
logger.info(&format!("{} received challenge: {:?}", thread_name, value));
169154

170155
match value {
171-
shared::messages::Challenge::SecretSumModulo(challenge) => {
156+
Challenge::SecretSumModulo(challenge) => {
172157
Self::handle_secret_sum_modulo(
173158
stream,
174159
&secrets_sum.secrets,
@@ -180,7 +165,7 @@ impl GameClient {
180165
}
181166
Message::ActionError(err) => match err {
182167
messages::ActionError::InvalidChallengeSolution => {
183-
logger.info(&format!("{} failed to solve challenge, retrying...", name));
168+
logger.info(&format!("{} failed to solve challenge, retrying...", thread_name));
184169
Self::handle_secret_sum_modulo(
185170
stream,
186171
&secrets_sum.secrets,
@@ -221,6 +206,24 @@ impl GameClient {
221206
}
222207
}
223208
}
209+
210+
fn handle_radar_view(
211+
stream: &mut TcpStream,
212+
logger: &Logger,
213+
thread_name: &str,
214+
view: messages::RadarView,
215+
) {
216+
let (horizontal, vertical, cells) = extract_data(&decode_base64(&view.0));
217+
let action = instructions::right_hand_solver(horizontal, vertical);
218+
let is_win = instructions::check_win_condition(cells, action.clone());
219+
if let Err(e) = send_message(stream, &Message::Action(action)) {
220+
logger.error(&format!("{} failed to send action: {}", thread_name, e));
221+
}
222+
223+
if is_win {
224+
logger.info(&format!("{} has found the exit!", thread_name));
225+
}
226+
}
224227
}
225228

226229
#[cfg(test)]
@@ -263,6 +266,7 @@ mod tests {
263266

264267
GameClient::handle_server_message(
265268
&mut stream,
269+
"Player1",
266270
message,
267271
&SecretSumModulo {
268272
sum: Arc::new(Mutex::new(0)),
@@ -283,4 +287,51 @@ mod tests {
283287
assert_eq!(client.config.server_addr, config.server_addr);
284288
assert_eq!(client.config.team_name, config.team_name);
285289
}
290+
291+
#[test]
292+
fn test_handle_secret_sum_modulo() {
293+
let (listener, addr) = setup_mock_server();
294+
295+
thread::spawn(move || {
296+
listener.accept().unwrap();
297+
});
298+
299+
let mut stream = TcpStream::connect(addr).unwrap();
300+
301+
let secrets = Arc::new(Mutex::new(HashMap::new()));
302+
303+
let secret_sum = Arc::new(Mutex::new(0));
304+
305+
let message = Message::Challenge(messages::Challenge::SecretSumModulo(10));
306+
307+
GameClient::handle_server_message(
308+
&mut stream,
309+
"Player1",
310+
message,
311+
&SecretSumModulo { sum: secret_sum, secrets },
312+
);
313+
}
314+
315+
#[test]
316+
fn test_handle_radar_view() {
317+
let (listener, addr) = setup_mock_server();
318+
319+
thread::spawn(move || {
320+
listener.accept().unwrap();
321+
});
322+
323+
let mut stream = TcpStream::connect(addr).unwrap();
324+
325+
let message = Message::RadarView(messages::RadarView("bKgGjsIyap8p8aa".to_string()));
326+
327+
GameClient::handle_server_message(
328+
&mut stream,
329+
"Player1",
330+
message,
331+
&SecretSumModulo {
332+
sum: Arc::new(Mutex::new(0)),
333+
secrets: Arc::new(Mutex::new(HashMap::new())),
334+
},
335+
);
336+
}
286337
}

0 commit comments

Comments
 (0)