import Ġio . ktor . application .* č Ċ import Ġio . ktor . features .* č Ċ import Ġio . ktor . http . content .* č Ċ import Ġio . ktor . request .* č Ċ import Ġio . ktor . routing .* č Ċ import Ġio . ktor . gson .* č Ċ import Ġio . ktor . http .* č Ċ import Ġio . ktor . response .* č Ċ import Ġio . ktor . util . pipeline .* čĊčĊč Ċ fun ĠApplication . main () Ġ{ čĊĠĠĠ Ġinstall ( Content Neg otiation ) Ġ{ čĊĠĠĠĠĠĠĠ Ġgson Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Pretty Print ing () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisable Html Esc aping () čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġval Ġgs Ġ= ĠGame () čĊčĊĠĠĠ Ġrouting Ġ{ čĊĠĠĠĠĠĠĠ Ġget ("/") Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Redirect ("/ index . html ") čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġstatic ("/") Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġresources ("/") čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġget ("/ api / get ") Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠuserName Ġ= Ġcall . parameters [" userName "] !! čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġctx Ġ= ĠRequest Context ( getCurrent TS (), ĠuserName ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( gs . verify User ( ctx , Ġcall . parameters [" password "] !! )) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( gs . user Get ( ctx )) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . Forbidden , Ġ" access Ġdenied ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġpost (" api / login ") Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Response < API Only User >( gs , Ġ{ Ġis Good Str ( user . password ) Ġ&& Ġis Very Good Str ( user . userName ) Ġ}) Ġ{ Ġctx Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgs . log In ( ctx , Ġuser . password ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġpost ("/ api / send Answer ") Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Response < API Send Answer >( gs , Ġ{ Ġis Good Str ( answer ) Ġ}, Ġis User Ġ= Ġtrue ) Ġ{ Ġctx Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgs . send Answer ( ctx , Ġtheme , Ġproblem , Ġanswer ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġpost ("/ api / start Game ") Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Response < API Only User >( gs , Ġ{ Ġtrue Ġ}, Ġis Admin Ġ= Ġtrue ) Ġ{ Ġctx Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgs . start Game ( ctx ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġpost ("/ api / add Answer ") Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Response < API Send Answer >( gs , Ġ{ Ġis Good Str ( answer ) Ġ}, Ġis Admin Ġ= Ġtrue ) Ġ{ Ġctx Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgs . add Answer ( ctx , Ġtheme , Ġproblem , Ġanswer ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġpost ("/ api / delete Answer ") Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Response < API Send Answer >( gs , Ġ{ Ġis Good Str ( answer ) Ġ}, Ġis Admin Ġ= Ġtrue ) Ġ{ Ġctx Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgs . delete Answer ( ctx , Ġtheme , Ġproblem , Ġanswer ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ/* post (" api / redirectTo GetResult ") Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarg Ġ= Ġcall . receive < API Only User >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġctx Ġ= ĠRequest Context ( getCurrent TS (), Ġarg . user . userName ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! gs . verify Admin ( ctx , Ġarg . user . password )) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . Forbidden , Ġ" Only Ġadmin Ġcan Ġerase Ġresults ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ post čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Text ("/ api / get Results ? token =${ gs . token For Result }") čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġget ("/ api / get Results ") Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġcall . parameters [" token "] !! čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token Ġ!= Ġgs . token For Result ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . Forbidden , Ġ" Invalid Ġtoken ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ get čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . response . header ( HttpHeaders . Content Disposition , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContent Disposition . Attachment . with Parameter ( Content Disposition . Parameters . FileName , Ġ" results . csv "). toString ()) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Text Writer Ġ{ Ġgs . write Result ( this ) Ġ} čĊĠĠĠĠĠĠĠ Ġ}*/ čĊĠĠĠ Ġ} č Ċ } čĊč Ċ private Ġsuspend Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAPI User Action > ĠPipeline Context < Unit , ĠApplication Call >. do Response ( čĊĠĠĠĠĠĠĠ Ġgs : ĠGame , čĊĠĠĠĠĠĠĠ Ġverifier : ĠT . () Ġ-> ĠBoolean , čĊĠĠĠĠĠĠĠ Ġis User : ĠBoolean Ġ= Ġfalse , čĊĠĠĠĠĠĠĠ Ġis Admin : ĠBoolean Ġ= Ġfalse , čĊĠĠĠĠĠĠĠ Ġaction : ĠT .( RequestContext ) Ġ-> ĠActionResult č Ċ ) Ġ{ čĊĠĠĠ Ġval Ġarg Ġ= Ġcall . receive < T >() čĊĠĠĠ Ġval Ġctx Ġ= ĠRequest Context ( getCurrent TS (), Ġarg . user . userName ) čĊĠĠĠ Ġif Ġ((! is User Ġ|| Ġgs . verify User ( ctx , Ġarg . user . password )) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ(! isAdmin Ġ|| Ġverify Admin ( ctx , Ġarg . user . password )) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġverifier ( arg ) čĊĠĠĠ Ġ) Ġ{ čĊĠĠĠĠĠĠĠ Ġcall . respond ( action ( arg , Ġctx )) čĊĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠ Ġcall . respond ( false ) čĊĠĠĠ Ġ} č Ċ } čĊ