package Ġmo e . nik ky Ċ Ċ import Ġcom . kot l ind is cord . k ord . extensions . utils . env OrNull Ċ import Ġcom . squareup . sql de light . Column Adapter Ċ import Ġcom . squareup . sql de light . db . Sql Driver Ċ import Ġcom . squareup . sql de light . sqlite . driver . Jdbc Sqlite Driver Ċ import Ġdev . k ord . common . entity . Snow flake Ċ import Ġdev . k ord . core . behavior . Guild Behavior Ċ import Ġdev . k ord . core . behavior . getChannel Of OrNull Ċ import Ġdev . k ord . core . entity . Guild Ċ import Ġdev . k ord . core . entity . Message Ċ import Ġdev . k ord . core . entity . Reaction Emoji Ċ import Ġdev . k ord . core . entity . Role Ċ import Ġdev . k ord . core . entity . channel . News Channel Ċ import Ġdev . k ord . core . entity . channel . Text Channel Ċ import Ġdev . k ord . core . entity . channel . Top Guild Message Channel Ċ import Ġdev . k ord . core . first OrNull Ċ import Ġdev . k ord . rest . request . K tor RequestException Ċ import Ġio . k logging . context . Log Context Ċ import Ġio . k logging . context . log Context Ċ import Ġio . k logging . logger Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġmo e . nik ky . db .* Ċ import Ġmu . with Logging Context Ċ import Ġjava . io . File Ċ import Ġjava . sql . SQLException Ċ Ċ private Ġval Ġlogger Ġ= Ġlogger (" moe . nik ky . Config Extensions ") Ċ Ċ fun ĠDiscord bot Database . Companion . load (): ĠDiscord bot Database Ġ= Ġrun Blocking Ġ{ ĊĠĠĠ Ġval Ġconfig Folder Ġ= ĠFile ( env OrNull (" CONFIG _ DIR ") Ġ?: Ġ" data ") ĊĠĠĠ Ġval Ġconfig File Ġ= Ġconfig Folder . resolve (" config . db ") ĊĠĠĠ Ġval Ġdriver : ĠSql Driver Ġ= ĠJdbc Sqlite Driver (" jdbc : sqlite :${ configFile . path . replace ('\\ ',' /') }") ĊĊĠĠĠ Ġval Ġsnow Fl ake Adapter Ġ= Ġobject Ġ: ĠColumn Adapter < Snow flake , ĠLong > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdecode ( database Value : ĠLong ) Ġ= ĠSnow flake ( database Value . to UL ong ()) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġencode ( value : ĠSnow flake ) Ġ= Ġvalue . value . to Long () ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġdatabase Ġ= ĠDiscord bot Database ( ĊĠĠĠĠĠĠĠ Ġdriver Ġ= Ġdriver , ĊĠĠĠĠĠĠĠ Ġguild Config Adapter Ġ= ĠGuild Config . Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġguild Id Adapter Ġ= Ġsnow Fl ake Adapter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadmin Role Adapter Ġ= Ġsnow Fl ake Adapter , ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġrole Chooser Config Adapter Ġ= ĠRole Chooser Config . Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġguild Id Adapter Ġ= Ġsnow Fl ake Adapter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel Adapter Ġ= Ġsnow Fl ake Adapter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Adapter Ġ= Ġsnow Fl ake Adapter ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġrole Chooser Mapping Adapter Ġ= ĠRole Chooser Mapping . Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrole Adapter Ġ= Ġsnow Fl ake Adapter ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġtw itch Config Adapter Ġ= ĠTw itch Config . Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġguild Id Adapter Ġ= Ġsnow Fl ake Adapter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel Adapter Ġ= Ġsnow Fl ake Adapter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrole Adapter Ġ= Ġsnow Fl ake Adapter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Adapter Ġ= Ġsnow Fl ake Adapter , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġold Version : ĠInt Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġdatabase . schema Version Queries . getSchema Version (). execute As One (). version ?. toInt () !! ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠSQLException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠ 0 ĊĠĠĠ Ġ} ĊĠĠĠ Ġlogger . info F Ġ{ Ġ" database Ġis Ġat Ġversion : Ġ$ old Version " Ġ} ĊĊĠĠĠ Ġif Ġ( old Version Ġ< ĠDiscord bot Database . Schema . version ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info F Ġ{ Ġ" updating Ġ$ old Version Ġ-> Ġ${ Discord bot Database . Schema . version }" Ġ} ĊĠĠĠĠĠĠĠ ĠDiscord bot Database . Schema . migrate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdriver Ġ= Ġdriver , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Version Ġ= Ġold Version , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Version Ġ= ĠDiscord bot Database . Schema . version , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info F Ġ{ Ġ" schema Ġup Ġto Ġdate " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdatabase Ċ } Ċ Ċ fun ĠDiscord bot Database . get Tw itch Configs ( guild : ĠGuild ): ĠList < Tw itch Config > Ġ{ ĊĠĠĠ Ġreturn Ġtw itch Config Queries . getAll ( guild . id ). execute As List () Ċ } Ċ Ċ suspend Ġfun ĠDiscord bot Database . get Role Mapping ( guild Behavior : ĠGuild Behavior , Ġrole Chooser : ĠRole Chooser Config ): ĠMap < Reaction Emoji , ĠRole > Ġ{ ĊĠĠĠ Ġval Ġrole Mapping Ġ= Ġrole Mapping Queries . getAll ( role Chooser . role Chooser Id ). execute As List (). associate Ġ{ Ġrole Chooser Mapping Ġ-> ĊĠĠĠĠĠĠĠ Ġrole Chooser Mapping . reaction Ġto Ġrole Chooser Mapping . role ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġrole Mapping . entries . associate Ġ{ Ġ( reaction Emoji Name , Ġrole ) Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġreaction Emoji Ġ= Ġguild Behavior . emo jis . first OrNull Ġ{ Ġit . mention Ġ== Ġreaction Emoji Name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĠRe action Emoji . from ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠRe action Emoji . Unicode ( reaction Emoji Name ) ĊĠĠĠĠĠĠĠ Ġreaction Emoji Ġto Ġguild Behavior . get Role ( role ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun ĠGuild Config . admin Role ( guild Behavior : ĠGuild Behavior ): ĠRole ? Ġ{ ĊĠĠĠ Ġreturn Ġadmin Role ?. let Ġ{ Ġguild Behavior . get Role OrNull ( it ) Ġ} Ċ } Ċ Ċ val ĠTw itch Config . twitch Url : ĠString Ġget () Ġ= Ġ" https :// twitch . tv /$ twitch UserName " Ċ Ċ suspend Ġfun ĠTw itch Config . role ( guild Behavior : ĠGuild Behavior ): ĠRole Ġ{ ĊĠĠĠ Ġreturn Ġguild Behavior . get Role OrNull ( role ) Ġ?: Ġrelay Error (" role Ġ$ role Ġcould Ġnot Ġbe Ġloaded ") Ċ } Ċ Ċ suspend Ġfun ĠTw itch Config . channel ( guild Behavior : ĠGuild ): ĠTop Guild Message Channel Ġ{ ĊĠĠĠ Ġreturn Ġwith Context ( ĊĠĠĠĠĠĠĠ Ġlog Context (" guild " Ġto Ġguild Behavior . name ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġguild Behavior . getChannel Of OrNull < Text Channel >( channel ) ĊĠĠĠĠĠĠĠ Ġ?: Ġguild Behavior . getChannel Of OrNull < News Channel >( channel ) ĊĠĠĠĠĠĠĠ Ġ?: Ġrelay Error (" channel Ġ$ channel Ġin Ġ'${ guild Behavior . name }' Ġcould Ġnot Ġbe Ġloaded Ġas ĠText Channel ") ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ suspend Ġfun ĠRole Chooser Config . channel ( guild Behavior : ĠGuild ): ĠText Channel Ġ{ ĊĠĠĠ Ġreturn Ġwith Context ( ĊĠĠĠĠĠĠĠ Ġlog Context (" guild " Ġto Ġguild Behavior . name ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġguild Behavior . getChannel Of OrNull < Text Channel >( channel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġrelay Error (" channel Ġ$ channel Ġin Ġ'${ guild Behavior . name }' Ġcould Ġnot Ġbe Ġloaded Ġas ĠText Channel ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun ĠRole Chooser Config . getMessage Or Relay Error ( guild Behavior : ĠGuild ): ĠMessage ? Ġ= Ġtry Ġ{ ĊĠĠĠ Ġchannel ( guild Behavior ). getMessage OrNull ( message ) Ċ } Ġcatch Ġ( e : ĠK tor RequestException ) Ġ{ ĊĠĠĠ Ġlogger . error F Ġ{ Ġe . message Ġ} ĊĠĠĠ Ġrelay Error (" cannot Ġaccess Ġmessage Ġ$ message ") Ċ }