package Ġorg . yt tr . kon cord a Ċ Ċ import Ġcom . types afe . config . Config Ċ import Ġcom . types afe . config . Config Factory Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Supervisor Job Ċ import Ġkotlinx . coroutines . launch Ċ import Ġnet . dv 8 tion . j da . api . J DA Builder Ċ import Ġnet . dv 8 tion . j da . api . events . Event Ċ import Ġnet . dv 8 tion . j da . api . events . Ready Event Ċ import Ġnet . dv 8 tion . j da . api . events . message . Message Received Event Ċ import Ġnet . dv 8 tion . j da . api . hooks . EventListener Ċ import Ġnet . dv 8 tion . j da . api . requests . Gateway Intent Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . yt tr . kon cord a . command . Command Ċ Ċ /** Ċ Ġ* ĠThe ĠDiscord Ġbot Ġapplication , Ġwith Ġuseful ĠDSL s Ġfor Ġsetting Ġup Ġdifferent Ġfeatures . Ċ Ġ*/ Ċ class ĠKon cord a Ġ{ ĊĠĠĠ Ġval Ġlogger : ĠLogger Ġ= ĠLoggerFactory . getLogger ( this :: class . simple Name ) ĊĠĠĠ Ġprivate Ġval Ġdiscord Token Ġ= Ġconf . getString (" kon cord a . discord - token ") ĊĠĠĠ Ġinternal Ġval Ġbase Commands Ġ= Ġmutable ListOf < Command . Branch >() ĊĠĠĠ Ġinternal Ġval Ġevent Listeners Ġ= Ġmutable ListOf < EventListener >() ĊĊĠĠĠ Ġprivate Ġval Ġjob Ġ= ĠSuper visor Job () ĊĠĠĠ Ġinternal Ġval Ġscope Ġ= ĠCor outine Scope ( Dispatch ers . Default Ġ+ Ġjob ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExplicit ly Ġlisted Ġgate ways Ġintent s , Ġdefaults Ġto ĠJ DA Ġdefaults ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġgateway Intent s Ġ= ĠGateway Intent . get Intent s ( Gateway Intent . DEFAULT ). toList () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComplete Ġthe ĠJ DA Ġbuilder Ġand Ġstart Ġthe Ġbot ĊĠĠĠĠ Ġ* Ġ@ param Ġlow Memory ĠWhether Ġor Ġnot Ġto Ġuse ĠJ DA 's Ġlow Ġmemory Ġprofile ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstart ( low Memory : ĠBoolean Ġ= Ġfalse ) Ġ= Ġif Ġ( low Memory ) Ġ{ ĊĠĠĠĠĠĠĠ ĠJ DA Builder . create Light ( discord Token ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠJ DA Builder . create Default ( discord Token ) ĊĠĠĠ Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Listeners . forEach Ġ{ Ġadd Event Listeners ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġset Enabled Intent s ( gateway Intent s ) ĊĠĠĠ Ġ}. build () ĊĊĠĠĠ Ġinternal Ġinline Ġfun Ġ< re ified ĠE Ġ: ĠEvent > Ġadd EventListener ( cross inline Ġaction : Ġsuspend Ġ( E ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠEvent Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠE Ġ&& Ġ!( it Ġis ĠMessage Received Event Ġ&& Ġit . is Ign orable )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch Ġ{ Ġaction ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġevent Listeners . add ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġadd EventListener < Message Received Event > Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsplit Ġthe Ġargs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġevent . message . content Stri pped . trim (). split (" Ġ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfind Ġthe Ġcommand Ġhandler , Ġif Ġit Ġexists ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġbase Command Ġ= Ġall Base Commands ()[ args . first ()]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommand . Leaf Ġ-> Ġbase Command ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommand . Branch Ġ-> Ġbase Command [ args . drop ( 1 )] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Ġ= Ġit . create Call ( event , Ġargs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . check ( call )) Ġit . handle ( call ) Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . channel . sendMessage (" You Ġare Ġnot Ġallowed Ġto Ġuse Ġthat Ġcommand . "). queue () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġall Base Commands (): ĠMap < String , ĠCommand > Ġ= Ġbase Commands ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . routes Ġ} ĊĠĠĠĠĠĠĠ Ġ. fold ( empty Map ()) Ġ{ Ġacc , Ġbase Route Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġacc Ġ+ Ġbase Route ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠMessage Received Event . is Ign orable ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġauthor . is Bot Ġ|| Ġis Webhook Message ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAccess Ġto Ġconfiguration Ġdefined Ġin Ġapplication . conf ĠHO CON ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġconf : ĠConfig Ġ= ĠConfig Factory . load () ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCommands ĠDSL , Ġan Ġeasy Ġway Ġof Ġregistering Ġcommand Ġhandlers Ġand Ġthe Ġpath Ġto Ġthem Ġwith ĠKon cord a . Ċ Ġ*/ Ċ fun ĠKon cord a . commands ( ĊĠĠĠ Ġprefix : ĠString Ġ= ĠKon cord a . conf . getString (" kon cord a . command - prefix "), ĊĠĠĠ Ġbuild : ĠCommand . Branch . () Ġ-> ĠUnit Ċ ) Ġ= Ġbase Commands . add ( Command . Branch ( prefix Ġ= Ġprefix ). apply ( build )) Ċ Ċ /** Ċ Ġ* ĠFunction Ġto Ġrun Ġwhen Ġthe Ġbot Ġent ers Ġthe Ġready Ġstate Ġafter Ġbeing Ġstarted . Ċ Ġ*/ Ċ fun ĠKon cord a . on Ready ( action : Ġsuspend Ġ( Ready Event ) Ġ-> ĠUnit ) Ġ= Ġadd EventListener ( action ) Ċ Ċ /** Ċ Ġ* ĠThe Ġsimplest Ġway Ġto Ġstart Ġbuilding Ġa Ġbot Ġwith ĠKon cord a . ĠMake Ġsure Ġto Ġadd Ġ. start () Ġto Ġthe Ġend ! Ċ Ġ*/ Ċ inline Ġfun Ġkon cord a ( init : ĠKon cord a . () Ġ-> ĠUnit ) Ġ= ĠKon cord a (). apply ( init ) Ċ