package Ġru . ale shi . let sp lay cities . base . server Ċ Ċ import Ġio . reactivex . Comp letable Ċ import Ġio . reactivex . Maybe Ċ import Ġio . reactivex . Observable Ċ import Ġru . ale shi . let sp lay cities . base . player . User Ċ import Ġru . qu and ast udio . lp sc lient . core . L PS Message Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ /** Ċ Ġ* ĠBase Ġclass Ġrepresenting Ġgame Ġserver Ġlogic . Ċ Ġ*/ Ċ abstract Ġclass ĠBase Server ( private Ġval Ġtime Limit Supplier : Ġ() Ġ-> ĠLong ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠT riggers Ġwhen Ġopponent Ġsends Ġresponse Ġfor Ġout Ġfriend Ġrequest . ĊĠĠĠĠ Ġ* ĠEst imated Ġresults : ĠAC CEPT ED , ĠD EN IED . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġval Ġfriend Request Result : ĠObservable < L PS Message . L PS Friend Request > Ġ= ĠObservable . never () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠT riggers Ġwhen Ġplayer Ġwas Ġb anned . ĊĠĠĠĠ Ġ* Ġ` true ` Ġmeans Ġthat Ġplayer Ġwas Ġb anned Ġby Ġsystem Ġand Ġ` false ` Ġis Ġthat Ġit Ġwas Ġb anned Ġby Ġopponent . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġval Ġkick : ĠMaybe < Boolean > Ġ= ĠMaybe . never () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġgame Ġtimer , Ġthat Ġticks Ġevery Ġsecond Ġand Ġcompletes Ġwhen Ġtime Ġis Ġout . ĊĠĠĠĠ Ġ* ĠIf Ġ[ time Limit Supplier ] Ġreturns Ġ` 0 ` Ġtimer Ġwon 't Ġemit Ġany Ġevent ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Timer (): ĠObservable < Long > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Limit Ġ= Ġtime Limit Supplier () ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( time Limit Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . interval ( 0 , Ġ 1 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take ( time Limit Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġtime Limit Ġ- Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . never () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEmit s Ġdis connections Ġevent Ġfrom Ġall Ġusers . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Dis connections (): ĠObservable < L PS Message . L PS Leave Message > Ġ= ĠObservable . never () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġwords Ġemitted Ġby Ġall Ġusers ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġget Incoming Words (): ĠObservable < Result With City > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġmessages Ġwritten Ġby Ġall Ġusers ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġget Incoming Messages (): ĠObservable < Result With Message > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġto Ġsend Ġ[ city ] Ġfor Ġvalidation Ġon Ġthe Ġserver . ĊĠĠĠĠ Ġ* Ġ@ param Ġcity Ġinput Ġcity ĊĠĠĠĠ Ġ* Ġ@ param Ġsender Ġcity Ġsender ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġsend City ( city : ĠString , Ġsender : ĠUser ): ĠObservable < Result With City > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġto Ġsend Ġ[ message ] Ġto Ġserver . ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Ġinput Ġmessage ĊĠĠĠĠ Ġ* Ġ@ param Ġsender Ġmessage Ġsender ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun ĠsendMessage ( message : ĠString , Ġsender : ĠUser ): ĠComp letable ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSends Ġfriend Ġrequest Ġfrom Ġplayer Ġto Ġ[ userId ] ĊĠĠĠĠ Ġ* Ġ@ param ĠuserId ĠID Ġof Ġuser Ġthat Ġw anna Ġsent Ġrequest ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġsend Friend Request ( userId : ĠInt ): ĠComp letable Ġ= ĠComp letable . complete () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġ[ userId ] Ġto Ġplayer 's Ġblack Ġlist ĊĠĠĠĠ Ġ* Ġ@ param ĠuserId Ġuser ĠID Ġthat Ġshould Ġbe Ġblocked Ġby Ġplayer ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġban User ( userId : ĠInt ): ĠComp letable Ġ= ĠComp letable . complete () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDis poses Ġall Ġserver Ġrelated Ġresources Ġand Ġcloses Ġconnection ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġdispose () Ġ= ĠUnit Ċ }