/* Ċ Ġ* Ġ ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠFre ya ĠA rb j erg Ġand Ġcontributors Ċ Ġ* Ċ Ġ* Ġ Ġ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 Ġl aval ink . server . io Ċ Ċ import Ġcom . sed mell uq . discord . lav ap layer . track . Track Marker Ċ import Ġl aval ink . server . player . Track End Marker Handler Ċ import Ġl aval ink . server . player . filters . configs . Band Ċ import Ġl aval ink . server . player . filters . FilterChain Ċ import Ġl aval ink . server . util . Util Ċ import Ġmo e . ky ok obot . ko e . Voice Server Info Ċ import Ġorg . json . JSONObject Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . slf 4 j . LoggerFactory Ċ Ċ class ĠWebSocket Handlers Ġ{ ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlog : ĠLogger Ġ= ĠLoggerFactory . getLogger ( WebSocket Handlers :: class . java ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġvar Ġlogged Volume De precation Warning Ġ= Ġfalse ĊĠ Ġprivate Ġvar Ġlogged Equal izer De precation Warning Ġ= Ġfalse ĊĊĠ Ġfun Ġvoice Update ( context : ĠSocket Context , Ġjson : ĠJSONObject ) Ġ{ ĊĠĠĠ Ġval ĠsessionId Ġ= Ġjson . getString (" sessionId ") ĊĠĠĠ Ġval Ġguild Id Ġ= Ġjson . getLong (" guild Id ") ĊĊĠĠĠ Ġval Ġevent Ġ= Ġjson . getJSONObject (" event ") ĊĠĠĠ Ġval Ġendpoint : ĠString ? Ġ= Ġevent . opt String (" endpoint ") ĊĠĠĠ Ġval Ġtoken : ĠString Ġ= Ġevent . getString (" token ") ĊĊĠĠĠ Ġ// discord Ġsometimes Ġsend Ġa Ġpartial Ġserver Ġupdate Ġmissing Ġthe Ġendpoint , Ġwhich Ġcan Ġbe Ġignored . ĊĠĠĠ Ġendpoint Ġ?: Ġreturn ĊĊĠĠĠ Ġval Ġplayer Ġ= Ġcontext . getPlayer ( guild Id ) ĊĠĠĠ Ġval Ġconn Ġ= Ġcontext . get Media Connection ( player ) ĊĠĠĠ Ġconn . connect ( Voice Server Info ( sessionId , Ġendpoint , Ġtoken )). when Complete Ġ{ _, Ġ_ Ġ-> ĊĠĠĠĠĠ Ġplayer . provide To ( conn ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġplay ( context : ĠSocket Context , Ġjson : ĠJSONObject ) Ġ{ ĊĠĠĠ Ġval Ġplayer Ġ= Ġcontext . getPlayer ( json . getString (" guild Id ")) ĊĠĠĠ Ġval Ġno Replace Ġ= Ġjson . opt Boolean (" no Replace ", Ġfalse ) ĊĊĠĠĠ Ġif Ġ( no Replace Ġ&& Ġplayer . playing Track Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġlog . info (" Skipping Ġplay Ġrequest Ġbecause Ġof Ġno Replace ") ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtrack Ġ= ĠUtil . decode Audio Track ( context . audio Player Manager , Ġjson . getString (" track ")) ĊĊĠĠĠ Ġif Ġ( json . has (" startTime ")) Ġ{ ĊĠĠĠĠĠ Ġtrack . position Ġ= Ġjson . getLong (" startTime ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġplayer . set Pause ( json . opt Boolean (" pause ", Ġfalse )) ĊĠĠĠ Ġif Ġ( json . has (" volume ")) Ġ{ ĊĠĠĠĠĠ Ġif Ġ(! logged Volume De precation Warning ) Ġlog . warn (" The Ġvolume Ġproperty Ġin Ġthe Ġplay Ġoperation Ġhas Ġbeen Ġdeprecated " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" and Ġwill Ġbe Ġremoved Ġin Ġv 4 . ĠPlease Ġconfigure Ġa Ġfilter Ġinstead . ĠNote Ġthat Ġthe Ġnew Ġfilter Ġtakes Ġa Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ" float Ġvalue Ġwith Ġ 1 . 0 Ġbeing Ġ 1 0 0 % ") ĊĠĠĠĠĠ Ġlogged Volume De precation Warning Ġ= Ġtrue ĊĠĠĠĠĠ Ġval Ġfilters Ġ= Ġplayer . filters Ġ?: ĠFilter Chain () ĊĠĠĠĠĠ Ġfilters . volume Ġ= Ġjson . get Float (" volume ") Ġ/ Ġ 1 0 0 ĊĠĠĠĠĠ Ġplayer . filters Ġ= Ġfilters ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( json . has (" endTime ")) Ġ{ ĊĠĠĠĠĠ Ġval Ġstop Time Ġ= Ġjson . getLong (" endTime ") ĊĠĠĠĠĠ Ġif Ġ( stop Time Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠTrack End Marker Handler ( player ) ĊĠĠĠĠĠĠĠ Ġval Ġmarker Ġ= ĠTrack Marker ( stop Time , Ġhandler ) ĊĠĠĠĠĠĠĠ Ġtrack . set Marker ( marker ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġplayer . play ( track ) ĊĠ Ġ} ĊĊĠ Ġfun Ġstop ( context : ĠSocket Context , Ġjson : ĠJSONObject ) Ġ{ ĊĠĠĠ Ġval Ġplayer Ġ= Ġcontext . getPlayer ( json . getString (" guild Id ")) ĊĠĠĠ Ġplayer . stop () ĊĠ Ġ} ĊĊĠ Ġfun Ġpause ( context : ĠSocket Context , Ġjson : ĠJSONObject ) Ġ{ ĊĠĠĠ Ġval Ġplayer Ġ= Ġcontext . getPlayer ( json . getString (" guild Id ")) ĊĠĠĠ Ġplayer . set Pause ( json . getBoolean (" pause ")) ĊĠĠĠ ĠSocket Server . send Player Update ( context , Ġplayer ) ĊĠ Ġ} ĊĊĠ Ġfun Ġseek ( context : ĠSocket Context , Ġjson : ĠJSONObject ) Ġ{ ĊĠĠĠ Ġval Ġplayer Ġ= Ġcontext . getPlayer ( json . getString (" guild Id ")) ĊĠĠĠ Ġplayer . seek To ( json . getLong (" position ")) ĊĠĠĠ ĠSocket Server . send Player Update ( context , Ġplayer ) ĊĠ Ġ} ĊĊĠ Ġfun Ġvolume ( context : ĠSocket Context , Ġjson : ĠJSONObject ) Ġ{ ĊĠĠĠ Ġval Ġplayer Ġ= Ġcontext . getPlayer ( json . getString (" guild Id ")) ĊĠĠĠ Ġplayer . set Volume ( json . getInt (" volume ")) ĊĠ Ġ} ĊĊĠ Ġfun Ġequal izer ( context : ĠSocket Context , Ġjson : ĠJSONObject ) Ġ{ ĊĠĠĠ Ġif Ġ(! logged Equal izer De precation Warning ) Ġlog . warn (" The Ġ' equal izer ' Ġop Ġhas Ġbeen Ġdeprecated Ġin Ġfavour Ġof Ġthe Ġ" Ġ+ ĊĠĠĠĠĠ Ġ"' filters ' Ġop . ĠPlease Ġswitch Ġto Ġuse Ġthat Ġone , Ġas Ġthis Ġop Ġwill Ġget Ġremoved Ġin Ġv 4 .") ĊĊĠĠĠ Ġlogged Equal izer De precation Warning Ġ= Ġtrue ĊĊĠĠĠ Ġval Ġplayer Ġ= Ġcontext . getPlayer ( json . getString (" guild Id ")) ĊĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < Band >() ĊĠĠĠ Ġjson . get JSONArray (" bands "). forEach Ġ{ Ġb Ġ-> ĊĠĠĠĠĠ Ġval Ġband Ġ= Ġb Ġas ĠJSONObject ĊĠĠĠĠĠ Ġlist . add ( Band ( band . getInt (" band "), Ġband . get Float (" gain "))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġfilters Ġ= Ġplayer . filters Ġ?: ĠFilter Chain () ĊĠĠĠ Ġfilters . equal izer Ġ= Ġlist ĊĠĠĠ Ġplayer . filters Ġ= Ġfilters ĊĠ Ġ} ĊĊĠ Ġfun Ġdestroy ( context : ĠSocket Context , Ġjson : ĠJSONObject ) Ġ{ ĊĠĠĠ Ġcontext . destroy ( json . getLong (" guild Id ")) ĊĠ Ġ} ĊĊĠ Ġfun Ġconfigure Res uming ( context : ĠSocket Context , Ġjson : ĠJSONObject ) Ġ{ ĊĠĠĠ Ġcontext . resume Key Ġ= Ġjson . opt String (" key ", Ġnull ) ĊĠĠĠ Ġif Ġ( json . has (" timeout ")) Ġcontext . resume Timeout Ġ= Ġjson . getLong (" timeout ") ĊĠ Ġ} ĊĊĠ Ġfun Ġfilters ( context : ĠSocket Context , Ġguild Id : ĠString , Ġjson : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġplayer Ġ= Ġcontext . getPlayer ( guild Id ) ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġfilters Ġ= ĠFilter Chain . parse ( json ) ĊĠĠĠĠĠ Ġplayer . filters Ġ= Ġfilters ĊĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠ Ġlog . error (" Error Ġwhile Ġparsing Ġfilters .", Ġex ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġp ong ( context : ĠSocket Context , Ġjson : ĠJSONObject ) Ġ{ ĊĠĠĠ Ġval Ġpayload Ġ= ĠJSONObject (). put (" op ", Ġ" p ong ") ĊĊĠĠĠ Ġif Ġ( json . has (" guild Id ")) Ġ{ ĊĠĠĠĠĠ Ġval Ġmedia Connection Ġ= Ġcontext . get Media Connection ( context . getPlayer ( json . getString (" guild Id "))) ĊĊĠĠĠĠĠ Ġpayload . put (" ping ", Ġmedia Connection . gateway Connection ?. ping Ġ?: Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcontext . send ( payload ) ĊĠ Ġ} Ċ } Ċ