/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 ĠAnd r ze j ĠL is Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . lis . spotify . endpoint ĊĊ Ċ import Ġcom . lis . spotify . config . Websocket Spring Configurator Ċ import Ġcom . lis . spotify . service . Last Fm Login Service Ċ import Ġcom . lis . spotify . service . Spot ify Top Play lists Service Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġjavax . websocket .* Ċ import Ġjavax . websocket . server . Path Param Ċ import Ġjavax . websocket . server . Server Endpoint Ċ Ċ @ Component Ċ @ Server Endpoint ( ĊĠĠĠ Ġ"/ socket /{ login }", Ġconfigur ator Ġ= ĠWeb socket Spring Configurator :: class Ċ ) Ċ class ĠYear ly Play lists Endpoint ( ĊĠĠĠ Ġvar Ġspot ify Top Play lists Service : ĠSpotify Top Play lists Service , ĊĠĠĠ Ġvar Ġlast Fm Login Service : ĠLast Fm Login Service Ċ ) Ġ{ ĊĊĠĠĠ Ġvar Ġprogress Map Ġ= Ġmutable Map Of < Int , ĠInt >() ĊĊĠĠĠ Ġ@ On Open ĊĠĠĠ Ġfun Ġon Open ( session : ĠSession , Ġconfig : ĠEndpoint Config , Ġ@ Path Param (" login ") Ġlogin : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlast Fm Login Service . save Login Data ( config . user Properties [" clientId "] Ġas ĠString , Ġlogin ) ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlaunch Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreport Progress ( session ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspot ify Top Play lists Service . update Year ly Play lists ( config . user Properties [" clientId "] Ġas ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Progress ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch . join () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport Progress ( session ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( this @ Year ly Play lists Endpoint ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Progress ( it : ĠPair < Int , ĠInt >) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( this @ Year ly Play lists Endpoint ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Map [ it . first ] Ġ= Ġit . second ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreport Progress ( session : ĠSession ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( this @ Year ly Play lists Endpoint ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession . basic Remote . send Text (( progress Map . values . sum () Ġ/ Ġprogress Map . size ). toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ On Message ĊĠĠĠ Ġfun Ġon Message ( session : ĠSession , Ġpayload : ĠString ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ On Close ĊĠĠĠ Ġfun ĠonClose ( session : ĠSession ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ OnError ĊĠĠĠ Ġfun ĠonError ( session : ĠSession , Ġthrowable : ĠThrowable ) Ġ{ ĊĊĠĠĠ Ġ} Ċ }