package Ġdiscord . kt . commands Ċ Ċ import Ġdev . k ord . common . entity . Permission Ċ import Ġdiscord . kt . Bot Ċ import Ġdiscord . kt . annotations . Install Commands Ċ import Ġdiscord . kt . utils . Init Once Ċ Ċ // TODO Ġre - organ ize Ġcode Ġhere Ċ abstract Ġclass ĠCommand ( private Ġval Ġparent : ĠCommand ? Ġ= Ġnull ) Ġ: ĠCommand Container Ġ{ ĊĠĠĠ Ġ// ĠThe Ġname Ġof Ġthis Ġcommand ĊĠĠĠ Ġabstract Ġval Ġname : ĠString ĊĊĠĠĠ Ġ// ĠThe Ġaliases Ġthat Ġcan Ġinvoke Ġthis Ġcommand ĊĠĠĠ Ġopen Ġval Ġaliases : ĠList < String > Ġ= ĠlistOf () ĊĊĠĠĠ Ġ// ĠChecks Ġthat Ġrun Ġwhen Ġthis Ġcommand Ġis Ġinvoked , ĊĠĠĠ Ġ// Ġcommand Ġwill Ġonly Ġrun Ġif Ġall Ġof Ġthem Ġreturn Ġtrue ĊĠĠĠ Ġ// ĠThis Ġis Ġalso Ġcalled Ġwhen Ġsub commands Ġare Ġinvoked ĊĠĠĠ Ġopen Ġval Ġchecks : ĠArrayList < suspend Ġ( Context ) Ġ-> ĠBoolean > Ġ= Ġarray ListOf () ĊĊĠĠĠ Ġ// ĠAdd Ġpermissions Ġrequired Ġfor Ġthis Ġcommand , ĊĠĠĠ Ġ// Ġsh orthand Ġfor Ġadding Ġall Ġof Ġthem Ġto Ġchecks () ĊĠĠĠ Ġopen Ġval Ġrequired Permissions : ĠArrayList < Permission > Ġ= Ġarray ListOf () ĊĊĠĠĠ Ġ// ĠBoolean Ġindicating Ġif Ġthis Ġcommand Ġcan Ġbe Ġtriggered Ġcase - ins ensit ively ĊĠĠĠ Ġopen Ġval Ġcase Ins ensitive : ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġprivate Ġval Ġ_ sub Commands : ĠArrayList < Command > Ġ= Ġarray ListOf () ĊĊĠĠĠ Ġ// ĠOptional Ġlist Ġof Ġsub commands Ġthat Ġthis Ġcommand Ġhas ĊĠĠĠ Ġval Ġsub Commands : ĠList < Command > Ġ= Ġthis ._ sub Commands ĊĊĠĠĠ Ġ// ĠFunction Ġusage Ġin Ġthe Ġhelp Ġcommand ĊĠĠĠ Ġopen Ġvar Ġhelp Usage : ĠString Ġ= Ġ"" ĊĊĠĠĠ Ġ// ĠCommand Ġdescription Ġin Ġthe Ġhelp Ġcommand ĊĠĠĠ Ġopen Ġvar Ġhelp Description : ĠString Ġ= Ġ"" ĊĊĠĠĠ Ġ// ĠFunction Ġthat Ġruns Ġbefore Ġthe Ġinvocation Ġof Ġa Ġsub command ĊĠĠĠ Ġopen Ġfun Ġrun Before Sub command ( context : ĠContext ) Ġ{} ĊĊĠĠĠ Ġ// ĠFunction Ġthat Ġruns Ġafter Ġthe Ġinvocation Ġof Ġa Ġsub command ĊĠĠĠ Ġopen Ġfun Ġrun After Sub command ( context : ĠContext ) Ġ{} ĊĊĠĠĠ Ġ// ĠFunction Ġthat Ġchecks Ġif Ġthis Ġcommand Ġshould Ġbe Ġvisible ĊĠĠĠ Ġ// Ġin Ġthe Ġhelp Ġpage Ġin Ġthe Ġgiven Ġcontext ĊĠĠĠ Ġ// ĠFor Ġexample : Ġhiding Ġthings Ġlike Ġmod Ġcommands Ġfrom Ġnormal Ġusers ĊĠĠĠ Ġ// Ġor Ġonly Ġshowing Ġdev Ġcommands Ġin Ġthe Ġdeveloper Ġserver ĊĠĠĠ Ġopen Ġfun Ġvisible In Help ( context : ĠContext ): ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġ// ĠProcess Ġthe Ġarguments Ġgiven Ġby Ġthe Ġuser Ġthat Ġinvoked Ġthe Ġcommand ĊĠĠĠ Ġabstract Ġsuspend Ġfun Ġprocess ( context : ĠContext ) ĊĊĠĠĠ Ġ// ĠReference Ġto Ġthe Ġbot ĊĠĠĠ Ġprivate Ġval Ġ_ init Bot Once Ġ= ĠInit Once < Bot >(" bot ") ĊĠĠĠ Ġval Ġbot : ĠBot Ġby Ġ_ init Bot Once ĊĊĠĠĠ Ġval Ġdepth : ĠInt Ġ= Ġif Ġ( parent Ġ== Ġnull ) Ġ 0 Ġelse Ġparent . depth Ġ+ Ġ 1 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġuses Ġproperties Ġthat Ġhave Ġnot Ġyet Ġbeen Ġinitialized Ġin Ġthe Ġinit () ĊĠĠĠĠ Ġ* ĠHAS Ġto Ġbe Ġcalled Ġby Ġa Ġsubclass ĊĠĠĠĠ Ġ*/ Ċ // ĠĠĠ ĠTODO Ġcheck Ġthat Ġthis Ġonly Ġruns Ġonce Ċ // ĠĠĠ ĠTODO Ġcheck Ġthat Ġthis Ġwas Ġcalled Ġ( in ĠBOT ) ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġchecks Ġfor Ġthe Ġrequired Ġpermissions ĊĠĠĠĠĠĠĠ Ġif Ġ( this . required Permissions . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . checks . add ( has Permissions (* this . required Permissions . to Typed Array ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . process Annotations () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Annotations () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis :: class . java . annotations . forEach Ġforeach @{ Ġannotation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( annotation Ġis ĠInstall Commands ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . process Command Annotation ( annotation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Command Annotation ( annotation : ĠInstall Commands ) Ġ{ ĊĠĠĠĠĠĠĠ Ġannotation . commands . forEach Ġ{ Ġcommand Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa ĠCommand Ġfrom Ġthe ĠK Class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= Ġcommand . construct ors . first (). call ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġany Ġnames Ġcl ash ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . sub Commands . forEach Ġ{ Ġsub Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sub . has Over lapping Names ( instance )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Command Ġ\" ${ this . name }\" Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" already Ġhas Ġa Ġsub command Ġ\" ${ sub . name }\" Ġwhose Ġname Ġor Ġaliases Ġcl ash Ġwith Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" sub command Ġ\" ${ instance . name }\" .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAll Ġchecks Ġpassed Ġ-> Ġadd Ġthe Ġsub command Ġin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ._ sub Commands . add ( instance ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Over lapping Names ( other Name : ĠString , Ġother Aliases : ĠList < String >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Lower Ġ= Ġthis . name . toLowerCase () ĊĠĠĠĠĠĠĠ Ġval Ġaliases Lower Ġ= Ġthis . aliases . map Ġ{ Ġit . toLowerCase () Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġother Name Lower Ġ= Ġother Name . toLowerCase () ĊĠĠĠĠĠĠĠ Ġval Ġother Aliases Lower Ġ= Ġother Aliases . map Ġ{ Ġit . toLowerCase () Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠNames Ġare Ġthe Ġsame ĊĠĠĠĠĠĠĠ Ġif Ġ( name Lower Ġ== Ġother Name Lower ) Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ// ĠOther Ġcommand 's Ġname Ġis Ġan Ġalias Ġfor Ġthis Ġcommand ĊĠĠĠĠĠĠĠ Ġif Ġ( aliases Lower . contains ( other Name Lower )) Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġcommand 's Ġname Ġis Ġan Ġalias Ġfor Ġthe Ġother Ġcommand ĊĠĠĠĠĠĠĠ Ġif Ġ( other Aliases Lower . contains ( name Lower )) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġone Ġof Ġthe Ġaliases Ġoverlap s ĊĠĠĠĠĠĠĠ Ġreturn Ġaliases Lower . any { other Aliases Lower . contains ( it )} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Over lapping Names ( other : ĠCommand ): ĠBoolean Ġ= Ġthis . has Over lapping Names ( other . name , Ġother . aliases ) ĊĊĠĠĠ Ġ// ĠCheck Ġif Ġan Ġargument Ġcan Ġtrigger Ġthis Ġcommand ĊĠĠĠ Ġfun Ġtriggered By ( arg : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . name . equals ( arg , Ġthis . case Ins ensitive )) Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġif Ġ( this . case Ins ensitive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . aliases . map Ġ{ Ġit . toLowerCase () Ġ}. contains ( arg . toLowerCase ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis . aliases . contains ( arg ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCalled Ġwhen Ġthe Ġcommand Ġis Ġadded Ġto Ġthe Ġbot ĊĠĠĠ Ġfun Ġinstalled ( bot : ĠBot ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis ._ init Bot Once . initWith ( bot ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġall Ġparents Ġof Ġthis Ġcommand ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetParent Chain (): ĠList < Command > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġarray ListOf < Command >() ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Ġ= Ġthis . parent ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( current Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl . add ( current ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġcurrent . parent ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġl . toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCheck Ġif Ġall Ġchecks Ġ+ Ġparent Ġchecks Ġfor Ġthis Ġcommand Ġpass ĊĠĠĠ Ġsuspend Ġfun Ġcan Run ( context : ĠContext ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠParent Ġchecks ĊĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! parent . can Run ( context )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠOwn Ġchecks ĊĠĠĠĠĠĠĠ Ġif Ġ( this . checks . any Ġ{ Ġc Ġ-> Ġ! c ( context ) Ġ}) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// ĠNothing Ġfailed Ġ-> Ġeverything Ġis Ġokay ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġget Child WithName ( name : ĠString , Ġ Ġmatch Ent ire : ĠBoolean ): ĠCommand ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġpath Ġof Ġall Ġthe Ġsteps Ġtowards Ġthe Ġpossible Ġsub command ĊĠĠĠĠĠĠĠ Ġ// ĠRemove Ġempty Ġentries Ġ& Ġextra Ġwhitespace Ġon Ġeither Ġside ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġname . split (" Ġ"). map Ġ{ Ġit . trim () Ġ}. filter Ġ{ Ġit . isNotEmpty () Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis . getChild WithName ( path , Ġ 0 , Ġmatch Ent ire ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġget Child WithName ( path : ĠList < String >, Ġindex : ĠInt , Ġmatch Ent ire : ĠBoolean ): ĠCommand ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRe ached Ġend Ġof Ġlist , Ġno Ġmatch Ġfound ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġpath . size ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// ĠNext Ġitem Ġin Ġthe Ġpath Ġdoes Ġnot Ġtrigger Ġthis Ġone ĊĠĠĠĠĠĠĠ Ġ// Ġ-> Ġstop Ġlooking ĊĠĠĠĠĠĠĠ Ġif Ġ(! this . triggered By ( path [ index ])) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// ĠRe ached Ġend Ġof Ġpath Ġ& Ġthis Ġcommand Ġis Ġa Ġmatch ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġpath . size Ġ- Ġ 1 ) Ġreturn Ġthis ĊĊĠĠĠĠĠĠĠ Ġ// ĠContinue Ġthrough Ġwith Ġall Ġsub commands ĊĠĠĠĠĠĠĠ Ġthis . sub Commands . forEach Ġ{ Ġsub Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatched Ġ= Ġsub . getChild WithName ( path , Ġindex Ġ+ Ġ 1 , Ġmatch Ent ire ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFound Ġa Ġmatch Ġ-> Ġreturn Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matched Ġ!= Ġnull ) Ġreturn Ġsub ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠNo Ġsub command Ġwas Ġmatched ĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġthis Ġcommand Ġcan Ġbe Ġthe Ġmatch ĊĊĠĠĠĠĠĠĠ Ġ// ĠNot Ġreached Ġthe Ġend Ġyet , Ġso Ġthe Ġnext Ġitems Ġin Ġthe Ġpath Ġcould Ġbe Ġarguments ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġpath . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġarguments Ġare Ġallowed Ġin Ġthe Ġsearch , Ġthen Ġthis Ġcommand Ġmatches ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! match Ent ire ) Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} Ċ }