package Ġnet . d ank r ush en . td h bot . commands Ċ Ċ import Ġcom . j ag ro sh . j da utilities . command . Command Ċ import Ġcom . j ag ro sh . j da utilities . command . Command Event Ċ import Ġnet . d ank r ush en . td h bot . Bot Utils Ċ import Ġnet . d ank r ush en . td h bot . TD H Bot Ċ Ċ abstract Ġclass ĠBase Command ( val Ġt dh Bot : ĠT DH Bot ) Ġ: ĠCommand () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġerror Number Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcommands Ġ= Ġmutable Map Of < Int , Ġ( Command Event , ĠArray < String >) Ġ-> ĠUnit >() ĊĊĠĠĠ Ġoverride Ġfun Ġexecute ( cmd Event : ĠCommand Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcmd Event . message . add Reaction ( Bot Utils . processing Emoji ). complete () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= ĠCommand Utils . string To Args ( cmd Event . args ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= Ġget Command ( args . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( command Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand ( cmd Event , Ġargs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmd Event . reply Error (" Incorrect Ġnumber Ġof Ġarguments .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Number Ġ= Ġ++ error Number ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Error Ġ#$ error Number ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcmd Event . react Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcmd Event . reply Error (" Check Ġlogs Ġfor Ġerror Ġ#$ error Number \ n ``` \ n ${ e . message }\ n ``` ") ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Utils . remove Reaction ( cmd Event , ĠBot Utils . processing Emoji ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Command ( num Args : ĠInt Ġ= Ġ 0 ): Ġ(( Command Event , ĠArray < String >) Ġ-> ĠUnit )? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠClose st Ġas Ġin Ġclosest Ġbelow Ġnum Args ĊĠĠĠĠĠĠĠ Ġvar Ġclosest Entry : ĠMap . Entry < Int , Ġ( Command Event , ĠArray < String >) Ġ-> ĠUnit >? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġcommands ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġnumber Ġof Ġarguments Ġmatches Ġexactly , Ġreturn Ġthis Ġimmediately ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . key Ġ== Ġnum Args ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġentry . value ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor Ġentries Ġwith Ġthe Ġsame Ġor Ġless Ġarguments , Ġfind Ġthe Ġmaximum Ġargument Ġcommand ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . key Ġ<= Ġnum Args Ġ&& Ġ( closest Entry Ġ== Ġnull Ġ|| Ġentry . key Ġ> Ġclosest Entry . key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclosest Entry Ġ= Ġentry ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġclosest Entry ?. value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Command ( num Args : ĠInt Ġ= Ġ 0 , Ġbody : Ġ( Command Event , ĠArray < String >) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( num Args Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" num Args Ġmust Ġnot Ġbe Ġless Ġthan Ġ 0 ") ĊĊĠĠĠĠĠĠĠ Ġcommands [ num Args ] Ġ= Ġbody ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Command ( num Args : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcommands . remove ( num Args ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove All Commands () Ġ{ ĊĠĠĠĠĠĠĠ Ġcommands . clear () ĊĠĠĠ Ġ} Ċ }