@ file : Suppress (" Matching Declaration Name ") Ċ Ċ package Ġnet . b jo ern pe ters en . q bert . rest . location Ċ Ċ import Ġcom . google . inject . Injector Ċ import Ġio . ktor . application . call Ċ import Ġio . ktor . auth . authenticate Ċ import Ġio . ktor . locations . K tor Experimental Locations API Ċ import Ġio . ktor . locations . Location Ċ import Ġio . ktor . locations . get Ċ import Ġio . ktor . locations . put Ċ import Ġio . ktor . request . receive Ċ import Ġio . ktor . response . respond Ċ import Ġio . ktor . routing . Route Ċ import Ġmu . Kotlin Logging Ċ import Ġnet . b jo ern pe ters en . music bot . api . auth . Permission Ċ import Ġnet . b jo ern pe ters en . music bot . api . player . Progress Tracker Ċ import Ġnet . b jo ern pe ters en . music bot . spi . player . Player Ċ import Ġnet . b jo ern pe ters en . q bert . impl . getValue Ċ import Ġnet . b jo ern pe ters en . q bert . rest . model . Player State Ċ import Ġnet . b jo ern pe ters en . q bert . rest . model . Player State Action Ċ import Ġnet . b jo ern pe ters en . q bert . rest . model . Player StateChange Ċ import Ġnet . b jo ern pe ters en . q bert . rest . model . to Model Ċ import Ġnet . b jo ern pe ters en . q bert . rest . require Ċ import Ġjavax . inject . Inject Ċ Ċ private Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} Ċ Ċ @ K tor Experimental Locations API Ċ @ Location ("/ player ") Ċ class ĠPlayer State Request Ċ Ċ private Ġclass ĠPlayer Access Ġ@ Inject Ġprivate Ġconstructor ( ĊĠĠĠ Ġval Ġplayer : ĠPlayer , ĊĠĠĠ Ġval Ġprogress Tracker : ĠProgress Tracker Ċ ) Ġ{ ĊĠĠĠ Ġsuspend Ġfun Ġresume () Ġ{ ĊĠĠĠĠĠĠĠ Ġplayer . play () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġpause () Ġ{ ĊĠĠĠĠĠĠĠ Ġplayer . pause () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġskip () Ġ{ ĊĠĠĠĠĠĠĠ Ġplayer . next () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġget Player State (): ĠPlayer State Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġprogress Ġ= Ġprogress Tracker . getCurrent Progress (). duration . seconds . toInt () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( progress Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġ" Got Ġnegative Ġprogress Ġfrom Ġtracker " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġplayer . state ĊĠĠĠĠĠĠĠ Ġval Ġsong Duration Ġ= Ġstate . entry ?. song ?. duration ĊĠĠĠĠĠĠĠ Ġif Ġ( song Duration Ġ!= Ġnull Ġ&& Ġprogress Ġ> Ġsong Duration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ= Ġsong Duration ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġplayer . state . to Model ( progress ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ K tor Experimental Locations API Ċ fun ĠRoute . route Player ( injector : ĠInject or ) Ġ{ ĊĠĠĠ Ġval Ġplayer Access : ĠPlayer Access Ġby Ġinjector ĊĠĠĠ Ġplayer Access . apply Ġ{ ĊĠĠĠĠĠĠĠ Ġauthenticate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget < Player State Request > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( getPlayer State ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġput < Player State Request > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchange : ĠPlayer StateChange Ġ= Ġcall . receive () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( change . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer State Action . PLAY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( Permission . PAUSE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresume () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer State Action . PAUSE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( Permission . PAUSE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpause () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer State Action . SKIP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( Permission . SKIP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( getPlayer State ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ