package Ġchat . wil low . th ump . plugin . irc Ċ Ċ import Ġchat . wil low . k ale . irc . message . rfc 1 4 5 9 . Priv Msg Message Ċ import Ġchat . wil low . th ump . api . I Service Chat Formatter Ċ import Ġchat . wil low . th ump . api . IT h ump Minecraft Sink Ċ import Ġchat . wil low . th ump . helper . Log Helper Ċ import Ġchat . wil low . th ump . plugin . irc . config . I rc Server Configuration Ċ import Ġchat . wil low . th ump . plugin . irc . config . I rc Service Plugin General Configuration Ċ import Ġchat . wil low . th ump . plugin . irc . handler . Lifecycle Handler Ċ import Ġchat . wil low . th ump . plugin . irc . handler . MessageHandler Ċ import Ġchat . wil low . war ren .* Ċ import Ġchat . wil low . war ren . event .* Ċ import Ġchat . wil low . war ren . event . internal . Send Something Event Ċ import Ġchat . wil low . war ren . state . I rc State Ċ import Ġchat . wil low . war ren . state . Lifecycle State Ċ import Ġnet . minecraftforge . fml . common . F ML Common Handler Ċ import Ġnet . minecraftforge . fml . rel a unch er . Side Ċ import Ġkotlin . concurrent . thread Ċ Ċ enum Ġclass ĠWrapper State Ġ{ ĠREAD Y , ĠRUN NING , ĠRE CONNECT ING Ġ} Ċ Ċ data Ġclass ĠRe connection State ( val Ġshould Re connect : ĠBoolean , Ġvar Ġfor c ibly Disabled : ĠBoolean , Ġval Ġdelay Seconds : ĠInt , Ġval Ġmax Con secutive : ĠInt , Ġvar Ġcurrent Re connect Count : ĠInt Ġ= Ġ 0 ) Ċ Ċ data Ġclass ĠConfiguration State ( val Ġserver : ĠString , Ġval Ġport : ĠInt , Ġval Ġuse TLS : ĠBoolean , Ġval Ġnickname : ĠString , Ġval Ġserver Password : ĠString ? Ġ= Ġnull , Ġval Ġchannels : ĠMap < String , ĠString ? >, Ġval Ġshould Log Incoming Lines : ĠBoolean , Ġval Ġfingerprint s : ĠSet < String > ?, Ġval Ġs asl : ĠS asl Configuration ?, Ġval Ġnick serv : ĠNick Serv Configuration ?) Ċ Ċ interface ĠI Wrapper Ġ{ ĊĠĠĠ Ġfun Ġstart (): ĠBoolean ĊĠĠĠ Ġfun Ġstop ( should Re connect : ĠBoolean Ġ= Ġtrue ): ĠBoolean ĊĠĠĠ Ġfun Ġsend Raw ( line : ĠString ): ĠBoolean ĊĠĠĠ Ġfun ĠsendMessage ( target : ĠString , Ġmessage : ĠString ) ĊĠĠĠ Ġfun ĠsendMessage To All ( message : ĠString ) ĊĊĠĠĠ Ġval Ġserver : ĠString ĊĠĠĠ Ġval Ġchannels : ĠSet < String >? ĊĠĠĠ Ġval Ġnickname : ĠString ? ĊĠĠĠ Ġval Ġstate : ĠWrapper State ĊĠĠĠ Ġval Ġ irc State : ĠI rc State ? ĊĊĠĠĠ Ġval Ġid : ĠString Ċ } Ċ Ċ class ĠI rc Runner Wrapper ( override Ġval Ġid : ĠString , Ġ irc Server Configuration : ĠI rc Server Configuration , Ġgeneral Configuration : ĠI rc Service Plugin General Configuration , Ġprivate Ġval Ġsink : ĠI Th ump Minecraft Sink , Ġprivate Ġval Ġformatter : ĠIService Chat Formatter ): ĠI Wrapper Ġ{ ĊĠĠĠ Ġval Ġreconnect State : ĠRe connection State ĊĠĠĠ Ġoverride Ġval Ġserver : ĠString ĊĊĠĠĠ Ġval Ġconfiguration : ĠConfiguration State ĊĠĠĠ Ġ@ Volatile Ġoverride Ġvar Ġstate : ĠWrapper State Ġ= ĠWrapper State . READY ĊĠĠĠ Ġ@ Volatile Ġprivate Ġvar Ġcurrent Client : ĠI War ren Client ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Volatile Ġprivate Ġvar Ġcurrent Thread : ĠThread ? Ġ= Ġnull ĊĠĠĠ Ġoverride Ġval Ġnickname : ĠString ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcurrent Client ?. state ?. connection ?. nickname ĊĊĠĠĠ Ġoverride Ġval Ġchannels : ĠSet < String >? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcurrent Client ?. state ?. channels ?. joined ?. all ?. keys ĊĊĠĠĠ Ġoverride Ġval Ġ irc State : ĠI rc State ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcurrent Client ?. state ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġreconnect State Ġ= Ġgenerate Re connect State ( irc Server Configuration ) ĊĠĠĠĠĠĠĠ Ġconfiguration Ġ= Ġgenerate Configuration ( irc Server Configuration , Ġgeneral Configuration ) ĊĠĠĠĠĠĠĠ Ġserver Ġ= Ġ irc Server Configuration . server ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Configuration ( irc Server Configuration : ĠI rc Server Configuration , Ġgeneral Configuration : ĠI rc Service Plugin General Configuration ): ĠConfiguration State Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfiltered Fingerprint s Ġ= Ġ irc Server Configuration . for c ibly Accepted Certificates . filter Not ( String :: isBlank ). toSet () ĊĠĠĠĠĠĠĠ Ġvar Ġfingerprint s : ĠSet < String >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( irc Server Configuration . force Accept Certificates ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfingerprint s Ġ= Ġfiltered Fingerprint s ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġs asl Configuration Ġ= Ġif Ġ( irc Server Configuration . identify With S asl ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS asl Configuration ( account Ġ= Ġ irc Server Configuration . sas l Account , Ġpassword Ġ= Ġ irc Server Configuration . sas l Password ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnick serv Configuration Ġ= Ġif Ġ( irc Server Configuration . identify With Nick Serv ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNick Serv Configuration ( account Ġ= Ġ irc Server Configuration . nick Serv Account , Ġpassword Ġ= Ġ irc Server Configuration . nick Serv Password ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠConfiguration State ( irc Server Configuration . server , Ġ irc Server Configuration . port , Ġ irc Server Configuration . use TLS , Ġ irc Server Configuration . nickname , Ġ irc Server Configuration . server Password , Ġ irc Server Configuration . channels , Ġgeneral Configuration . log Raw IR CL ines ToServer Console , Ġfingerprint s , Ġs asl Configuration , Ġnick serv Configuration ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Re connect State ( irc Server Configuration : ĠI rc Server Configuration ): ĠRe connection State Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠRe connection State ( should Re connect Ġ= Ġ irc Server Configuration . should Re connect Autom atically , Ġfor c ibly Disabled Ġ= Ġfalse , Ġdelay Seconds Ġ= Ġ irc Server Configuration . automatic Re connect Delay Seconds , Ġmax Con secutive Ġ= Ġ irc Server Configuration . max Con secutive Re connect Attempts ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Client (): ĠI War ren Client Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfingerprint s Ġ= Ġconfiguration . fingerprint s ĊĠĠĠĠĠĠĠ Ġif Ġ( fingerprint s Ġ!= Ġnull Ġ&& Ġfingerprint s . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Helper . warn (" D ANG ER ĠZ ONE : Ġmaking Ġrunner Ġfor Ġ$ id Ġwith Ġthe Ġ\" accept Ġall Ġcertificates \" Ġoption Ġ- Ġit 's Ġnot Ġsecure ! ĠAdd Ġthe Ġexpected Ġcertificate Ġauthority Ġto Ġyour ĠJava Ġtrust Ġstore , Ġor Ġuse Ġcertificate Ġfingerprint s Ġinstead !") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġuser String Ġ= Ġwhen Ġ( F ML Common Handler . instance (). side ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSide . CLIENT Ġ-> Ġ" th ump Cl nt " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSide . SERVER Ġ-> Ġ" th ump Srv " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" th ump " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠWar ren Client . build Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Ġ= ĠServer Configuration ( configuration . server , Ġconfiguration . port , Ġconfiguration . use TLS , Ġconfiguration . fingerprint s , Ġconfiguration . server Password ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Ġ= ĠUser Configuration ( configuration . nickname , Ġuser String , Ġconfiguration . sas l , Ġconfiguration . nick serv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannels Ġ= ĠChannels Configuration ( configuration . channels ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfire Incoming Line Event Ġ= Ġconfiguration . should Log Incoming Lines ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclient . events . on ( Channel Message Event :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Handler ( sink , Ġthis , Ġformatter ). on Channel Message ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclient . events . on ( Channel ActionEvent :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Handler ( sink , Ġthis , Ġformatter ). on Channel Action ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclient . events . on ( Private Message Event :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Handler ( sink , Ġthis , Ġformatter ). on Private Message ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclient . events . on ( Private ActionEvent :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Handler ( sink , Ġthis , Ġformatter ). on Private Action ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( configuration . should Log Incoming Lines ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . events . on ( Raw Incoming Line Event :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Helper . info ("$ id Ġ>> Ġ${ it . line }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclient . events . on ( Connection Lifecycle Event :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( it . lifecycle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLifecycle State . CONNECTED Ġ-> Ġreconnect State . current Re connect Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLifecycle Handler ( this , Ġsink ). on Connection Lifecycle Changed ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġclient ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsend Raw ( line : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrunner Ġ= Ġcurrent Client ĊĠĠĠĠĠĠĠ Ġif Ġ( runner Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Helper . info ("$ id Ġnot Ġsending Ġraw Ġline Ġbecause Ġthe Ġ irc Ġrunner Ġisn 't Ġrunning : Ġ$ line ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrunner . send ( line ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠsendMessage ( target : ĠString , Ġmessage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrunner Ġ= Ġcurrent Client ĊĠĠĠĠĠĠĠ Ġif Ġ( runner Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Helper . info ("$ id Ġnot Ġsending Ġmessage Ġbecause Ġthe Ġ irc Ġrunner Ġisn 't Ġrunning : Ġ$ target Ġ$ message ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrunner . send ( Priv Msg Message ( target Ġ= Ġtarget , Ġmessage Ġ= Ġmessage )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠsendMessage To All ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchannels Ġ= Ġcurrent Client ?. state ?. channels ?. joined ?. all ?. keys ĊĠĠĠĠĠĠĠ Ġif Ġ( channels Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Helper . info ("$ id Ġcouldn 't Ġget Ġchannels , Ġnot Ġsending Ġmessage Ġ$ message ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( channel Ġin Ġchannels ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsendMessage ( channel , Ġmessage ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstop ( should Re connect : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġ== ĠWrapper State . READY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Helper . error ("$ id Ġwrapper Ġnot Ġrunning Ġ- Ġcan 't Ġend Ġit ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreconnect State . for c ibly Disabled Ġ= Ġ! should Re connect ĊĊĠĠĠĠĠĠĠ Ġval Ġthread Ġ= Ġcurrent Thread ĊĠĠĠĠĠĠĠ Ġif Ġ( thread Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Helper . info ("$ id Ġwrapper Ġdoesn 't Ġhave Ġa Ġthread Ġ- Ġmust Ġalready Ġbe Ġdead ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( thread . is Alive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthread . interrupt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Helper . info ("$ id Ġwaiting Ġfor Ġthread Ġto Ġend Ġclean ly Ġfor Ġ 2 Ġseconds ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthread . join ( 2 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Helper . info ("$ id Ġdone ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreset State Runner And Threads () ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstart (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreconnect State . for c ibly Disabled Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġ== ĠWrapper State . RUNNING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Helper . error ("$ id Ġwrapper Ġis Ġalready Ġrunning / reconnect ing Ġ- Ġcan 't Ġreuse Ġit , Ġb ailing Ġout ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠWrapper State . RUNNING ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrunner Ġ= Ġcreate Client () ĊĠĠĠĠĠĠĠ Ġcurrent Client Ġ= Ġrunner ĊĊĠĠĠĠĠĠĠ Ġval Ġthread Ġ= Ġthread ( name Ġ= Ġ" Th ump Ġ- Ġ$ id ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrunner . start () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Helper . info ("$ id Ġ irc Ġrunner Ġthread Ġended Ġnormally ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Stopped Running () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthread . set Un caught ExceptionHandler Ġ{ Ġ_, Ġexception Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Helper . info ("$ id Ġ irc Ġrunner Ġthread Ġended Ġwith Ġexception : Ġ$ exception ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Stopped Running () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcurrent Thread Ġ= Ġthread ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Stopped Running () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! reconnect State . should Re connect Ġ|| Ġreconnect State . for c ibly Disabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Helper . info ("$ id Ġnot Ġreconnect ing Ġbecause Ġit 's Ġ( for c ibly ) Ġdisabled ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset State Runner And Threads () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreconnect State . current Re connect Count Ġ+= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( reconnect State . current Re connect Count Ġ> Ġreconnect State . max Con secutive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Helper . warn ("$ id Ġnot Ġreconnect ing Ġbecause Ġit Ġtried Ġtoo Ġmany Ġtimes Ġ(${ reconnect State . max Con secutive }) ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreconnect State . current Re connect Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset State Runner And Threads () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstate Ġ= ĠWrapper State . RE CONNECT ING ĊĠĠĠĠĠĠĠ Ġcurrent Client Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcurrent Thread Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġdelay Ms Ġ= Ġreconnect State . delay Seconds Ġ* Ġ 1 0 0 0 L ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Thread . currentThread (). is Inter rupted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset State Runner And Threads () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( delay Ms ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch ( exception : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset State Runner And Threads () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset State Runner And Threads () Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Ġ= ĠWrapper State . READY ĊĊĠĠĠĠĠĠĠ Ġcurrent Client Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcurrent Thread Ġ= Ġnull ĊĠĠĠ Ġ} Ċ }