package Ġm sw . server . core . watcher Ċ Ċ import Ġcom . google . common . collect . Hash Bi Map Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . sync . Mutex Ċ import Ġkotlinx . coroutines . sync . with Lock Ċ import Ġm sw . server . core . common . add Termination Callback Ċ import Ġm sw . server . core . common . me bib y tes Ċ import Ġm sw . server . core . common . run Command Ċ import Ġm sw . server . core . common . to Command String Ċ import Ġm sw . server . core . model . Server Directory Ċ import Ġm sw . server . core . model . world . World Ċ import Ġm sw . server . rpc . instances . Instance Ċ import Ġm sw . server . rpc . instances . Instance List Ċ Ċ class ĠServer Watcher ( ĊĠĠĠ Ġprivate Ġval Ġdirectory : ĠServer Directory , ĊĠĠĠ Ġprivate Ġval Ġscope : ĠCor outine Scope Ċ ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠERR _ NO _ INSTANCE _ ON _ PORT Ġ= Ġ" no Ġtracked Ġinstance Ġis Ġrunning Ġon Ġport Ġ" ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠERR _ NO _ INSTANCE _ ON _ WORLD Ġ= Ġ" no Ġtracked Ġinstance Ġis Ġrunning Ġon Ġworld Ġ" ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSTOP _ COMMAND Ġ= Ġ" stop " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġreserve Mutex Ġ= ĠMutex () ĊĠĠĠ Ġprivate Ġval Ġlaunch Mutex Ġ= ĠMutex () ĊĠĠĠ Ġprivate Ġval Ġinstances Ġ= Ġmutable Map Of < Int , ĠPair < Process , ĠInstance Configuration >>() ĊĠĠĠ Ġprivate Ġval Ġport Mappings Ġ= ĠHash Bi Map . create < Int , ĠWorld >() ĊĊĠĠĠ Ġsuspend Ġfun Ġlaunch Instance ( port : ĠInt , Ġworld : ĠWorld , Ġconfig : ĠInstance Configuration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreserve Mutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck (! port Mappings . containsKey ( port )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Port Ġ$ port Ġis Ġalready Ġin Ġuse Ġby Ġinstance Ġrunning Ġon Ġworld Ġ'${ port Mappings [ port ]} '" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck (! port Mappings . contains Value ( world )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" World Ġ$ world Ġis Ġalready Ġin Ġuse Ġby Ġinstance Ġrunning Ġon Ġport Ġ${ port Mappings . inverse ()[ world ]}" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġport Mappings [ port ] Ġ= Ġworld ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . add (" java ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . add ("- X ms ${ ( config . heap Init Ġ?: Ġ 1 0 2 4 L . me bib y tes ). to Command String () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . add ("- X mx ${ ( config . heap Max Ġ?: Ġ 1 0 2 4 L . me bib y tes ). to Command String () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . add ("- jar ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . add ("\" ${ directory . root . to Path (). rel ativ ize ( directory . getVersion ( config . version ID )) }\" ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . add ("-- port ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . add ( port . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . add ("-- world ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . add ("\" ${ directory . root . to Path (). rel ativ ize ( world . root . to Path ()) }\" ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! config . gui Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . add (" n og ui ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Mutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory . activate Preset ( config . preset ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstances [ port ] Ġ= Ġdirectory . root ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. run Command ( command ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Termination Callback ( scope ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġport Mappings . remove ( port ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstances . remove ( port ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġto Ġconfig ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exc : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġport Mappings . remove ( port ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstances . remove ( port ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġexc ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġlaunch Instance ( ĊĠĠĠĠĠĠĠ Ġport : ĠInt , ĊĠĠĠĠĠĠĠ Ġworld Name : ĠString , ĊĠĠĠĠĠĠĠ Ġconfig : ĠInstance Configuration ĊĠĠĠ Ġ) Ġ= Ġlaunch Instance ( port , Ġdirectory . get World ( world Name ), Ġconfig ) ĊĊĠĠĠ Ġsuspend Ġfun Ġlaunch Instance ( ĊĠĠĠĠĠĠĠ Ġport : ĠInt , ĊĠĠĠĠĠĠĠ Ġworld Name : ĠString , ĊĠĠĠĠĠĠĠ Ġversion ID : ĠString , ĊĠĠĠĠĠĠĠ Ġpreset ID : ĠString , ĊĠĠĠĠĠĠĠ Ġheap Init : ĠMemory Amount Ġ= Ġ 1 0 2 4 L . me bib y tes , ĊĠĠĠĠĠĠĠ Ġheap Max : ĠMemory Amount Ġ= Ġ 1 0 2 4 L . me bib y tes , ĊĠĠĠĠĠĠĠ Ġgui Enabled : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ) Ġ= Ġlaunch Instance ( ĊĠĠĠĠĠĠĠ Ġport , ĊĠĠĠĠĠĠĠ Ġworld Name , ĊĠĠĠĠĠĠĠ ĠInstance Configuration Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . version ID Ġ= Ġversion ID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . preset ID Ġ= Ġpreset ID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . heap Init Ġ= Ġheap Init ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . heap Max Ġ= Ġheap Max ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . gui Enabled Ġ= Ġgui Enabled ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġget Instances (): ĠInstance List Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcounter Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġreturn ĠInstance List Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstances Ġ= Ġthis @ Server Watcher . instances . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInstance Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġordinal Ġ= Ġcounter ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġport Ġ= Ġit . key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworld Name Ġ= Ġport Mappings [ it . key ] !!. name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġworld On Port ( port : ĠInt ): ĠWorld Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġport Mappings [ port ] Ġ?: Ġthrow ĠIllegalArgumentException ( ERR _ NO _ INSTANCE _ ON _ PORT Ġ+ Ġport ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġport For World ( world : ĠWorld ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġport Mappings . inverse ()[ world ] Ġ?: Ġthrow ĠIllegalArgumentException ( ERR _ NO _ INSTANCE _ ON _ WORLD Ġ+ Ġworld ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġport For World ( world Name : ĠString ): ĠInt Ġ= Ġport For World ( directory . get World ( world Name )) ĊĊĠĠĠ Ġfun Ġinstance On Port ( port : ĠInt ): ĠProcess Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinstances [ port ]?. first Ġ?: Ġthrow ĠIllegalArgumentException ( ERR _ NO _ INSTANCE _ ON _ PORT Ġ+ Ġport ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġconfig On Port ( port : ĠInt ): ĠInstance Configuration Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinstances [ port ]?. second Ġ?: Ġthrow ĠIllegalArgumentException ( ERR _ NO _ INSTANCE _ ON _ PORT Ġ+ Ġport ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinstance On World ( world : ĠWorld ): ĠProcess Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinstance On Port ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġport Mappings . inverse ()[ world ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException ( ERR _ NO _ INSTANCE _ ON _ WORLD Ġ+ Ġworld . name ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġconfig On World ( world : ĠWorld ): ĠInstance Configuration Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconfig On Port ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġport Mappings . inverse ()[ world ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException ( ERR _ NO _ INSTANCE _ ON _ WORLD Ġ+ Ġworld . name ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinstance On World ( world Name : ĠString ): ĠProcess Ġ= Ġinstance On World ( directory . get World ( world Name )) ĊĊĠĠĠ Ġfun Ġconfig On World ( world Name : ĠString ): ĠInstance Configuration Ġ= Ġconfig On World ( directory . get World ( world Name )) ĊĊĠĠĠ Ġfun Ġsend Command ( port : ĠInt , Ġcommand : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= Ġinstances [ port ]?. first Ġ?: Ġthrow ĠIllegalArgumentException ( ERR _ NO _ INSTANCE _ ON _ PORT Ġ+ Ġport ) ĊĠĠĠĠĠĠĠ Ġinstance . output Stream . apply Ġ{ Ġwrite (( command Ġ+ Ġ'\ n '). toByteArray ()) Ġ}. flush () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend Command ( world : ĠWorld , Ġcommand : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsend Command ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġport Mappings . inverse ()[ world ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException ( ERR _ NO _ INSTANCE _ ON _ WORLD Ġ+ Ġworld . name ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend Command ( world Name : ĠString , Ġcommand : ĠString ) Ġ= Ġsend Command ( directory . get World ( world Name ), Ġcommand ) ĊĊĠĠĠ Ġfun Ġstop Instance ( port : ĠInt ) Ġ= Ġsend Command ( port , ĠSTOP _ COMMAND ) ĊĊĠĠĠ Ġfun Ġstop Instance ( world : ĠWorld ) Ġ= Ġsend Command ( world , ĠSTOP _ COMMAND ) ĊĊĠĠĠ Ġfun Ġstop Instance ( world Name : ĠString ) Ġ= Ġsend Command ( world Name , ĠSTOP _ COMMAND ) Ċ }