/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 ĠMel ms ĠMedia ĠLLC Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġgg . octave . bot . db Ċ Ċ import Ġcom . re think db . Re think DB Ċ import Ġcom . re think db . Re think DB . r Ċ import Ġcom . re think db . ast . Re ql Ast Ċ import Ġcom . re think db . gen . exc . Re ql Driver Error Ċ import Ġcom . re think db . net . Connection Ċ import Ġcom . re think db . net . Cursor Ċ import Ġgg . octave . bot . Launcher Ċ import Ġgg . octave . bot . db . guild s . Guild Data Ċ import Ġgg . octave . bot . db . guild s . UserData Ċ import Ġgg . octave . bot . db . music . Custom Playlist Ċ import Ġgg . octave . bot . db . premium . Prem ium Guild Ċ import Ġgg . octave . bot . db . premium . Prem ium User Ċ import Ġorg . redis son . Redis son Ċ import Ġorg . redis son . api . Redis son Client Ċ import Ġorg . redis son . config . Config Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġredis . clients . j edis . J edis Pool Ċ import Ġredis . clients . j edis . J edis Pool Config Ċ import Ġredis . clients . j edis . Protocol Ċ import Ġkotlin . system . exit Process Ċ Ċ class ĠDatabase ( private Ġval Ġname : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġconn : ĠConnection ĊĠĠĠ Ġval Ġjed is Pool : ĠJ edis Pool ĊĠĠĠ Ġval Ġredis son : ĠRedis son Client ĊĊĠĠĠ Ġval ĠisOpen : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġconn . isOpen ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcreds Ġ= ĠLaunch er . credentials ĊĠĠĠĠĠĠĠ Ġval Ġre think User Ġ= Ġcreds . re think Username ĊĠĠĠĠĠĠĠ Ġval Ġre think Auth Ġ= Ġcreds . re think Auth ĊĊĠĠĠĠĠĠĠ Ġ// ĠInit ĠRe think ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġr . connection () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. hostname ( creds . re think Host ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. port ( creds . re think Port ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. user ( re think User , Ġre think Auth ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconn Ġ= Ġbuilder . connect () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠRe ql Driver Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Failed Ġto Ġconnect Ġto ĠRe think . ĠExit ing ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! r . db List (). run < List < String >>( conn ). contains ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr . db Create ( name ). run < Any >( conn ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlog . info (" Connected Ġto ĠRe think .") ĊĠĠĠĠĠĠĠ Ġconn . use ( name ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠInit ĠRedis ĊĠĠĠĠĠĠĠ Ġval Ġredis Host Ġ= Ġcreds . redis Host ĊĠĠĠĠĠĠĠ Ġval Ġredis Port Ġ= Ġcreds . redis Port ĊĠĠĠĠĠĠĠ Ġval Ġredis Auth Ġ= Ġcreds . redis Auth ĊĊĠĠĠĠĠĠĠ Ġval Ġredis Config Ġ= ĠConfig () ĊĠĠĠĠĠĠĠ Ġval Ġs sc Ġ= Ġredis Config . use Single Server () ĊĠĠĠĠĠĠĠ Ġs sc . address Ġ= Ġ" redis :// $ redis Host :$ redis Port " ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! redis Auth . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjed is Pool Ġ= ĠJ edis Pool ( J edis Pool Config (), Ġredis Host , Ġredis Port , ĠProtocol . DEFAULT _ TIMEOUT , Ġredis Auth ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs sc . password Ġ= Ġredis Auth ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjed is Pool Ġ= ĠJ edis Pool ( J edis Pool Config (), Ġredis Host , Ġredis Port , Ġ 5 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġredis son Ġ= ĠRedis son . create ( redis Config ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Guild Data ( id : ĠString ) Ġ= Ġget (" guild s _ v 2 ", Ġid , ĠGuild Data :: class . java ) ĊĠĠĠ Ġfun Ġget Prem ium Key ( id : ĠString ) Ġ= Ġget (" keys ", Ġid , ĠPremium Key :: class . java ) ĊĠĠĠ Ġfun Ġget UserData ( id : ĠString ) Ġ= Ġget (" users ", Ġid , ĠUser Data :: class . java ) ĊĠĠĠ Ġfun Ġget Pat re on Entry ( id : ĠString ) Ġ= Ġget (" pat re on ", Ġid , ĠPat re on Entry :: class . java ) ĊĠĠĠ Ġfun Ġhas Prem ium User ( id : ĠString ) Ġ= ĠisOpen Ġ&& Ġr . table (" premium users ")[ id ]. coerce To (" bool "). run ( conn ) ĊĊĠĠĠ Ġfun Ġget Prem ium User ( id : ĠString ): ĠPremium User Ġ= Ġquery ( Prem ium User :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtable (" premium users ")[ id ]. default _( r . hash Map (" id ", Ġid ). with (" p ledge Amount ", Ġ" 0 . 0 ")) ĊĠĠĠ Ġ} !! ĊĊĠĠĠ Ġfun Ġget Prem ium Users () Ġ= Ġquery < Cursor < Prem ium User >, ĠPremium User >( Prem ium User :: class . java ) Ġ{ Ġtable (" premium users ") Ġ} ?. toList () ĊĠĠĠĠĠĠĠ Ġ?: Ġempty List () ĊĊĠĠĠ Ġfun Ġget Prem ium Guild ( id : ĠString ) Ġ= Ġget (" premium guild s ", Ġid , ĠPremium Guild :: class . java ) ĊĠĠĠ Ġfun Ġget Prem ium Guild s ( re deem er : ĠString ) Ġ= Ġquery < Cursor < Prem ium Guild >, ĠPremium Guild >( Prem ium Guild :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtable (" premium guild s "). filter Ġ{ Ġit . g (" re deem er "). eq ( re deem er ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Custom Playlist ById ( id : ĠString ) Ġ= Ġget (" cust omp lay lists ", Ġid , ĠCustom Playlist :: class . java ) ĊĠĠĠ Ġfun Ġget Custom Playlist ( author Id : ĠString , Ġtitle : ĠString ) Ġ= Ġquery < Cursor < Custom Playlist >, ĠCustom Playlist >( Custom Playlist :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtable (" cust omp lay lists "). filter Ġ{ Ġit . g (" author "). eq ( author Id ). and ( it . g (" name "). eq ( title )) Ġ} ĊĠĠĠ Ġ} ?. toList ()?. first OrNull () ĊĊĠĠĠ Ġfun Ġget Custom Play lists ( author Id : ĠString ) Ġ= Ġquery < Cursor < Custom Playlist >, ĠCustom Playlist >( Custom Playlist :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtable (" cust omp lay lists "). filter Ġ{ Ġit . g (" author "). eq ( author Id ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Custom Play lists As List ( author Id : ĠString ) Ġ= Ġget Custom Play lists ( author Id )?. toList () Ġ?: Ġempty List () ĊĠĠĠ Ġfun Ġfind Custom Playlist ( author Id : ĠString , Ġfuzzy Title : ĠString ): ĠCustom Playlist ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlower ed Title Ġ= Ġfuzzy Title . toLowerCase () ĊĠĠĠĠĠĠĠ Ġreturn Ġget Custom Play lists As List ( author Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġit . name Ġ== Ġfuzzy Title Ġ|| Ġit . name . toLowerCase (). contains ( lower ed Title ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclose () Ġ= Ġconn . close () ĊĊĠĠĠ Ġoperator Ġfun Ġ< T > Ġget ( table : ĠString , Ġid : ĠString , Ġcls : ĠClass < T >): ĠT ? Ġ= Ġif Ġ( isOpen ) Ġr . table ( table )[ id ]. run ( conn , Ġcls ) Ġelse Ġnull ĊĠĠĠ Ġfun Ġ< T , ĠP > Ġquery ( cls : ĠClass < P >, Ġq : ĠRe think DB . () Ġ-> ĠRe ql Ast ): ĠT ? Ġ= Ġif Ġ(! isOpen ) Ġnull Ġelse Ġr . q (). run < T , ĠP >( conn , Ġcls ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( this :: class . java ) ĊĠĠĠ Ġ} Ċ } Ċ