package Ġme . ih developer . hum ans . service . netty Ċ Ċ import Ġio . netty . buffer . Byte Buf Util Ċ import Ġio . netty . channel . Channel HandlerContext Ċ import Ġio . netty . channel . Simple Channel Inbound Handler Ċ import Ġio . netty . util . Attribute Key Ċ import Ġme . ih developer . hum ans . service . API Handler Ċ import Ġme . ih developer . hum ans . service . protocol . Packet Buffer Ċ import Ġme . ih developer . hum ans . service . protocol . Packet Registry Ċ import Ġme . ih developer . hum ans . service . protocol . Packet ResponseStatus Ċ import Ġme . ih developer . hum ans . service . protocol . request . Packet Request Ping Ċ import Ġme . ih developer . hum ans . service . protocol . request . Packet Request Profile Ċ import Ġme . ih developer . hum ans . service . protocol . request . Packet Request Time Ċ import Ġme . ih developer . hum ans . service . protocol . request . Packet Request Update Profile Ċ import Ġme . ih developer . hum ans . service . protocol . response . Packet Response Hello Ċ import Ġme . ih developer . hum ans . service . protocol . response . Packet Response Ping Ċ import Ġme . ih developer . hum ans . service . protocol . response . Packet Response Profile Ċ import Ġme . ih developer . hum ans . service . protocol . response . Packet Response Time Ċ import Ġme . ih developer . hum ans . service . protocol . response . Packet Response Update Profile Ċ Ċ internal Ġclass ĠPacket Processor ( ĊĠĠĠ Ġprivate Ġval Ġhandler : ĠAPI Handler Ċ ) Ġ: ĠSimple Channel Inbound Handler < Packet Buffer >() Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġname Attr Ġ= ĠAttribute Key . newInstance < String >(" NAME ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġchannel Read 0 ( context : ĠChannel HandlerContext , Ġsource : ĠPacket Buffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnickname Ġ= Ġif Ġ( context . channel (). has Attr ( name Attr )) Ġcontext . channel (). attr ( name Attr ). get () Ġelse Ġcontext . channel (). remote Address (). toString () ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġpacket Ġ= ĠPacket Registry . get ( source )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPacket Response Hello Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpacket . skip Nonce ( source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpacket . skip Status ( source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġpacket . read Name ( source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . channel (). attr ( name Attr ). set ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("[ ${ context . channel (). remote Address ()} ] Ġhas Ġbeen Ġidentified Ġas Ġ$ name ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPacket Request Ping Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnonce Ġ= Ġpacket . read Nonce ( source ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠNet ty Packet Buffer . alloc () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPacket Response Ping . write ( buffer , Ġnonce ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . write And Flush ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPacket Request Time Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġhandler . getTime () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠNet ty Packet Buffer . alloc () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPacket Response Time . write ( buffer , Ġpacket . read Nonce ( source ). toInt (), Ġtime ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" [$ nickname ] ĠRequest ed Ġtime ! Ġreply ing Ġwith Ġtime ... Ġ( current : Ġ$ time )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . write And Flush ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPacket Request Profile Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnonce Ġ= Ġpacket . read Nonce ( source ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġpacket . read Name ( source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġhandler . get Profile ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠNet ty Packet Buffer . alloc () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPacket Response Profile . write ( buffer , Ġnonce , Ġresponse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" [$ nickname ] ĠRequest ed Ġprofile Ġwith Ġname Ġ$ name ! Ġreply ing Ġwith Ġprofile Ġdata ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . write And Flush ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPacket Request Update Profile Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnonce Ġ= Ġpacket . read Nonce ( source ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġpacket . read Name ( source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprofile Ġ= Ġpacket . read Profile ( source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse : ĠPacket ResponseStatus Ġ= Ġif Ġ( handler . update Profile ( name , Ġprofile )) ĠPacket ResponseStatus . OK Ġelse ĠPacket ResponseStatus . NOT _ FOUND ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠNet ty Packet Buffer . alloc () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPacket Response Update Profile . write ( buffer , Ġnonce , Ġresponse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" [$ nickname ] ĠRequest ed Ġto Ġupdate Ġprofile Ġwith Ġname Ġ$ name ! Ġreply ing Ġwith Ġupdate Ġstatus ... Ġ( status : Ġ$ response )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . write And Flush ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" [$ nickname ] ĠSent Ġan Ġunknown Ġpacket ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Packet ĠBuffer ĠHex ĠDump :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( source Ġis ĠNet ty Packet Buffer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( Byte Buf Util . hex Dump ( source . buf )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource . buf . release () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Unable Ġto Ġprocess Ġunknown Ġpacket !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġexception Ca ught ( ctx : ĠChannel HandlerContext , Ġcause : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Failed Ġto Ġparse Ġa Ġpacket ! ĠClosing Ġthe Ġchannel ...") ĊĠĠĠĠĠĠĠ Ġcause . printStackTrace () ĊĠĠĠĠĠĠĠ Ġctx . close () ĊĠĠĠ Ġ} Ċ }