package Ġca . all an wang . discord . bot . base Ċ Ċ import Ġca . all an wang . discord . bot . core . Bot Feature Ċ import Ġcom . google . common . f logger . Fluent Logger Ċ import Ġdagger . Module Ċ import Ġdagger . Provides Ċ import Ġdagger . mult ib ind ings . Into Set Ċ import Ġdev . k ord . core . K ord Ċ import Ġdev . k ord . core . event . message . Message Create Event Ċ import Ġkotlinx . coroutines . Coroutine ExceptionHandler Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . util .* Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Singleton Ċ Ċ abstract Ġclass ĠCommand Bot ( ĊĠĠĠ Ġhandlers : ĠSet < @ Jvm Suppress W ild cards ĠCommand Handler Bot >, ĊĠĠĠ Ġprivate Ġval Ġtype : ĠCommand Handler . Type Ċ ) Ġ: ĠBot Feature Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠFluent Logger . for En closing Class () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġhandlers Ġ= Ġhandlers . with Type ( type ) ĊĊĠĠĠ Ġdata Ġclass ĠPrefix ed Message ( val Ġprefix : ĠString , Ġval Ġmessage : ĠString ) ĊĊĠĠĠ Ġabstract Ġsuspend Ġfun ĠMessage Create Event . prefix ed Message (): ĠPrefix ed Message ? ĊĊĠĠĠ Ġfinal Ġoverride Ġsuspend Ġfun ĠK ord . attach () Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . at Info (). log (" Loaded Ġ$ type Ġhandlers Ġ% s ", Ġhandlers . map NotNull Ġ{ Ġit :: class . simple Name Ġ}. sorted ()) ĊĠĠĠĠĠĠĠ Ġval Ġcandidates Ġ= Ġhandlers . on Each Ġ{ Ġwith ( it ) Ġ{ Ġattach () Ġ} Ġ}. candidates () ĊĠĠĠĠĠĠĠ Ġval Ġduplicate Keys Ġ= Ġhandlers . duplicate Keys () ĊĠĠĠĠĠĠĠ Ġif Ġ( duplicate Keys . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . at Warning (). log (" Duplicate Ġcommands Ġfound : Ġ% s ", Ġduplicate Keys ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Message Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Commands ( candidates ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun ĠMessage Create Event . handle Commands ( candidates : ĠMap < String , ĠCommand Handler >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprefixed Message Ġ= Ġprefixed Message () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġprefixed Message . message . substring Before (' Ġ') ĊĠĠĠĠĠĠĠ Ġval Ġsub Message Ġ= Ġif Ġ( key Ġ== Ġprefixed Message . message ) Ġ"" Ġelse Ġprefixed Message . message . substring After (' Ġ') ĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= Ġcandidates [ key . toLowerCase ( Locale . US )] Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġk ord . launch ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine ExceptionHandler Ġ{ Ġ_, Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . at Warning (). with Cause ( throwable ). log (" Failure Ġfor Ġ% s ", Ġhandler :: class . simple Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . handle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Handler Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Ġ= Ġthis @ handle Commands , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefix Ġ= Ġprefixed Message . prefix , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Ġ= Ġkey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġsub Message , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorig Message Ġ= Ġmessage . content , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Help Ġ= Ġhandler ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠPrefix Ġfeature Ġbot . Ċ Ġ* Ċ Ġ* ĠThis Ġbot Ġis Ġin Ġcharge Ġof Ġall Ġ[ CommandHandler Bot ] s Ġwith Ġ[ CommandHandler . Type . Prefix ]. Ċ Ġ* Ċ Ġ* ĠEach Ġmessage Ġis Ġchecked Ġagainst Ġthe Ġprefix , Ġbefore Ġbeing Ġfed Ġto Ġthe Ġhandler Ġwith Ġa Ġmatching Ġkey Ġ( first Ġword ) Ċ Ġ*/ Ċ @ Singleton Ċ class ĠBot Prefix Group Feature Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġprefix Supplier : ĠBot Prefix Supplier , ĊĠĠĠ Ġhandlers : ĠSet < @ Jvm Suppress W ild cards ĠCommand Handler Bot > Ċ ) Ġ: ĠCommand Bot ( handlers Ġ= Ġhandlers , Ġtype Ġ= ĠCommand Handler . Type . Prefix ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠFluent Logger . for En closing Class () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun ĠMessage Create Event . prefix ed Message (): ĠPrefix ed Message ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprefix Ġ= Ġprefix Supplier . prefix ( group Snow flake ()) ĊĠĠĠĠĠĠĠ Ġif Ġ(! message . content . startsWith ( prefix )) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġlogger . at F ine (). log (" Prefix Ġmatched ") ĊĠĠĠĠĠĠĠ Ġreturn ĠPrefix ed Message ( prefix Ġ= Ġprefix , Ġmessage Ġ= Ġmessage . content . substring After ( prefix )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Singleton Ċ class ĠBot Mention Group Feature Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġhandlers : ĠSet < @ Jvm Suppress W ild cards ĠCommand Handler Bot >, ĊĠĠĠ Ġk ord : ĠK ord Ċ ) Ġ: ĠCommand Bot ( handlers Ġ= Ġhandlers , Ġtype Ġ= ĠCommand Handler . Type . Mention ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠFluent Logger . for En closing Class () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDiscord Ġids Ġare Ġsent Ġvia Ġtext Ġvia Ġ`< @{ id }> `. ĊĠĠĠĠ Ġ* ĠIf Ġthere Ġis Ġa Ġnickname , Ġan Ġadditional Ġ` !` Ġwill Ġfollow Ġ`@ ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġmention Regex Ġ= ĠRegex ("^ (< @ ! ? ${ k ord . self Id . asString }> ) Ġ( .* )$ ") ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun ĠMessage Create Event . prefix ed Message (): ĠPrefix ed Message ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatch Ġ= Ġmention Regex . find ( message . content ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġlogger . at F ine (). log (" Bot Ġmention Ġmatched ") ĊĠĠĠĠĠĠĠ Ġval Ġprefix Ġ= Ġmatch . group Values [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġmatch . group Values [ 2 ]. take If Ġ{ Ġit . isNotBlank () Ġ} Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn ĠPrefix ed Message ( prefix Ġ= Ġprefix , Ġmessage Ġ= Ġmessage ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Module ( includes Ġ= Ġ[ Bot Prefix Module :: class ]) Ċ object ĠCommand Bot Module Ġ{ ĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ Into Set ĊĠĠĠ Ġ@ Singleton ĊĠĠĠ Ġfun Ġprefix Bot ( bot : ĠBot Prefix Group Feature ): ĠBot Feature Ġ= Ġbot ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ Into Set ĊĠĠĠ Ġ@ Singleton ĊĠĠĠ Ġfun Ġprefix Command Bot ( bot : ĠBot Prefix Group Feature ): ĠCommand Bot Ġ= Ġbot ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ Into Set ĊĠĠĠ Ġ@ Singleton ĊĠĠĠ Ġfun Ġmention Bot ( bot : ĠBot Mention Group Feature ): ĠBot Feature Ġ= Ġbot ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ Into Set ĊĠĠĠ Ġ@ Singleton ĊĠĠĠ Ġfun Ġmention Command Bot ( bot : ĠBot Mention Group Feature ): ĠCommand Bot Ġ= Ġbot Ċ } Ċ