package Ġw ot w . server . api Ċ Ċ import Ġio . ktor . application .* Ċ import Ġio . ktor . auth .* Ċ import Ġio . ktor . features .* Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . http . c io . websocket .* Ċ import Ġio . ktor . request .* Ċ import Ġio . ktor . response .* Ċ import Ġio . ktor . routing .* Ċ import Ġio . ktor . util .* Ċ import Ġio . ktor . websocket .* Ċ import Ġorg . jetbrains . ex posed . sql . transactions . experimental . new Sus pended Transaction Ċ import Ġw ot w . io . messages . B ingo Config Ċ import Ġw ot w . io . messages . Mult iverse Creation Config Ċ import Ġw ot w . io . messages . protobuf . B ingo Data Ċ import Ġw ot w . io . messages . protobuf . B ingo thon Board Ċ import Ġw ot w . io . messages . protobuf . B ingo thon Goal Ċ import Ġw ot w . io . messages . protobuf . Position Ċ import Ġw ot w . server . bing o . B ingo Board Generator Ċ import Ġw ot w . server . database . model . Mult iverse Ċ import Ġw ot w . server . database . model . User Ċ import Ġw ot w . server . database . model . World Ċ import Ġw ot w . server . io . handle Client Socket Ċ import Ġw ot w . server . main . W ot w Backend Server Ċ import Ġw ot w . server . util . logger Ċ import Ġjava . util . concurrent . Cancellation Exception Ċ Ċ class ĠB ingo Endpoint ( server : ĠW ot w Backend Server ) Ġ: ĠEndpoint ( server ) Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠRoute . init Routing () Ġ{ ĊĠĠĠĠĠĠĠ Ġget (" bing o / latest /{ player Id ? }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġboard Data Ġ= Ġnew Sus pended Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . parameters [" player Id "] ?. if Empty Ġ{ Ġnull Ġ} ?. let Ġ{ ĠUser . findById ( it ) Ġ} Ġ?: Ġauthenticated User () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmult iverse Ġ= Ġplayer . current Mult iverse Ġ?: Ġthrow ĠNotFound Exception () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmult iverse . board Ġ?: Ġthrow ĠNotFound Exception () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġmult iverse . bing o Un iverse Info () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB ingo Data ( mult iverse . create Sync able Board ( World . find ( mult iverse . id . value , Ġplayer . id . value )?. universe ), Ġinfo ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( board Data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġget (" bing o thon / latest /{ player Id ? }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġboard Data Ġ= Ġnew Sus pended Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . parameters [" player Id "] ?. if Empty Ġ{ Ġnull Ġ} ?. let Ġ{ ĠUser . findById ( it ) Ġ} Ġ?: Ġauthenticated User () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmult iverse Ġ= Ġplayer . current Mult iverse Ġ?: Ġthrow ĠNotFound Exception () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmult iverse . board Ġ?: Ġthrow ĠNotFound Exception () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġmult iverse . bing o Un iverse Info () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠB ingo Data ( mult iverse . create Sync able Board ( World . find ( mult iverse . id . value , Ġplayer . id . value )?. universe , Ġfalse , Ġtrue ), Ġinfo ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos To Id : Ġ( Position ) Ġ-> ĠInt Ġ= Ġ{ it . x Ġ- Ġ 1 Ġ+ Ġ( it . y Ġ- Ġ 1 ) Ġ* Ġ 5 } ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB ingo thon Board ( data . board . squares . sorted By Ġ{ Ġpos To Id ( it . position ) Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB ingo thon Goal ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . square . completed By . isNotEmpty (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . square . text Ġ+ Ġ"\ n " Ġ+ Ġit . square . goals . join ToString ("\ n ") Ġ{ Ġit . text Ġ+ Ġif ( it . completed ) Ġ" Ġâľĵ " Ġelse Ġ"" }) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġmult iverse . board ?. config ?. discovery ?. map Ġ{ Ġit . first Ġ- Ġ 1 Ġ+ Ġ( it . second Ġ- Ġ 1 )* Ġ 5 Ġ} ?. toSet () Ġ?: Ġempty Set ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( board Data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġuser board Websocket () ĊĊĠĠĠĠĠĠĠ Ġauthenticate ( JWT _ AUTH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget (" bing o /{ mult iverse _ id }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmult iverse Id Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . parameters [" mult iverse _ id "] ?. to Long OrNull () Ġ?: Ġthrow ĠBadRequest Exception (" Cannot Ġparse Ġmult iverse _ id ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplayer Is Spect ator Ġ= Ġnew Sus pended Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmult iverse Ġ= ĠMult iverse . findById ( mult iverse Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= Ġauthenticated User OrNull () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Ġ!= Ġnull Ġ&& Ġmult iverse ?. spect ators ?. contains ( player ) Ġ?: Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Sus pended Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġboard Data Ġ= Ġnew Sus pended Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= Ġauthenticated User OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġworld Ġ= Ġplayer ?. let Ġ{ ĠWorld . find ( mult iverse Id , Ġplayer . id . value ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmult iverse Ġ= ĠMult iverse . findById ( mult iverse Id ) Ġ?: Ġthrow ĠNotFound Exception () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmult iverse . board Ġ?: Ġthrow ĠNotFound Exception () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġmult iverse . bing o Un iverse Info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB ingo Data ( mult iverse . create Sync able Board ( world ?. universe , Ġplayer Is Spect ator ), Ġinfo ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( board Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġobserver Websocket () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠRoute . user board Websocket () Ġ{ ĊĠĠĠĠĠĠĠ Ġweb Socket ( path Ġ= Ġ"/ ob servers / latest /") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplayer Id Ġ= Ġcall . w ot w Principal OrNull ()?. userId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn @ web Socket Ġthis . close ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClose Reason ( Close Reason . Codes . VI OL ATED _ POLICY , Ġ" No Ġplayer Id !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! call . w ot w Principal (). has Scope ( Scope . BO AR DS _ READ )) Ġreturn @ web Socket Ġthis . close ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClose Reason ( Close Reason . Codes . VI OL ATED _ POLICY , Ġ" No Ġread Ġaccess !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Client Socket Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Authenticated Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver . connections . register Observer Connection ( socket Connection , Ġnull , Ġplayer Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver . connections . unregister Observer Connection ( socket Connection , Ġnull , Ġplayer Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ! is ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger (). error ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver . connections . unregister Observer Connection ( socket Connection , Ġnull , Ġplayer Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ web Socket . close ( Close Reason ( Close Reason . Codes . INTERNAL _ ERROR , Ġ" an Ġerror Ġoccurred ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠRoute . observer Websocket () Ġ{ ĊĠĠĠĠĠĠĠ Ġweb Socket ( path Ġ= Ġ"/ ob servers /{ mult iverse _ id }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmult iverse Id Ġ= Ġcall . parameters [" mult iverse _ id "] ?. to Long OrNull () Ġ?: Ġreturn @ web Socket Ġthis . close ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClose Reason ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClose Reason . Codes . VI OL ATED _ POLICY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Mult iverse - ID Ġis Ġrequired " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Client Socket Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Authenticated Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! principal . has Scope ( Scope . BO AR DS _ READ )) Ġreturn @ after Authenticated Ġthis @ web Socket . close ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClose Reason ( Close Reason . Codes . VI OL ATED _ POLICY , Ġ" No Ġread Ġaccess !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplayer Id Ġ= Ġprincipal . userId ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( mult iverse Exists , Ġplayer Is Spect ator ) Ġ= Ġnew Sus pended Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmult iverse Ġ= ĠMult iverse . findById ( mult iverse Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= ĠUser . findById ( player Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( mult iverse Ġ!= Ġnull ) Ġto Ġ( mult iverse ?. spect ators ?. contains ( player ) Ġ?: Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! mult iverse Exists ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ after Authenticated Ġthis @ web Socket . close ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClose Reason ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClose Reason . Codes . NORMAL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Requested ĠMult iverse Ġdoes Ġnot Ġexist " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver . connections . register Observer Connection ( socket Connection , Ġmult iverse Id , Ġplayer Id , Ġplayer Is Spect ator ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver . connections . unregister All Observer Connections ( socket Connection , Ġmult iverse Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver . connections . unregister All Observer Connections ( socket Connection , Ġmult iverse Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Message ( Any :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Incoming ĠMessage : Ġ$ this ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }