/* Ċ * Copyright Ġ 2 0 2 0 ĠK yle ĠD ah lin Ċ * Ċ * Licensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ * you Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ * You Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ * Ċ * ĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ * Ċ * Unless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ * distributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ * WITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ * See Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ * limitations Ġunder Ġthe ĠLicense . Ċ */ Ċ package Ġcom . k yle da h lin . rule bot Ċ Ċ import Ġarrow . core . Either Ċ import Ġcom . k yle da h lin . rule bot . bot . Logger Ċ import Ġcom . k yle da h lin . rule bot . bot . Logger . log Debug Ċ import Ġcom . k yle da h lin . rule bot . bot . Rule Ċ import Ġcom . k yle da h lin . rule bot . bot . Rule Bot Scope Ċ import Ġdiscord 4 j . core . Discord Client Ċ import Ġdiscord 4 j . core . event . domain . Voice State Update Event Ċ import Ġdiscord 4 j . core . event . domain . guild . Guild Create Event Ċ import Ġdiscord 4 j . core . event . domain . interaction . Button Interaction Event Ċ import Ġdiscord 4 j . core . event . domain . interaction . Chat Input Interaction Event Ċ import Ġdiscord 4 j . core . event . domain . interaction . User Interaction Event Ċ import Ġdiscord 4 j . core . event . domain . message . Message Create Event Ċ import Ġjavax . inject . Inject Ċ Ċ @ Rule Bot Scope Ċ internal Ġclass ĠRule Manager Ġ@ Inject Ġconstructor () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġ_ rules Ġ= Ġmutable Set Of < Rule >() ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġclient : ĠDiscord Client ĊĊĠĠĠ Ġfun Ġadd Rules ( rules : ĠCollection < Rule >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ rules . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd All ( rules ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsorted By Ġ{ Ġit . priority . ordinal Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Context ( client : ĠDiscord Client ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . client Ġ= Ġclient ĊĠĠĠĠĠĠĠ Ġ_ rules . forEach Ġ{ Ġit . set Context ( client ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġconfigure Rule ( rule Name : ĠString , Ġdata : ĠAny ): ĠEither < Any , ĠAny >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ rules . first OrNull Ġ{ Ġit . rule Name . equals ( rule Name , Ġignore Case Ġ= Ġtrue ) Ġ} ?. configure ( data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġprocess Message Create Event ( message Event : ĠMessage Create Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// log Debug Ġ{ Ġ" processing Ġevent Ġfor Ġ${ _ rules . size } Ġrules " Ġ} ĊĠĠĠĠĠĠĠ Ġ// log Debug Ġ{ Ġ" got Ġmessage Ġevent Ġ$ message Event " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġprocess Guild Create Event ( event : ĠGuild Create Event ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLogger . log Info Ġ{ Ġ" processing Ġjoin Ġfor Ġguild Ġ${ event . guild . name }" Ġ} ĊĠĠĠĠĠĠĠ Ġ_ rules . forEach Ġ{ Ġit . on Guild Create ( Guild Create Context Impl ( client , Ġevent )) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġprocess Slash Command ( event : ĠChat Input Interaction Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog Debug Ġ{ Ġ" checking Ġfor Ġchat Ġevent Ġ${ event . command Name }" Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrule Ġ= Ġ_ rules ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġit . handles Command ( event . command Name ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( rule Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Debug Ġ{ Ġ" got Ġslash Ġcommand Ġfor Ġ${ event . command Name } Ġbut Ġno Ġmatching Ġrule Ġwas Ġfound " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrule ?. on Slash Command ( Chat Input Interaction Context Impl ( event )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġprocess User Interaction ( event : ĠUser Interaction Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog Debug Ġ{ Ġ" checking Ġfor Ġuser Ġevent Ġ${ event . command Name }" Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrule Ġ= Ġ_ rules ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġit . handles Command ( event . command Name ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( rule Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Debug Ġ{ Ġ" got Ġuser Ġevent Ġfor Ġ${ event . command Name } Ġbut Ġno Ġmatching Ġrule Ġwas Ġfound " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrule ?. on User Command ( User Interaction Context Impl ( event )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġprocess Button Event ( event : ĠButton Interaction Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog Debug Ġ{ Ġ" checking Ġfor Ġbutton Ġevent Ġ${ event . custom Id }" Ġ} ĊĠĠĠĠĠĠĠ Ġ_ rules . forEach Ġ{ Ġit . on Button Event ( Button Interaction Event Context Impl ( event )) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġprocess Voice Update Event ( event : ĠVoice State Update Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog Debug Ġ{ Ġ" dispatch ing Ġvoice Ġupdate Ġstate Ġevent " Ġ} ĊĠĠĠĠĠĠĠ Ġ_ rules . forEach Ġ{ Ġit . on Voice Update ( event ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġsuspend Ġfun Ġget Rule Names (): ĠSet < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ rules . map Ġ{ Ġit . rule Name Ġ}. toSet () ĊĠĠĠ Ġ} Ċ } ĊĊ