@ file : Opt In ( Priv ileged Intent :: class , ĠK ord Preview :: class ) Ċ Ċ package Ġcom . kot l ind is cord . k ord . extensions Ċ Ċ import Ġcom . kot l ind is cord . k ord . extensions . builders . Ext ensible Bot Builder Ċ import Ġcom . kot l ind is cord . k ord . extensions . commands . Message Command Ċ import Ġcom . kot l ind is cord . k ord . extensions . commands . Message Command Registry Ċ import Ġcom . kot l ind is cord . k ord . extensions . commands . parser . Arguments Ċ import Ġcom . kot l ind is cord . k ord . extensions . commands . slash . Slash Command Registry Ċ import Ġcom . kot l ind is cord . k ord . extensions . events . EventHandler Ċ import Ġcom . kot l ind is cord . k ord . extensions . events . Extension Event Ċ import Ġcom . kot l ind is cord . k ord . extensions . extensions . Extension Ċ import Ġcom . kot l ind is cord . k ord . extensions . extensions . impl . Help Extension Ċ import Ġcom . kot l ind is cord . k ord . extensions . extensions . impl . S entry Extension Ċ import Ġcom . kot l ind is cord . k ord . extensions . utils . load Module Ċ import Ġdev . k ord . common . annotation . K ord Preview Ċ import Ġdev . k ord . core . K ord Ċ import Ġdev . k ord . core . behavior . request Members Ċ import Ġdev . k ord . core . event . Event Ċ import Ġdev . k ord . core . event . gateway . Disconnect Event Ċ import Ġdev . k ord . core . event . gateway . Ready Event Ċ import Ġdev . k ord . core . event . guild . Guild Create Event Ċ import Ġdev . k ord . core . event . interaction . Interaction Create Event Ċ import Ġdev . k ord . core . event . message . Message Create Event Ċ import Ġdev . k ord . core . on Ċ import Ġdev . k ord . gateway . Intent s Ċ import Ġdev . k ord . gateway . Priv ileged Intent Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . flow .* Ċ import Ġkotlinx . coroutines . launch Ċ import Ġmu . K Logger Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . k oin . core . component . K oin Component Ċ import Ġorg . k oin . core . component . inject Ċ import Ġorg . k oin . dsl . bind Ċ Ċ /** Ċ Ġ* ĠAn Ġext ensible Ġbot , Ġwrapping Ġa ĠK ord Ġinstance . Ċ Ġ* Ċ Ġ* ĠThis Ġis Ġyour Ġjump ing - off Ġpoint . ĠExt ensible Bot Ġprovides Ġa Ġsystem Ġfor Ġmanaging Ġextensions , Ġcommands Ġand Ġevent Ċ Ġ* Ġhandlers . ĠEither Ġsubclass ĠExt ensible Bot Ġor Ġuse Ġit Ġas - is Ġif Ġit Ġsu its Ġyour Ġneeds . Ċ Ġ* Ċ Ġ* ĠYou Ġshouldn 't Ġconstruct Ġthis Ġclass Ġdirectly Ġ- Ġuse Ġthe Ġbuilder Ġpattern Ġvia Ġthe Ġcompanion Ġobject 's Ġ` invoke ` Ġmethod : Ċ Ġ* Ġ` Ext ensible Bot ( token ) Ġ{ Ġextensions Ġ{ Ġadd (:: My Extension ) Ġ} Ġ} `. Ċ Ġ* Ċ Ġ* Ġ@ param Ġsettings ĠBot Ġbuilder Ġobject Ġcontaining Ġthe Ġbot 's Ġsettings . Ċ Ġ* Ġ@ param Ġtoken ĠToken Ġfor Ġconnecting Ġto ĠDiscord . Ċ Ġ*/ Ċ public Ġopen Ġclass ĠExt ensible Bot ( public Ġval Ġsettings : ĠExt ensible Bot Builder , Ġprivate Ġval Ġtoken : ĠString ) Ġ: ĠK oin Component Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ suppress ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Deprecated ( ĊĠĠĠĠĠĠĠ Ġ" Use ĠK oin Ġto Ġget Ġthis Ġinstead . ĠThis Ġwill Ġbe Ġprivate Ġin Ġfuture .", ĊĊĠĠĠĠĠĠĠ ĠReplace With ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" get K oin (). get < K ord >() ", ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . kot l ind is cord . k ord . extensions . utils . get K oin ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" dev . k ord . core . K ord " ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġlevel Ġ= ĠDeprec ation Level . ERROR ĊĠĠĠ Ġ) ĊĠĠĠ Ġpublic Ġval Ġk ord : ĠK ord Ġby Ġinject () ĊĊĠĠĠ Ġ/** ĠMessage Ġcommand Ġregistry , Ġkeeps Ġtrack Ġof Ġand Ġexecutes Ġmessage Ġcommands . Ġ**/ ĊĠĠĠ Ġ@ Deprecated ( ĊĠĠĠĠĠĠĠ Ġ" Use ĠK oin Ġto Ġget Ġthis Ġinstead . ĠThis Ġwill Ġbe Ġmade Ġprivate Ġin Ġfuture .", ĊĊĠĠĠĠĠĠĠ ĠReplace With ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" get K oin (). get < Message Command Registry >() ", ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . kot l ind is cord . k ord . extensions . utils . get K oin ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . kot l ind is cord . k ord . extensions . commands . Message Command Registry " ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġlevel Ġ= ĠDeprec ation Level . ERROR ĊĠĠĠ Ġ) ĊĠĠĠ Ġpublic Ġopen Ġval Ġmessage Commands : ĠMessage Command Registry Ġby Ġinject () ĊĊĠĠĠ Ġ/** ĠSl ash Ġcommand Ġregistry , Ġkeeps Ġtrack Ġof Ġand Ġexecutes Ġslash Ġcommands . Ġ**/ ĊĠĠĠ Ġ@ Deprecated ( ĊĠĠĠĠĠĠĠ Ġ" Use ĠK oin Ġto Ġget Ġthis Ġinstead . ĠThis Ġwill Ġbe Ġmade Ġprivate Ġin Ġfuture .", ĊĊĠĠĠĠĠĠĠ ĠReplace With ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" get K oin (). get < Slash Command Registry >() ", ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . kot l ind is cord . k ord . extensions . utils . get K oin ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . kot l ind is cord . k ord . extensions . commands . slash . Slash Command Registry " ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġlevel Ġ= ĠDeprec ation Level . ERROR ĊĠĠĠ Ġ) ĊĠĠĠ Ġpublic Ġopen Ġval Ġslash Commands : ĠSl ash Command Registry Ġby Ġinject () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġlist Ġof Ġall Ġregistered Ġevent Ġhandlers . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġopen Ġval Ġevent Handlers : ĠMutable List < EventHandler < out ĠEvent >> Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġmap Ġof Ġthe Ġnames Ġof Ġall Ġloaded Ġ[ Extension ] s Ġto Ġtheir Ġinstances . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġopen Ġval Ġextensions : ĠMutable Map < String , ĠExtension > Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġ/** Ġ@ suppress Ġ**/ ĊĠĠĠ Ġpublic Ġopen Ġval Ġevent Publisher : ĠMutable Shared Flow < Any > Ġ= ĠMutable Shared Flow () ĊĊĠĠĠ Ġ/** ĠA Ġ[ Flow ] Ġrepresenting Ġa Ġcombined Ġset Ġof ĠK ord Ġevents Ġand ĠK ord ĠExtensions Ġevents . Ġ**/ ĊĠĠĠ Ġpublic Ġopen Ġval Ġevents : ĠShared Flow < Any > Ġ= Ġevent Publisher . as Shared Flow () ĊĊĠĠĠ Ġ/** Ġ@ suppress Ġ**/ ĊĠĠĠ Ġpublic Ġopen Ġvar Ġinitialized : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġ/** Ġ@ suppress Ġ**/ ĊĠĠĠ Ġpublic Ġopen Ġval Ġlogger : ĠK Logger Ġ= ĠKotlin Logging . logger Ġ{} ĊĊĠĠĠ Ġ/** Ġ@ suppress ĠFunction Ġthat Ġsets Ġup Ġthe Ġbot Ġearly Ġon , Ġcalled Ġby Ġthe Ġbuilder . Ġ**/ ĊĠĠĠ Ġpublic Ġopen Ġsuspend Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġk ord Ġ= ĠK ord ( token ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsettings . cache Builder . builder . invoke ( this , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Strategy Ġ= Ġsettings . cache Builder . default Strategy ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( settings . int ents Builder Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . int ents Ġ= ĠInt ents ( settings . int ents Builder !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( settings . sharding Builder Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsh arding ( settings . sharding Builder !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġenable Shutdown Hook Ġ= Ġsettings . hooks Builder . k ord Shutdown Hook ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings . k ord Builders . forEach Ġ{ Ġit () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġload Module Ġ{ Ġsingle Ġ{ Ġk ord Ġ} Ġbind ĠK ord :: class Ġ} ĊĊĠĠĠĠĠĠĠ Ġsettings . cache Builder . data Cache Builder . invoke ( k ord , Ġk ord . cache ) ĊĊĠĠĠĠĠĠĠ Ġregister Listeners () ĊĠĠĠĠĠĠĠ Ġadd Default Extensions () ĊĊĠĠĠĠĠĠĠ Ġk ord . on < Event > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġk ord . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( this @ on ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠStart Ġup Ġthe Ġbot Ġand Ġlog Ġinto ĠDiscord . Ġ**/ ĊĠĠĠ Ġpublic Ġopen Ġsuspend Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsettings . hooks Builder . run Before Start ( this ) ĊĊĠĠĠĠĠĠĠ Ġget K oin (). get < K ord >(). login ( settings . presence Builder ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠThis Ġfunction Ġsets Ġup Ġall Ġof Ġthe Ġbot 's Ġdefault Ġevent Ġlisteners . Ġ**/ ĊĠĠĠ Ġpublic Ġopen Ġsuspend Ġfun Ġregister Listeners () Ġ{ ĊĠĠĠĠĠĠĠ Ġon < Guild Create Event > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsettings . members Builder . guild sTo Fill Ġ== Ġnull Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsettings . members Builder . guild sTo Fill !!. contains ( guild . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Request ing Ġmembers Ġfor Ġguild : Ġ${ guild . name }" Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġguild . request Members Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpres ences Ġ= Ġsettings . members Builder . fill Pres ences ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest All Members () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. collect () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġon < Disconnect Event . Discord Close Event > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġ" Disconnected : Ġ$ close Code " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġon < Ready Event > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! initialized ) Ġ{ Ġ Ġ// ĠWe Ġdo Ġthis Ġbecause Ġa Ġreconnect Ġwill Ġcause Ġthis Ġevent Ġto Ġhappen Ġagain . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitialized Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( settings . slash Commands Builder . enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget K oin (). get < Slash Command Registry >(). sync All () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Slash Ġcommand Ġsupport Ġis Ġdisabled Ġ- Ġset Ġ` enabled ` Ġto Ġ` true ` Ġin Ġthe Ġ` slash Commands ` Ġbuilder " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġif Ġyou Ġwant Ġto Ġuse Ġthem ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Ready !" Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( settings . message Commands Builder . enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon < Message Create Event > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget K oin (). get < Message Command Registry >(). handle Event ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( settings . slash Commands Builder . enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon < Interaction Create Event > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget K oin (). get < Slash Command Registry >(). handle ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠThis Ġfunction Ġadds Ġall Ġof Ġthe Ġdefault Ġextensions Ġwhen Ġthe Ġbot Ġis Ġbeing Ġset Ġup . Ġ**/ ĊĠĠĠ Ġpublic Ġopen Ġsuspend Ġfun Ġadd Default Extensions () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġext Builder Ġ= Ġsettings . extensions Builder ĊĠĠĠĠĠĠĠ Ġif Ġ( ext Builder . help Extension Builder . enable Bund led Extension ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . add Extension (:: Help Extension ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ext Builder . sentry Extension Builder . enable Ġ&& Ġext Builder . sentry Extension Builder . feedback Extension ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . add Extension (:: S entry Extension ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSubscribe Ġto Ġan Ġevent . ĠYou Ġshouldn 't Ġneed Ġto Ġuse Ġthis Ġdirectly , Ġbut Ġit 's Ġhere Ġjust Ġin Ġcase . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠYou Ġcan Ġsubscribe Ġto Ġany Ġtype , Ġreal istic ally Ġ- Ġbut Ġthis Ġis Ġintended Ġto Ġbe Ġused Ġonly Ġwith ĠK ord ĊĠĠĠĠ Ġ* Ġ[ Event ] Ġsubclasses , Ġand Ġour Ġown Ġ[ Extension Event ] s . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠT ĠTypes Ġof Ġevent Ġto Ġsubscribe Ġto . ĊĠĠĠĠ Ġ* Ġ@ param Ġscope ĠCor outine Ġscope Ġto Ġrun Ġthe Ġbody Ġof Ġyour Ġcallback Ġunder . ĊĠĠĠĠ Ġ* Ġ@ param Ġconsumer ĠThe Ġcallback Ġto Ġrun Ġwhen Ġthe Ġevent Ġis Ġfired . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġon ( ĊĠĠĠĠĠĠĠ Ġlaunch : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġscope : ĠCor outine Scope Ġ= Ġthis . get K oin (). get < K ord >(), ĊĠĠĠĠĠĠĠ Ġno inline Ġconsumer : Ġsuspend ĠT . () Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠJob Ġ= ĊĠĠĠĠĠĠĠ Ġevents . buffer ( Channel . UN LIMIT ED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < T >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( launch ) Ġscope . launch Ġ{ Ġconsumer ( it ) Ġ} Ġelse Ġconsumer ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ Ġlogger . catch ing ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. catch Ġ{ Ġlogger . catch ing ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. launch In ( scope ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ suppress ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġsuspend Ġinline Ġfun Ġsend ( event : ĠEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Publisher . emit ( event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInstall Ġan Ġ[ Extension ] Ġto Ġthis Ġbot . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġwill Ġcall Ġthe Ġgiven Ġbuilder Ġfunction Ġand Ġstore Ġthe Ġresulting Ġextension Ġobject , Ġready Ġto Ġbe ĊĠĠĠĠ Ġ* Ġset Ġup Ġwhen Ġthe Ġnext Ġ[ Ready Event ] Ġhappens . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġbuilder ĠBuilder Ġfunction Ġ( or Ġextension Ġconstructor ) Ġthat Ġtakes Ġan Ġ[ Ext ensible Bot ] Ġinstance Ġand ĊĠĠĠĠ Ġ* Ġreturns Ġan Ġ[ Extension ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( Invalid Extension Exception :: class ) ĊĠĠĠ Ġpublic Ġopen Ġsuspend Ġfun Ġadd Extension ( builder : Ġ() Ġ-> ĠExtension ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġextension Obj Ġ= Ġbuilder . invoke () ĊĊĠĠĠĠĠĠĠ Ġextensions [ extension Obj . name ] Ġ= Ġextension Obj ĊĠĠĠĠĠĠĠ Ġload Extension ( extension Obj . name ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! extension Obj . loaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġ" Failed Ġto Ġset Ġup Ġextension : Ġ${ extension Obj . name }" Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" Loaded Ġextension : Ġ${ extension Obj . name }" Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings . hooks Builder . run Extension Added ( this , Ġextension Obj ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe load Ġan Ġun loaded Ġ[ Extension ] Ġfrom Ġthis Ġbot , Ġby Ġname . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġ** does Ġnot ** Ġcreate Ġa Ġnew Ġextension Ġobject Ġ- Ġit Ġsimply ĊĠĠĠĠ Ġ* Ġcalls Ġits Ġ` setup ()` Ġfunction . ĠLoaded Ġextensions Ġcan ĊĠĠĠĠ Ġ* Ġbe Ġun load Ġagain Ġby Ġcalling Ġ[ unload Extension ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġsimply Ġreturns Ġif Ġthe Ġextension Ġisn 't Ġfound . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġextension ĠThe Ġname Ġof Ġthe Ġ[ Extension ] Ġto Ġun load . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( Invalid Extension Exception :: class ) ĊĠĠĠ Ġpublic Ġopen Ġsuspend Ġfun Ġload Extension ( extension : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġextension Obj Ġ= Ġextensions [ extension ] Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! extension Obj . loaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextension Obj . do Setup () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFind Ġthe Ġfirst Ġloaded Ġextension Ġthat Ġis Ġan Ġinstance Ġof Ġthe Ġtype Ġprovided Ġin Ġ` T `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġcan Ġbe Ġused Ġto Ġfind Ġan Ġextension Ġbased Ġon , Ġfor Ġexample , Ġan Ġimplemented Ġinterface . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠT ĠTypes Ġto Ġmatch Ġextensions Ġagainst . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġinline Ġfun Ġ< re ified ĠT > Ġfind Extension (): ĠT ? Ġ= ĊĠĠĠĠĠĠĠ Ġfind Extensions < T >(). first OrNull () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFind Ġall Ġloaded Ġextensions Ġthat Ġare Ġinstances Ġof Ġthe Ġtype Ġprovided Ġin Ġ` T `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġcan Ġbe Ġused Ġto Ġfind Ġextensions Ġbased Ġon , Ġfor Ġexample , Ġan Ġimplemented Ġinterface . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠT ĠTypes Ġto Ġmatch Ġextensions Ġagainst . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġinline Ġfun Ġ< re ified ĠT > Ġfind Extensions (): ĠList < T > Ġ= ĊĠĠĠĠĠĠĠ Ġextensions . values . filter Is Instance < T >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUn load Ġan Ġinstalled Ġ[ Extension ] Ġfrom Ġthis Ġbot , Ġby Ġname . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġ** does Ġnot ** Ġremove Ġthe Ġextension Ġobject Ġ- Ġit Ġsimply ĊĠĠĠĠ Ġ* Ġremoves Ġits Ġevent Ġhandlers Ġand Ġcommands . ĠUn loaded Ġextensions Ġcan ĊĠĠĠĠ Ġ* Ġbe Ġloaded Ġagain Ġby Ġcalling Ġ[ load Extension ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġsimply Ġreturns Ġif Ġthe Ġextension Ġisn 't Ġfound . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġextension ĠThe Ġname Ġof Ġthe Ġ[ Extension ] Ġto Ġun load . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġopen Ġsuspend Ġfun Ġun load Extension ( extension : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġextension Obj Ġ= Ġextensions [ extension ] Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif Ġ( extension Obj . loaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextension Obj . do Unload () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDirect ly Ġregister Ġa Ġ[ Message Command ] Ġto Ġthis Ġbot . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠGener ally Ġspeaking , Ġyou Ġshouldn 't Ġcall Ġthis Ġdirectly Ġ- Ġinstead , Ġcreate Ġan Ġ[ Extension ] Ġand ĊĠĠĠĠ Ġ* Ġcall Ġthe Ġ[ Extension . command ] Ġfunction Ġin Ġyour Ġ[ Extension . setup ] Ġfunction . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġwill Ġthrow Ġa Ġ[ Command Registration Exception ] Ġif Ġthe Ġcommand Ġhas Ġalready Ġbeen Ġregistered , Ġif ĊĠĠĠĠ Ġ* Ġa Ġcommand Ġwith Ġthe Ġsame Ġname Ġexists , Ġor Ġif Ġa Ġcommand Ġwith Ġone Ġof Ġthe Ġsame Ġaliases Ġexists . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcommand ĠThe Ġcommand Ġto Ġbe Ġregistered . ĊĠĠĠĠ Ġ* Ġ@ throws ĠCommand Registration Exception ĠThrow n Ġif Ġthe Ġcommand Ġcould Ġnot Ġbe Ġregistered . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Deprecated ( ĊĠĠĠĠĠĠĠ Ġ" Use Ġthe Ġequivalent Ġfunction Ġwithin Ġ` Message Command Registry ` Ġinstead .", ĊĊĠĠĠĠĠĠĠ ĠReplace With ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" get K oin (). get < Message Command Registry >(). add ( command )", ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" org . k oin . core . component . K oin Component . get K oin ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . kot l ind is cord . k ord . extensions . commands . Message Command " ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġlevel Ġ= ĠDeprec ation Level . ERROR ĊĠĠĠ Ġ) ĊĠĠĠ Ġ@ Throws ( Command Registration Exception :: class ) ĊĠĠĠ Ġpublic Ġopen Ġfun Ġadd Command ( command : ĠMessage Command < out ĠArguments >): ĠUnit Ġ= Ġget K oin () ĊĠĠĠĠĠĠĠ Ġ. get < Message Command Registry >() ĊĠĠĠĠĠĠĠ Ġ. add ( command ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDirect ly Ġremove Ġa Ġregistered Ġ[ Message Command ] Ġfrom Ġthis Ġbot . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġis Ġused Ġwhen Ġextensions Ġare Ġun loaded , Ġin Ġorder Ġto Ġclear Ġout Ġtheir Ġcommands . ĊĠĠĠĠ Ġ* ĠNo Ġexception Ġis Ġthrown Ġif Ġthe Ġcommand Ġwasn 't Ġregistered . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcommand ĠThe Ġcommand Ġto Ġbe Ġremoved . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Deprecated ( ĊĠĠĠĠĠĠĠ Ġ" Use Ġthe Ġequivalent Ġfunction Ġwithin Ġ` Message Command Registry ` Ġinstead .", ĊĊĠĠĠĠĠĠĠ ĠReplace With ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" get K oin (). get < Message Command Registry >(). remove ( command )", ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" org . k oin . core . component . K oin Component . get K oin ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . kot l ind is cord . k ord . extensions . commands . Message Command " ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġlevel Ġ= ĠDeprec ation Level . ERROR ĊĠĠĠ Ġ) ĊĠĠĠ Ġpublic Ġopen Ġfun Ġremove Command ( command : ĠMessage Command < out ĠArguments >): ĠBoolean Ġ= Ġget K oin () ĊĠĠĠĠĠĠĠ Ġ. get < Message Command Registry >() ĊĠĠĠĠĠĠĠ Ġ. remove ( command ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDirect ly Ġregister Ġan Ġ[ EventHandler ] Ġto Ġthis Ġbot . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠGener ally Ġspeaking , Ġyou Ġshouldn 't Ġcall Ġthis Ġdirectly Ġ- Ġinstead , Ġcreate Ġan Ġ[ Extension ] Ġand ĊĠĠĠĠ Ġ* Ġcall Ġthe Ġ[ Extension . event ] Ġfunction Ġin Ġyour Ġ[ Extension . setup ] Ġfunction . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġwill Ġthrow Ġan Ġ[ EventHandler Registration Exception ] Ġif Ġthe Ġevent Ġhandler Ġhas Ġalready Ġbeen Ġregistered . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġhandler ĠThe Ġevent Ġhandler Ġto Ġbe Ġregistered . ĊĠĠĠĠ Ġ* Ġ@ throws ĠEventHandler Registration Exception ĠThrow n Ġif Ġthe Ġevent Ġhandler Ġcould Ġnot Ġbe Ġregistered . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( EventHandler Registration Exception :: class ) ĊĠĠĠ Ġpublic Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠEvent > Ġadd EventHandler ( handler : ĠEventHandler < T >): ĠJob Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( event Handlers . contains ( handler )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEventHandler Registration Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Event Ġhandler Ġalready Ġregistered Ġin Ġ'${ handler . extension . name }' Ġextension ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġjob Ġ= Ġon < T > Ġ{ Ġhandler . call ( this ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġevent Handlers . add ( handler ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġjob ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDirect ly Ġremove Ġa Ġregistered Ġ[ EventHandler ] Ġfrom Ġthis Ġbot . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġis Ġused Ġwhen Ġextensions Ġare Ġun loaded , Ġin Ġorder Ġto Ġclear Ġout Ġtheir Ġevent Ġhandlers . ĊĠĠĠĠ Ġ* ĠNo Ġexception Ġis Ġthrown Ġif Ġthe Ġevent Ġhandler Ġwasn 't Ġregistered . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġhandler ĠThe Ġevent Ġhandler Ġto Ġbe Ġremoved . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġopen Ġfun Ġremove EventHandler ( handler : ĠEventHandler < out ĠEvent >): ĠBoolean Ġ= Ġevent Handlers . remove ( handler ) Ċ } Ċ Ċ /** Ċ Ġ* ĠDSL Ġfunction Ġfor Ġcreating Ġa Ġbot Ġinstance . ĠThis Ġis Ġthe ĠK ord ĠExtensions Ġentry point . Ċ Ġ* Ċ Ġ* Ġ` Ext ensible Bot ( token ) Ġ{ Ġextensions Ġ{ Ġadd (:: My Extension ) Ġ} Ġ}` Ċ Ġ*/ Ċ @ Suppress (" Function Naming ") Ġ Ġ// ĠThis Ġis Ġa Ġfactory Ġfunction Ċ public Ġsuspend Ġfun ĠExt ensible Bot ( token : ĠString , Ġbuilder : Ġsuspend ĠExt ensible Bot Builder . () Ġ-> ĠUnit ): ĠExt ensible Bot Ġ{ ĊĠĠĠ Ġval Ġsettings Ġ= ĠExt ensible Bot Builder () ĊĊĠĠĠ Ġbuilder ( settings ) ĊĊĠĠĠ Ġreturn Ġsettings . build ( token ) Ċ } Ċ