package Ġnet . tj alp . pe ach . pump kin . player Ċ Ċ import Ġnet . tj alp . pe ach . pe el . PLAYER _ SWITCH Ċ import Ġnet . tj alp . pe ach . pe el . signal . Player Switch Signal Ċ import Ġnet . tj alp . pe ach . pump kin . Pump kin Server Ċ import Ġnet . tj alp . pe ach . pump kin . node . apple . Apple Node Ċ import Ġnet . tj alp . pe ach . pump kin . node . apple . Apple Server Node Ċ import Ġnet . tj alp . pe ach . pump kin . node . me lon . Mel on Node Ċ import Ġnet . tj alp . pe ach . pump kin . node . me lon . Mel on Server Node Ċ import Ġreactor . core . publisher . Mono Ċ import Ġjava . util .* Ċ Ċ class ĠPlayer Service ( ĊĠĠĠ Ġval Ġpump kin : ĠP ump kin Server Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġthread Ġ= Ġpump kin . main Thread ĊĊĠĠĠ Ġprivate Ġval Ġregistered Players Ġ= Ġmutable ListOf < P each Player >() ĊĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġpump kin . logger . info (" Setting Ġup Ġplayer Ġservice ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġswitch ( player : ĠP each Player , Ġnode : ĠApple Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthread . ensure MainThread () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! node . is Online ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Target ĠApple ĠNode Ġis Ġnot Ġonline !") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( player . current Apple Node Ġ!= Ġnode ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( player . current Apple Node Ġas ĠApple Server Node ). connected Players . remove ( player ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( node Ġas ĠApple Server Node ). connected Players . add ( player Ġas ĠConnected Player ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . current Apple Node Ġ= Ġnode ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsignal Ġ= ĠPlayer Switch Signal (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . unique Id Ġ= Ġplayer . unique Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . nodeId Ġ= Ġnode . node Identifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpump kin . redis . publish ( PLAYER _ SWITCH , Ġsignal ). subscribe () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Player ( unique Id : ĠUUID ): ĠP each Player ? Ġ{ ĊĠĠĠĠĠĠĠ Ġthread . ensure MainThread () ĊĠĠĠĠĠĠĠ Ġreturn Ġregistered Players . first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . unique Id Ġ== Ġunique Id ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Players ( username : ĠString ): ĠList < P each Player > Ġ{ ĊĠĠĠĠĠĠĠ Ġthread . ensure MainThread () ĊĠĠĠĠĠĠĠ Ġreturn Ġregistered Players . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . username Ġ== Ġusername ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġregister ( ĊĠĠĠĠĠĠĠ Ġunique Id : ĠUUID , ĊĠĠĠĠĠĠĠ Ġusername : ĠString , ĊĠĠĠĠĠĠĠ Ġme lon Node : ĠMel on Node , ĊĠĠĠĠĠĠĠ Ġapple Node : ĠApple Node ĊĠĠĠ Ġ): ĠP each Player Ġ{ ĊĠĠĠĠĠĠĠ Ġthread . ensure MainThread () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( registered Players . any Ġ{ Ġit . unique Id Ġ== Ġunique Id Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" A Ġplayer Ġwith Ġthe Ġunique Ġidentifier Ġ$ unique Id Ġis Ġalready Ġregistered !") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġconnected Player Ġ= ĠConnected Player ( unique Id , Ġusername , Ġme lon Node , Ġapple Node ) ĊĠĠĠĠĠĠĠ Ġval Ġme lon Server Node Ġ= Ġme lon Node Ġas ĠMel on Server Node ĊĠĠĠĠĠĠĠ Ġval Ġapple Server Node Ġ= Ġapple Node Ġas ĠApple Server Node ĊĊĠĠĠĠĠĠĠ Ġme lon Server Node . connected Players . add ( connected Player ) ĊĠĠĠĠĠĠĠ Ġapple Server Node . connected Players . add ( connected Player ) ĊĊĠĠĠĠĠĠĠ Ġregistered Players . add ( connected Player ) ĊĊĠĠĠĠĠĠĠ Ġpump kin . logger . info (" Registered Ġplayer Ġ( username : Ġ$ username , Ġunique Id : Ġ$ unique Id )") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġconnected Player ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġunregister ( player : ĠConnected Player ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthread . ensure MainThread () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( player Ġ! in Ġregistered Players ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Unknown Ġplayer Ġ$ player ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġme lon Server Node Ġ= Ġplayer . current Mel on Node Ġas ĠMel on Server Node ĊĠĠĠĠĠĠĠ Ġval Ġapple Server Node Ġ= Ġplayer . current Apple Node Ġas ĠApple Server Node ĊĊĠĠĠĠĠĠĠ Ġme lon Server Node . connected Players . remove ( player ) ĊĠĠĠĠĠĠĠ Ġapple Server Node . connected Players . remove ( player ) ĊĊĠĠĠĠĠĠĠ Ġregistered Players . remove ( player ) ĊĊĠĠĠĠĠĠĠ Ġpump kin . logger . info (" Un registered Ġplayer Ġ( username : Ġ${ player . username }, Ġunique Id : Ġ${ player . unique Id }) ") ĊĠĠĠ Ġ} Ċ }