package Ġb og us . extension . music . command Ċ Ċ import Ġb og us . checks . limit Ċ import Ġb og us . constants . AUTO COMPLETE _ ITEMS _ LIMIT Ċ import Ġb og us . extension . music .* Ċ import Ġb og us . extension . music . checks . has DJ Role Ċ import Ġb og us . extension . music . checks . in Voice Channel Ċ import Ġb og us . util . LR U Cache Ċ import Ġcom . kot l ind is cord . k ord . extensions . checks . any Guild Ċ import Ġcom . kot l ind is cord . k ord . extensions . commands . Arguments Ċ import Ġcom . kot l ind is cord . k ord . extensions . commands . application . slash . Ep hemeral Slash Command Ċ import Ġcom . kot l ind is cord . k ord . extensions . commands . application . slash . ep hemeral Sub Command Ċ import Ġcom . kot l ind is cord . k ord . extensions . commands . converters . impl . string Ċ import Ġcom . kot l ind is cord . k ord . extensions . extensions . ep hemeral Slash Command Ċ import Ġcom . kot l ind is cord . k ord . extensions . i 1 8 n . Translations Provider Ċ import Ġcom . kot l ind is cord . k ord . extensions . k oin . K ord Ex K oin Component Ċ import Ġcom . kot l ind is cord . k ord . extensions . types . respond Ċ import Ġdev . k ord . core . behavior . interaction . suggest String Ċ import Ġorg . k oin . core . component . inject Ċ import Ġkotlin . time . Duration . Companion . minutes Ċ Ċ suspend Ġfun ĠMusic Extension . play () Ġ{ ĊĠĠĠ Ġep hemeral Slash Command Ġ{ ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" play " ĊĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" play . description " ĊĊĠĠĠĠĠĠĠ Ġlater () ĊĠĠĠĠĠĠĠ Ġnext () ĊĠĠĠĠĠĠĠ Ġnow () ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġsuspend Ġfun ĠEp hemeral Slash Command <* >. later () Ġ{ ĊĠĠĠ Ġep hemeral Sub Command (:: Play Args ) Ġ{ ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" later " ĊĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" play . later . description " ĊĠĠĠĠĠĠĠ Ġcheck Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġany Guild () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas DJ Role () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Voice Channel () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġguild Ġ= Ġguild Ġ?: Ġreturn @ action ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠJ uke box . play Later ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ uke box . Play Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrespond Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrespond Ġ{ Ġcontent Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrespond Multiple Ġ= Ġ{ Ġchoices , Ġselect Ġ-> Ġrespond Choices ( choices , Ġselect ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Result Ġ= ĠIdentifier Parser . to Identifiers ( arguments . query ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġguild Ġ= Ġguild , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmention Ġ= Ġuser . mention , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġuser . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocale Ġ= Ġget Locale () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrespond Ġ{ Ġcontent Ġ= Ġresponse Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġsuspend Ġfun ĠEp hemeral Slash Command <* >. next () Ġ{ ĊĠĠĠ Ġep hemeral Sub Command (:: Play Args ) Ġ{ ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" next " ĊĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" play . next . description " ĊĠĠĠĠĠĠĠ Ġcheck Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġany Guild () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas DJ Role () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Voice Channel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlimit ( PLAY _ NEXT _ LIMIT , Ġ 5 . minutes ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġguild Ġ= Ġguild Ġ?: Ġreturn @ action ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠJ uke box . play Next ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ uke box . Play Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrespond Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrespond Ġ{ Ġcontent Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrespond Multiple Ġ= Ġ{ Ġchoices , Ġselect Ġ-> Ġrespond Choices ( choices , Ġselect ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Result Ġ= ĠIdentifier Parser . to Identifiers ( arguments . query ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġguild Ġ= Ġguild , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmention Ġ= Ġuser . mention , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġuser . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocale Ġ= Ġget Locale () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrespond Ġ{ Ġcontent Ġ= Ġresponse Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġsuspend Ġfun ĠEp hemeral Slash Command <* >. now () Ġ{ ĊĠĠĠ Ġep hemeral Sub Command (:: Play Args ) Ġ{ ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" now " ĊĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" play . now . description " ĊĠĠĠĠĠĠĠ Ġcheck Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġany Guild () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas DJ Role () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Voice Channel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlimit ( PLAY _ NOW _ LIMIT , Ġ 5 . minutes ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġguild Ġ= Ġguild Ġ?: Ġreturn @ action ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠJ uke box . play Now ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ uke box . Play Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrespond Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrespond Ġ{ Ġcontent Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrespond Multiple Ġ= Ġ{ Ġchoices , Ġselect Ġ-> Ġrespond Choices ( choices , Ġselect ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Result Ġ= ĠIdentifier Parser . to Identifiers ( arguments . query ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġguild Ġ= Ġguild , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmention Ġ= Ġuser . mention , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġuser . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocale Ġ= Ġget Locale () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrespond Ġ{ Ġcontent Ġ= Ġresponse Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠPlay Args Ġ: ĠK ord Ex K oin Component , ĠArguments () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcache Ġ= ĠL RU Cache < String , ĠList < String >>( 5 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtp Ġby Ġinject < Translations Provider >() ĊĠĠĠ Ġval Ġquery Ġby Ġstring Ġ{ ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" query " ĊĠĠĠĠĠĠĠ Ġdescription Ġ= Ġtp . translate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġ" play . args . query . description ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbundle Name Ġ= ĠTRAN SL ATION _ B UNDLE ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġauto Complete Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġfocused Option . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile List Ġ= ĠIdentifier Parser . list Files () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuggest String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile List . take ( AUTO COMPLETE _ ITEMS _ LIMIT ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchoice ( it , Ġ" local :$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuggest String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Result Ġ= Ġfile List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . startsWith ( input , Ġignore Case Ġ= Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Result . take ( AUTO COMPLETE _ ITEMS _ LIMIT ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchoice ( it , Ġ" local :$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Result . size Ġ< ĠAUTO COMPLETE _ ITEMS _ LIMIT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġcache ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcache Lookup Ġ= Ġcache [ input ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= Ġ( AUTO COMPLETE _ ITEMS _ LIMIT Ġ- Ġfile Result . size ). coerce At Least ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cache Lookup Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache Lookup . take ( delta ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchoice ( it , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġyoutube Result Ġ= ĠY T . query ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyoutube Result . take ( delta ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġcache [ input ] Ġ= Ġthis Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchoice ( it , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }