@@ -2,7 +2,7 @@ use crate::instructions;
22use 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