package Ġme . dev ox in . flight . api Ċ Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Supervisor Job Ċ import Ġkotlinx . coroutines . flow . Shared Flow Ċ import Ġkotlinx . coroutines . future . await Ċ import Ġkotlinx . coroutines . invoke Ċ import Ġkotlinx . coroutines . launch Ċ import Ġme . dev ox in . flight . annotation . Flight Preview Ċ import Ġme . dev ox in . flight . api . command . message . Message Command Function Ċ import Ġme . dev ox in . flight . api . command . message . Message Context Ċ import Ġme . dev ox in . flight . api . command . message . Message Sub Command Function Ċ import Ġme . dev ox in . flight . api . command . slash . Slash Context Ċ import Ġme . dev ox in . flight . api . command . slash . Slash Sub Command Function Ċ import Ġme . dev ox in . flight . api . command . slash . annotations . Privilege Ċ import Ġme . dev ox in . flight . api . events .* Ċ import Ġme . dev ox in . flight . api . exceptions . Bad Argument Ċ import Ġme . dev ox in . flight . api . exceptions . Parser Not Registered Ċ import Ġme . dev ox in . flight . api . rate limit . RateLimit Ċ import Ġme . dev ox in . flight . internal . arguments . Arg Parser Ċ import Ġme . dev ox in . flight . internal . arguments . Command Argument Ċ import Ġme . dev ox in . flight . internal . entities .* Ċ import Ġnet . dv 8 tion . j da . api . J DA Ċ import Ġnet . dv 8 tion . j da . api . entities . Guild Ċ import Ġnet . dv 8 tion . j da . api . entities . Guild Channel Ċ import Ġnet . dv 8 tion . j da . api . entities . IC ommand Holder Ċ import Ġnet . dv 8 tion . j da . api . entities . Message Ċ import Ġnet . dv 8 tion . j da . api . events . Generic Event Ċ import Ġnet . dv 8 tion . j da . api . events . Ready Event Ċ import Ġnet . dv 8 tion . j da . api . events . interaction . Slash Command Event Ċ import Ġnet . dv 8 tion . j da . api . events . message . Message Received Event Ċ import Ġnet . dv 8 tion . j da . api . hooks . EventListener Ċ import Ġnet . dv 8 tion . j da . api . inter actions . commands . build . Command Data Ċ import Ġnet . dv 8 tion . j da . api . inter actions . commands . build . Option Data Ċ import Ġnet . dv 8 tion . j da . api . inter actions . commands . build . Sub command Data Ċ import Ġnet . dv 8 tion . j da . api . inter actions . commands . build . Sub command GroupData Ċ import Ġnet . dv 8 tion . j da . api . inter actions . commands . priv ileges . Command Privilege Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlin . reflect . K Parameter Ċ Ċ @ Opt In ( Flight Preview :: class ) Ċ class ĠFlight ( val Ġresources : ĠFlight Resources ) Ġ: ĠEvent Listener , ĠCor outine Scope Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAll Ġregistered Ġmessage Ġcommands . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġmessage Commands Ġ= ĠCommand Registry () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAll Ġregistered Ġslash Ġcommands . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġslash Commands Ġ= ĠSl ash Command Registry () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEvents Ġemitted Ġby Ġthis Ġ[ Flight ] Ġinstance . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġevents : ĠShared Flow < Event > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġresources . event Flow ĊĊĠĠĠ Ġoverride Ġval Ġcoroutine Context : ĠCor outine Context ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġresources . dispatcher Ġ+ ĠSuper visor Job () ĊĊĠĠĠ Ġsuspend Ġfun Ġhandle Command ( ctx : ĠMessage Context , Ġcommand Function : ĠMessage Command Function ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* Ġhandle Ġrate - limits Ġpt 1 . Ġ*/ ĊĠĠĠĠĠĠĠ Ġif Ġ( command Function . rate Limit Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentity Id Ġ= ĠRate Limit . getEntity Id ( command Function . rate Limit , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entityId Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resources . rate limits . is RateLimit ed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Function . rate Limit . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Function . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġresources . rate limits . get Expiration Date ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Function . rate Limit . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Function . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġemit ( Command RateLimit ed Event ( ctx , Ġcommand Function , Ġtime , Ġentity Id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġdo Ġsome Ġchecks . Ġ*/ ĊĠĠĠĠĠĠĠ Ġif Ġ( command Function . properties . developer Only Ġ&& Ġ! resources . developers . contains ( ctx . author . id Long )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġemit ( Bad Environment Event ( ctx , Ġcommand Function , ĠBad Environment Event . Reason . Non Developer )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ctx . channel Ġ! is ĠGuild Channel Ġ&& Ġcommand Function . properties . guild Only ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġemit ( Bad Environment Event ( ctx , Ġcommand Function , ĠBad Environment Event . Reason . Non Guild )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ctx . channel Ġis ĠGuild Channel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġcheck Ġfor Ġmissing Ġuser Ġpermissions Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Per ms Ġ= Ġif Ġ( ctx . command Ġis ĠMessage Sub Command Function ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf (* ctx . command . user Permissions , Ġ* command Function . user Permissions ) Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Function . user Permissions ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( user Per ms . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmissing Ġ= Ġuser Per ms . filter Not Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . member !!. has Permission ( ctx . text Channel !! , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( missing . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġemit ( User Missing Permissions Event ( ctx , Ġcommand Function , Ġmissing )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġcheck Ġfor Ġmissing Ġbot Ġpermissions Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbot Per ms Ġ= Ġif Ġ( ctx . command Ġis ĠMessage Sub Command Function ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf (* ctx . command . bot Permissions , Ġ* command Function . bot Permissions ) Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Function . bot Permissions ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bot Per ms . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmissing Ġ= Ġbot Per ms . filter Not Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . guild !!. self Member . has Permission ( ctx . text Channel !! , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( missing . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġemit ( Missing Permissions Event ( ctx , Ġcommand Function , Ġmissing )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠNS FW Ġchannel Ġcheck Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( command Function . properties . ns fw Ġ&& Ġ! ctx . text Channel !!. is NS FW ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġemit ( Bad Environment Event ( ctx , Ġcommand Function , ĠBad Environment Event . Reason . Non NS FW )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġrun Ġin hib itors Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġshould Execute Ġ= Ġresources . in hib itor ( ctx , Ġcommand Function ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġcommand Function . cog . local Check ( ctx , Ġcommand Function ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! should Execute ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġparse Ġarguments Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġarguments : ĠHashMap < K Parameter , ĠAny ?> ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= ĠArg Parser . parse Arguments ( ctx . command , Ġctx , Ġcommand Function . properties . arg Delimiter ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠBad Argument ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġemit ( Bad Argument Event ( ctx , Ġcommand Function , Ġe )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġemit ( Parsing Error Event ( ctx , Ġcommand Function , Ġe )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġhandle Ġrate - limits Ġpt 2 Ġ*/ ĊĠĠĠĠĠĠĠ Ġif Ġ(( command Function . rate Limit Ġ!= Ġnull Ġ&& Ġcommand Function . rate Limit . duration Ġ> Ġ 0 ) Ġ&& Ġ! resources . developers . contains ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . author . id Long ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentity Id Ġ= ĠRate Limit . getEntity Id ( command Function . rate Limit , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entityId Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduration Ġ= Ġcommand Function . rate Limit . duration Unit . to Millis ( command Function . rate Limit . duration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . rate limits . put RateLimit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Function . rate Limit . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Function . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġemit ( Command Inv oked Event ( ctx , Ġcommand Function )) ĊĊĠĠĠĠĠĠĠ Ġ/* Ġexecute Ġthe Ġcommand . Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġexec Ġ= Ġsuspend Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception Ġ= Ġctx . command . execute ( ctx , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. exception OrNull () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exception Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhandled Ġ= Ġcommand Function . cog . on Command Error ( ctx , Ġcommand Function , Ġexception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! handled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( Command Failed Event ( ctx , Ġcommand Function , Ġexception )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( Command Executed Event ( ctx , Ġcommand Function , Ġexception Ġ!= Ġnull )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( resources . do Typing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . typing Async ( exec ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexec () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġhandle Message ( message : ĠMessage ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( resources . ignore Bot s Ġ&& Ġ( message . author . is Bot Ġ|| Ġmessage . is Webhook Message )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġget Ġthe Ġused Ġprefix . Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġprefixes Ġ= Ġresources . prefixes . provide ( message ) ĊĠĠĠĠĠĠĠ Ġval Ġprefix Ġ= Ġprefixes . first OrNull Ġ{ Ġmessage . content Raw . startsWith ( it ) Ġ} Ġ// ĠThis Ġwill Ġbreak Ġfor Ġ" ?", Ġ" ?? ", Ġ" ?? ?" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif Ġ( prefix . length Ġ== Ġmessage . content Raw . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġget Ġthe Ġsupplied Ġarguments . Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġmessage . content Raw . drop ( prefix . length ) ĊĊĠĠĠĠĠĠĠ Ġ/* Ġfind Ġthe Ġcommand Ġtrigger . Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġtrigger Ġ= Ġmessage Commands . values . first NotNull Of OrNull Ġ{ Ġcommand Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtriggers Ġ= ĠlistOf ( command . name , Ġ* command . properties . aliases ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpattern Ġ= Ġ""" (? i )^ (${ triggers . join ToString ("| ") Ġ{ Ġ"\\ Q $ it \\ E " Ġ}}) ($ |\ s . +$ ) """. to Pattern () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpattern . matcher ( content ). take If Ġ{ Ġit . find () Ġ} ?. group ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( trigger Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġcontent . split (" Ġ+ ". to Regex ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġemit ( Unknown Command Event ( message , Ġargs . first (), Ġargs )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġget Ġthe Ġremaining Ġarguments . Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġcontent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. drop ( trigger . length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. trim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. split (" Ġ+ ". to Regex ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Mutable List () ĊĊĠĠĠĠĠĠĠ Ġ/* Ġfind Ġthe Ġroot Ġcommand . Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= Ġmessage Commands [ trigger . lowercase ()] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġmessage Commands . find Command By Alias ( trigger . lowercase ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġemit ( Unknown Command Event ( message , Ġtrigger , Ġargs )) ĊĊĠĠĠĠĠĠĠ Ġ/* Ġfind Ġa Ġsub Ġcommand . Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġsub command Ġ= Ġargs . first OrNull ()?. let Ġ{ Ġcommand . sub commands [ it . lowercase ()] Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( sub command Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs . remove At ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġinvoked Ġ= Ġsub command Ġ?: Ġcommand ĊĊĠĠĠĠĠĠĠ Ġ/* Ġhandle Ġthe Ġcommand . Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġctx Ġ= ĠMessage Context ( this , Ġmessage , Ġprefix , Ġinvoked , Ġprefix , Ġargs ) ĊĠĠĠĠĠĠĠ Ġresources . dispatcher . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Command ( ctx , Ġcommand ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġhandle Slash Command ( interaction : ĠSl ash Command Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbase Command Ġ= Ġslash Commands . find Command ByName ( interaction . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġemit ( Unknown Slash Command Event ( interaction , Ġinteraction . name )) ĊĊĠĠĠĠĠĠĠ Ġvar Ġcommand : ĠICommand . Slash Ġ= Ġbase Command ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinteraction . sub command Group Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Ġ= Ġbase Command . sub Command Groups [ interaction . sub command Group ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġemit ( Unknown Slash Sub Command Group Event ( interaction , Ġinteraction . name )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Ġ= Ġgroup . command Map [ interaction . sub command Name !! ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġemit ( Unknown Slash Sub Command Event ( interaction , Ġinteraction . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinteraction . sub command Name Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Ġ= Ġbase Command . sub Command Map [ interaction . sub command Name !! ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġemit ( Unknown Slash Sub Command Event ( interaction , Ġinteraction . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġctx Ġ= ĠSl ash Context ( interaction , Ġthis , Ġcommand ) ĊĊĠĠĠĠĠĠĠ Ġ/* Ġrun Ġsome Ġchecks . Ġ*/ ĊĠĠĠĠĠĠĠ Ġif Ġ( base Command . properties . developer Only Ġ&& Ġ! resources . developers . contains ( ctx . author . id Long )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġemit ( Bad Environment Event ( ctx , Ġcommand , ĠBad Environment Event . Reason . Non Developer )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ctx . channel Ġ! is ĠGuild Channel Ġ&& Ġbase Command . properties . guild Only ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġemit ( Bad Environment Event ( ctx , Ġcommand , ĠBad Environment Event . Reason . Non Guild )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ctx . channel Ġis ĠGuild Channel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġcheck Ġfor Ġmissing Ġuser Ġpermissions Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Per ms Ġ= Ġif Ġ( ctx . command Ġis ĠSl ash Sub Command Function ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf (* ctx . command . user Permissions , Ġ* base Command . user Permissions ) Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Command . user Permissions ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( user Per ms . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmissing Ġ= Ġuser Per ms . filter Not Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . member !!. has Permission ( ctx . text Channel !! , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( missing . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġemit ( User Missing Permissions Event ( ctx , Ġcommand , Ġmissing )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġcheck Ġfor Ġmissing Ġbot Ġpermissions Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbot Per ms Ġ= Ġif Ġ( ctx . command Ġis ĠSl ash Sub Command Function ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf (* ctx . command . bot Permissions , Ġ* base Command . bot Permissions ) Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Command . bot Permissions ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bot Per ms . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmissing Ġ= Ġbot Per ms . filter Not Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . guild !!. self Member . has Permission ( ctx . text Channel !! , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( missing . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġemit ( Missing Permissions Event ( ctx , Ġcommand , Ġmissing )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠNS FW Ġchannel Ġcheck Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( base Command . properties . ns fw Only Ġ&& Ġ! ctx . text Channel !!. is NS FW ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġemit ( Bad Environment Event ( ctx , Ġcommand , ĠBad Environment Event . Reason . Non NS FW )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġrun Ġin hib itors Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġshould Execute Ġ= Ġresources . in hib itor ( ctx , Ġcommand ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġcommand . cog . local Check ( ctx , Ġcommand ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! should Execute ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġget Ġthe Ġcommand Ġarguments Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġarguments Ġ= Ġmutable Map Of < K Parameter , ĠAny ?> () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( argument Ġin Ġcommand . arguments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoption Ġ= Ġinteraction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getOptions ByName ( argument . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( option Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( argument . isRequired ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBad Argument ( argument , Ġnull , ĠIllegalArgumentException (" Not Ġenough Ġarguments ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments [ argument . k param ] Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠArg Parser . parsers [ argument . type ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠParser Not Registered (" No Ġparsers Ġregistered Ġfor Ġ`${ argument . type }` ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġparser . resolve Option ( ctx , Ġoption ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! value . isPresent Ġ&& Ġ! argument . isRequired ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBad Argument ( argument , Ġoption . asString , ĠIllegalArgumentException (" Not Ġenough Ġarguments ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments [ argument . k param ] Ġ= Ġvalue . orElse ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠBad Argument ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġemit ( Bad Argument Event ( ctx , Ġcommand , Ġe )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġemit ( Parsing Error Event ( ctx , Ġcommand , Ġe )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġexecute Ġthe Ġcommand Ġuw u Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcommand ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute ( ctx , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhandled Ġ= Ġcommand . cog . on Command Error ( ctx , Ġcommand , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! handled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( Command Failed Event ( ctx , Ġcommand , Ġit )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġemit ( Command Executed Event ( ctx , Ġcommand , Ġresult . is Failure )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ+ ---------------- ---+ ĊĠĠĠ Ġ// Ġ| ĠExecution - Related Ġ| ĊĠĠĠ Ġ// Ġ+ ---------------- ---+ ĊĠĠĠ Ġoverride Ġfun Ġon Event ( event : ĠGeneric Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠReady Event Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Ready ( event ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMessage Received Event Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Message ( event . message ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSl ash Command Event Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Slash Command ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( Flight Exception Event ( ex )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Flight Preview ĊĠĠĠ Ġsuspend Ġfun Ġsync Commands For Test Guild s ( j da : ĠJ DA ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtest Guild s Ġ= Ġresources . test Guild s . take Unless Ġ{ Ġit . isEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtest Guild s . any Ġ{ Ġsync Commands ( j da , Ġit , Ġfalse ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Flight Preview ĊĠĠĠ Ġsuspend Ġfun Ġsync Commands ( j da : ĠJ DA , Ġguild Id : ĠLong ? Ġ= Ġnull , Ġfilter : ĠBoolean Ġ= Ġtrue ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcommands Ġ= Ġslash Commands . values . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( filter ) Ġit . properties . guild Id . take Unless Ġ{ Ġid Ġ-> Ġid Ġ== Ġ- 1 L Ġ} Ġ== Ġguild Id Ġelse Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġcommand Holder : ĠICommand Holder Ġ= Ġj da ĊĠĠĠĠĠĠĠ Ġif Ġ( guild Id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġguild Ġ= Ġj da . get Guild ById ( guild Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( guild Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" ($ guild Id ) ĠCould n 't Ġsync Ġcommands Ġdue Ġto Ġit Ġnot Ġexisting Ġin Ġcache .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" ($ guild Id ) ĠSync ing Ġcommands Ġfor Ġguild : Ġ${ guild . name }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Holder Ġ= Ġguild ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġget Ġthe Ġcurrent Ġcommands Ġfor Ġthis Ġguild . Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Commands Ġ= Ġcommand Holder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. retrieve Commands () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. submit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. await () ĊĊĠĠĠĠĠĠĠ Ġ/* Ġfind Ġthe Ġcommands Ġthat Ġneed Ġto Ġbe Ġupdated , Ġdeleted , Ġor Ġcreated . Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġcreating Ġ= Ġcommands . filter Ġ{ Ġcurrent Commands . none Ġ{ Ġc Ġ-> Ġc . name Ġ== Ġit . name Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdeleting Ġ= Ġcurrent Commands . filter Not Ġ{ Ġcommands . any Ġ{ Ġc Ġ-> Ġc . name Ġ== Ġit . name Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġupdating Ġ= Ġcommands . filter Ġ{ Ġcurrent Commands . any Ġ{ Ġc Ġ-> Ġc . name Ġ== Ġit . name Ġ} Ġ} ĊĊĠĠĠĠĠĠĠ Ġlog . debug ("${ " Global Ġcommands ". take If Ġ{ Ġguild Id Ġ== Ġnull Ġ} Ġ?: Ġ" ($ guild Id ) "} Ġbeing Ġcreated =${ creating . size }; Ġdeleted =${ de leting . size }; Ġupdated =${ updating . size }") ĊĊĠĠĠĠĠĠĠ Ġ/* Ġcreating Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġadding Ġ= Ġmutable ListOf (* creating . to Typed Array (), Ġ* updating . to Typed Array ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġcommand Holder . update Commands () ĊĠĠĠĠĠĠĠ Ġfor Ġ( command Ġin Ġadding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠCommand Data ( command . name , Ġresources . description Provider . provide ( command , Ġcommand . properties . description )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . sub Commands . isNotEmpty () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Commands Ġ= Ġcommand . sub Commands . map Ġ{ Ġconvert Slash Sub Command To Sub command Data ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . add Sub commands ( sub Commands ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . sub Command Groups . isNotEmpty () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroups Ġ= Ġcommand . sub Command Groups . map Ġ{ Ġ( name , Ġgroup ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Data Ġ= ĠSub command GroupData ( name , Ġgroup . description ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Commands Ġ= Ġgroup . commands . map Ġ{ Ġconvert Slash Sub Command To Sub command Data ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Data . add Sub commands ( sub Commands ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . add Sub command Groups ( groups ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= Ġcommand . arguments . map Ġ{ Ġconvert Argument To Option Data ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . add Options ( options ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction . add Commands ( data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġupdate Ġthe Ġreferences Ġto Ġeach Ġcommand . Ġ*/ ĊĠĠĠĠĠĠĠ Ġaction . submit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġc Ġ-> Ġadding . find Ġ{ Ġit . name Ġ== Ġc . name Ġ} ?. ref Ġ= Ġc Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġupdate Ġthe Ġprivileges Ġfor Ġeach Ġcommand . Ġ*/ ĊĠĠĠĠĠĠĠ Ġif Ġ( command Holder Ġis ĠGuild ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprivileges Ġ= Ġadding ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . properties . priv ileges . isEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. associate Ġ{ Ġit . ref !!. id Ġto Ġit . properties . priv ileges . map (:: convert Privilege To Command Privilege ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( priv ileges . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Holder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. update Command Privileges ( priv ileges ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. submit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Flight Preview ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġconvert Slash Sub Command To Sub command Data ( sub Command : ĠSl ash Sub Command Function ): ĠSub command Data Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠSub command Data ( sub Command . name , Ġresources . description Provider . provide ( sub Command , Ġsub Command . properties . description )) ĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= Ġsub Command . arguments . map Ġ{ Ġconvert Argument To Option Data ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġdata . add Options ( options ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdata ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Flight Preview ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġconvert Argument To Option Data ( argument : ĠCommand Argument ): ĠOption Data Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġargument . resolver ?. getOption ( argument ) !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Flight Preview ĊĠĠĠ Ġprivate Ġfun Ġconvert Privilege To Command Privilege ( privilege : ĠPriv ilege ): ĠCommand Privilege Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCommand Privilege ( privilege . type , Ġprivilege . enabled , Ġprivilege . id ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġon Ready ( event : ĠReady Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( resources . developers . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . j da . retrieve Application Info (). queue Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . developers . add ( it . owner . id Long ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġemit ( event : ĠEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerr Ġ= Ġevent . run Catch ing Ġ{ Ġresources . event Flow . emit ( this ) Ġ}. exception OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresources . event Flow . emit ( Flight Exception Event ( err )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" An Ġun caught Ġerror Ġoccurred Ġwhile Ġevent Ġdispatch !", Ġex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Flight :: class . java ) ĊĠĠĠ Ġ} Ċ } Ċ