/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠMichael ĠJohn ston Ċ Ġ* Ċ Ġ* Ġ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 . github . mr bean 3 5 5 . ad mir al bull dog . persistence Ċ Ċ import Ġcom . github . mr bean 3 5 5 . ad mir al bull dog . arch . D ota Mod Ċ import Ġcom . github . mr bean 3 5 5 . ad mir al bull dog . assets . Combo Sound B ite Ċ import Ġcom . github . mr bean 3 5 5 . ad mir al bull dog . assets . Sound B ite Ċ import Ġcom . github . mr bean 3 5 5 . ad mir al bull dog . assets . Sound B ites Ċ import Ġcom . github . mr bean 3 5 5 . ad mir al bull dog . common . DEFAULT _ BOUN TY _ RUN E _ TIMER Ċ import Ġcom . github . mr bean 3 5 5 . ad mir al bull dog . common . DEFAULT _ CH ANCE Ċ import Ġcom . github . mr bean 3 5 5 . ad mir al bull dog . common . DEFAULT _ MAX _ PERIOD Ċ import Ġcom . github . mr bean 3 5 5 . ad mir al bull dog . common . DEFAULT _ MIN _ PERIOD Ċ import Ġcom . github . mr bean 3 5 5 . ad mir al bull dog . common . DEFAULT _ RATE Ċ import Ġcom . github . mr bean 3 5 5 . ad mir al bull dog . common . DEFAULT _ VOLUME Ċ import Ġcom . github . mr bean 3 5 5 . ad mir al bull dog . common . MAX _ VOLUME Ċ import Ġcom . github . mr bean 3 5 5 . ad mir al bull dog . common . MIN _ VOLUME Ċ import Ġcom . github . mr bean 3 5 5 . ad mir al bull dog . persistence . migration . Config Migration Ċ import Ġcom . github . mr bean 3 5 5 . ad mir al bull dog . settings . Update Frequency Ċ import Ġcom . github . mr bean 3 5 5 . ad mir al bull dog . triggers . SOUND _ TRIGGER _ TYPES Ċ import Ġcom . github . mr bean 3 5 5 . ad mir al bull dog . triggers . Sound Trigger Type Ċ import Ġcom . google . gson . Gson Builder Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . File Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ /** ĠVersion Ġof Ġthe Ġconfig Ġfile Ġthat Ġthis Ġapp Ġsupports . Ġ*/ Ċ const Ġval ĠCONFIG _ VERSION Ġ= Ġ 3 Ċ Ċ private Ġconst Ġval ĠFILE _ NAME Ġ= Ġ" config . json " Ċ private Ġconst Ġval ĠDEFAULT _ PORT Ġ= Ġ 1 2 3 4 5 Ċ Ċ /** Ċ Ġ* ĠFac ilit ates Ġsaving Ġ& Ġloading Ġthe Ġconfiguration Ġof Ġthe Ġsound Ġbit es Ġfrom Ġa Ġfile . Ċ Ġ* ĠSound Ġbit es : Ċ Ġ* Ġ- Ġhave Ġa Ġlist Ġof Ġpossible Ġsounds Ġto Ġplay , Ġconfigurable Ġby Ġthe Ġuser Ġat Ġruntime Ċ Ġ* Ġ- Ġcan Ġbe Ġenabled Ġor Ġdisabled Ġat Ġruntime Ġby Ġthe Ġuser Ċ Ġ*/ Ċ object ĠConfig Persistence Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Config Persistence :: class . java ) ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġloaded Config : ĠConfig ĊĠĠĠ Ġprivate Ġval Ġgson Ġ= ĠGson Builder () ĊĠĠĠĠĠĠĠ Ġ. set Pretty Print ing () ĊĠĠĠĠĠĠĠ Ġ. create () ĊĊĠĠĠ Ġ/** ĠLoad Ġconfig Ġfrom Ġfile Ġinto Ġmemory . Ġ*/ ĊĠĠĠ Ġfun Ġinitialise () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( FILE _ NAME ) ĊĠĠĠĠĠĠĠ Ġloaded Config Ġ= Ġif Ġ( file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Element Ġ= ĠConfig Migration (). run ( file . read Text ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgson . fromJson ( json Element , ĠConfig :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Default Config () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( loaded Config . port Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloaded Config . port Ġ= ĠDEFAULT _ PORT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Default ing Ġto Ġport Ġ$ DEFAULT _ PORT ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ@ return Ġthe Ġchosen Ġport Ġnumber . Ġ*/ ĊĠĠĠ Ġfun Ġget Port () Ġ= Ġloaded Config . port ĊĊĠĠĠ Ġ/** Ġ@ return Ġthe Ġuser 's ĠID . Ġ*/ ĊĠĠĠ Ġfun ĠgetId (): ĠString Ġ= Ġloaded Config . id ĊĊĠĠĠ Ġ/** ĠSet Ġthe Ġuser 's ĠID . Ġ*/ ĊĠĠĠ Ġfun ĠsetId ( id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( loaded Config . id Ġ!= Ġid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloaded Config . id Ġ= Ġid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ@ return Ġthe Ġcurrently Ġchosen ĠD ota Ġinstallation Ġpath . Ġ*/ ĊĠĠĠ Ġfun Ġget D ota Path (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . dot a Path ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠSet Ġthe ĠD ota Ġinstallation Ġpath . Ġ*/ ĊĠĠĠ Ġfun Ġset D ota Path ( path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . dot a Path Ġ= Ġpath ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetNext Feedback (): ĠLong Ġ= Ġloaded Config . next Feedback ĊĊĠĠĠ Ġfun Ġset Next Feedback ( time Millis : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . next Feedback Ġ= Ġtime Millis ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget App Update Frequency (): ĠUpdate Frequency Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . updates . app Update Frequency ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset App Update Frequency ( frequency : ĠUpdate Frequency ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . updates . app Update Frequency Ġ= Ġfrequency ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget App Last Update At (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . updates . app Update Check ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset App Last Update To Now () Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . updates . app Update Check Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Sounds Update Frequency (): ĠUpdate Frequency Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . updates . sounds Update Frequency ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Sounds Update Frequency ( frequency : ĠUpdate Frequency ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . updates . sounds Update Frequency Ġ= Ġfrequency ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Sounds Last Update At (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . last Sync ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Sounds Last Update To Now () Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . last Sync Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Mod Update Frequency (): ĠUpdate Frequency Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . updates . mod Update Frequency ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Mod Update Frequency ( frequency : ĠUpdate Frequency ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . updates . mod Update Frequency Ġ= Ġfrequency ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Mod Last Update At (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . updates . mod Update Check ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Mod Last Update To Now () Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . updates . mod Update Check Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Using He al Smart Chance (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . special . use He al Smart Chance ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetIs Using He al Smart Chance ( using : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . special . use He al Smart Chance Ġ= Ġusing ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Min Period (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . special . min Period ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Min Period ( value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . special . min Period Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetMax Period (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . special . max Period ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Max Period ( value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . special . max Period Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget B ount y Rune Timer (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . special . bo unt y Rune Timer ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset B ount y Rune Timer ( timer : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . special . bo unt y Rune Timer Ġ= Ġtimer ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ@ return Ġthe Ġcurrent Ġvolume , Ġin Ġthe Ġrange Ġ`[ 0 . 0 , Ġ 1 0 0 . 0 ] `. Ġ*/ ĊĠĠĠ Ġfun Ġget Volume (): ĠInt Ġ= Ġloaded Config . volume ĊĊĠĠĠ Ġ/** ĠSet Ġthe Ġcurrent Ġvolume . ĠWill Ġbe Ġclamp ed Ġto Ġthe Ġrange Ġ`[ 0 . 0 , Ġ 1 0 0 . 0 ] `. Ġ*/ ĊĠĠĠ Ġfun Ġset Volume ( volume : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . volume Ġ= Ġvolume . coerce At Least ( MIN _ VOLUME ). coerce At Most ( MAX _ VOLUME ) ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Dark Mode (): ĠBoolean Ġ= Ġloaded Config . dark Mode ĊĊĠĠĠ Ġfun ĠsetIs Dark Mode ( dark Mode : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . dark Mode Ġ= Ġdark Mode ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ@ return Ġ` true ` Ġif Ġthe Ġuser Ġhas Ġenabled Ġthe ĠDiscord Ġbot . Ġ*/ ĊĠĠĠ Ġfun Ġis Using Discord Bot () Ġ= Ġloaded Config . discord Bot Enabled ĊĊĠĠĠ Ġ/** ĠSet Ġwhether Ġthe Ġuser Ġhas Ġenabled Ġthe ĠDiscord Ġbot . Ġ*/ ĊĠĠĠ Ġfun Ġset Using Discord Bot ( enabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . discord Bot Enabled Ġ= Ġenabled ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ@ return Ġthe Ġuser 's Ġcurrent Ġtoken Ġif Ġit Ġis Ġset , Ġempty Ġstring Ġotherwise . Ġ*/ ĊĠĠĠ Ġfun Ġget Discord Token (): ĠString Ġ= Ġloaded Config . discord Token ĊĊĠĠĠ Ġ/** ĠSet Ġthe Ġuser 's ĠDiscord Ġtoken . Ġ*/ ĊĠĠĠ Ġfun Ġset Discord Token ( token : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . discord Token Ġ= Ġtoken . trim () ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġwhether Ġwe Ġhave Ġnotified Ġabout Ġthe Ġtr ay Ġicon Ġto Ġ` true `. ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġvalue Ġprior Ġto Ġsetting Ġit Ġto Ġ` true `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget AndSet Not ified About System Tray (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprevious Ġ= Ġloaded Config . tray Not ified ĊĠĠĠĠĠĠĠ Ġloaded Config . tray Not ified Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠĠĠĠĠ Ġreturn Ġprevious ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Min imize To Tray (): ĠBoolean Ġ= Ġloaded Config . minimize To Tray ĊĊĠĠĠ Ġfun Ġset Min imize To Tray ( minimize : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . minimize To Tray Ġ= Ġminimize ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Always Show Tray Icon (): ĠBoolean Ġ= Ġloaded Config . always Show Tray Icon ĊĊĠĠĠ Ġfun Ġset Always Show Tray Icon ( show : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . always Show Tray Icon Ġ= Ġshow ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ@ return Ġsound Ġtrigger Ġtypes Ġthat Ġare Ġenabled . Ġ*/ ĊĠĠĠ Ġfun Ġget Enabled Sound Triggers (): ĠCollection < Sound Trigger Type > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . sounds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Values Ġ{ Ġit . enabled Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. keys ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠSO UND _ TRIGGER _ TYPES . first Ġ{ Ġtype Ġ-> Ġit Ġ== Ġtype . simple Name Ġ} Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ@ return Ġ` true ` Ġif Ġthe Ġsound Ġtrigger Ġis Ġenabled ; Ġ` false ` Ġotherwise . Ġ*/ ĊĠĠĠ Ġfun Ġis Sound Trigger Enabled ( type : ĠSound Trigger Type ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . sounds . getValue ( type . key ). enabled ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠEnable Ġor Ġdisable Ġa Ġsound Ġtrigger . Ġ*/ ĊĠĠĠ Ġfun Ġtoggle Sound Trigger ( type : ĠSound Trigger Type , Ġenabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . sounds . getValue ( type . key ). enabled Ġ= Ġenabled ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Sound Trigger Chance ( type : ĠSound Trigger Type ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . sounds . getValue ( type . key ). chance ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Sound Trigger Chance ( type : ĠSound Trigger Type , Ġchance : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . sounds . getValue ( type . key ). chance Ġ= Ġchance ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Sound Trigger Min Rate ( type : ĠSound Trigger Type ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . sounds . getValue ( type . key ). min Rate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Sound Trigger Min Rate ( type : ĠSound Trigger Type , Ġmin Rate : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . sounds . getValue ( type . key ). min Rate Ġ= Ġmin Rate ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Sound Trigger Max Rate ( type : ĠSound Trigger Type ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . sounds . getValue ( type . key ). max Rate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Sound Trigger Max Rate ( type : ĠSound Trigger Type , Ġmax Rate : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . sounds . getValue ( type . key ). max Rate Ġ= Ġmax Rate ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ@ return Ġwhether Ġthe Ġuser Ġhas Ġchosen Ġto Ġplay Ġthe Ġsound Ġtrigger Ġthrough ĠDiscord . Ġ*/ ĊĠĠĠ Ġfun Ġis Play ed Through Discord ( type : ĠSound Trigger Type ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . sounds . getValue ( type . key ). play Through Discord ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠSet Ġwhether Ġthe Ġuser Ġhas Ġchosen Ġto Ġplay Ġthe Ġsound Ġtrigger Ġthrough ĠDiscord . Ġ*/ ĊĠĠĠ Ġfun Ġset Play ed Through Discord ( type : ĠSound Trigger Type , Ġplay Through Discord : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . sounds . getValue ( type . key ). play Through Discord Ġ= Ġplay Through Discord ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ@ return Ġall Ġselected Ġsound Ġbit es Ġfor Ġa Ġtrigger . Ġ*/ ĊĠĠĠ Ġfun Ġget Sounds ForType ( type : ĠSound Trigger Type ): ĠList < Sound B ite > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtoggle Ġ= Ġloaded Config . sounds . getValue ( type . key ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtoggle . sounds . map NotNull Ġ{ ĠSound B ites . find Sound ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Sound Selected ForType ( type : ĠSound Trigger Type , Ġsound B ite : ĠSound B ite ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . sounds . getValue ( type . key ). sounds . contains ( sound B ite . name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Sound Selected ForType ( type : ĠSound Trigger Type , Ġsound B ite : ĠSound B ite , Ġselected : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . sounds . getValue ( type . key ). sounds . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected ) Ġit Ġ+= Ġsound B ite . name Ġelse Ġit Ġ-= Ġsound B ite . name ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ@ return Ġa Ġlist Ġof Ġall Ġsounds Ġselected Ġfor Ġthe Ġsound Ġboard . Ġ*/ ĊĠĠĠ Ġfun Ġget Sound Board (): ĠList < Sound B ite > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . sound Board . map NotNull Ġ{ ĠSound B ites . find Sound ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠSet Ġthe Ġlist Ġof Ġall Ġsounds Ġselected Ġfor Ġthe Ġsound Ġboard . Ġ*/ ĊĠĠĠ Ġfun Ġset Sound Board ( sound Board : ĠList < Sound B ite >) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . sound Board . set All ( sound Board . map Ġ{ Ġit . name Ġ}) ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Sound Board Rate (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . sound Board Rate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Sound Board Rate ( rate : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . sound Board Rate Ġ= Ġrate ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Mod Risk Accepted (): ĠBoolean Ġ= Ġloaded Config . mod Risk Accepted ĊĊĠĠĠ Ġfun Ġset Mod Risk Accepted () Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . mod Risk Accepted Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ@ return Ġ` true ` Ġif Ġay Ġleast Ġone Ġmod Ġhas Ġbeen Ġenabled . Ġ*/ ĊĠĠĠ Ġfun Ġhas Enabled Mods (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . enabled Mods . isNotEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Enabled Mods (): ĠCollection < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . enabled Mods ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ@ return Ġ` true ` Ġif Ġthe Ġgiven Ġmod Ġhas Ġbeen Ġenabled . Ġ*/ ĊĠĠĠ Ġfun Ġis Mod Enabled ( mod : ĠD ota Mod ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmod . key Ġin Ġloaded Config . enabled Mods ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠEnable Ġthe Ġgiven Ġmod . Ġ*/ ĊĠĠĠ Ġfun Ġenable Mod ( mod : ĠD ota Mod ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . enabled Mods Ġ+= Ġmod . key ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠDisable Ġall Ġmods Ġthat Ġaren 't Ġin Ġthe Ġgiven Ġcollection . Ġ*/ ĊĠĠĠ Ġfun Ġdisable Other Mods ( mods : ĠCollection < D ota Mod >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġloaded Config . enabled Mods ĊĠĠĠĠĠĠĠ Ġval Ġremove Ġ= Ġcurrent Ġ- Ġmods . map Ġ{ Ġit . key Ġ} ĊĊĠĠĠĠĠĠĠ Ġloaded Config . enabled Mods Ġ-= Ġremove ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġcollection Ġof Ġsound Ġnames Ġthat Ġwere Ġselected Ġby Ġthe Ġuser Ġbut Ġdon 't Ġexist Ġlocally . ĊĠĠĠĠ Ġ* ĠWhen Ġcalled , Ġthe Ġreturned Ġsounds Ġwill Ġnot Ġbe Ġreturned Ġby Ġfuture Ġcalls . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfind Invalid Sounds (): ĠCollection < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlocal Sounds Ġ= ĠSound B ites . getAll (). map Ġ{ Ġit . name Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinvalid Sounds Ġ= Ġ(( loaded Config . sounds . flatMap Ġ{ Ġit . value . sounds Ġ}) Ġ+ Ġloaded Config . sound Board ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ! in Ġlocal Sounds Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ! in Ġloaded Config . invalid Sounds Ġ} ĊĊĠĠĠĠĠĠĠ Ġloaded Config . invalid Sounds Ġ+= Ġinvalid Sounds ĊĠĠĠĠĠĠĠ Ġsave () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġinvalid Sounds ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Invalid Sounds ( v ict ims : ĠCollection < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . invalid Sounds . removeAll ( v ict ims ) ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Sound B ite Volumes (): ĠMap < String , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . volumes . toMap () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Sound B ite Volume ( name : ĠString ): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . volumes [ name ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Sound B ite Volume ( name : ĠString , Ġvolume : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . volumes [ name ] Ġ= Ġvolume ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Sound B ite Volume ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . volumes . remove ( name ) ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠUpdate Ġthe Ġgiven Ġsound Ġtrigger 's Ġconfig Ġto Ġuse Ġthe Ġgiven Ġsound Ġb ite Ġ` selection `. Ġ*/ ĊĠĠĠ Ġfun Ġsave Sounds ForType ( type : ĠSound Trigger Type , Ġselection : ĠList < Sound B ite >) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . sounds . getValue ( type . key ). sounds . set All ( selection . map Ġ{ Ġit . name Ġ}) ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Sound Com bos (): ĠCollection < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . sound Com bos . keys ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Sound Combo ( name : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . sound Com bos . containsKey ( name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind Sound Combo ( name : ĠString ): ĠList < Sound B ite > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Config . sound Com bos . getValue ( name ). map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSound B ites . find Sound ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave Sound Combo ( name : ĠString , Ġsounds : ĠList < Sound B ite >) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . sound Com bos [ name ] Ġ= Ġsounds . map Ġ{ Ġit . name Ġ} ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Sound Combo ( sound B ite : ĠCombo Sound B ite ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Config . sound Com bos . remove ( sound B ite . name ) ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠSave Ġthe Ġcurrent Ġ` config ` Ġmap Ġto Ġfile . Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsave () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( FILE _ NAME ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Created Ġnew Ġconfig Ġfile : Ġ${ file . absolute Path }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . createNew File () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfile . write Text ( gson . toJson ( loaded Config )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠLoad Ġthe Ġdefault Ġconfigs Ġfor Ġall Ġsound Ġtriggers . Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġload Default Config (): ĠConfig Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠConfig ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Feedback Ġ= ĠSystem . currentTimeMillis () Ġ+ ĠTimeUnit . DAYS . to Millis ( 3 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsounds Ġ= ĠSO UND _ TRIGGER _ TYPES ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . key Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. associate With Ġ{ ĠToggle () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Mutable Map () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠSound Trigger Type . key : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsimple Name Ġ?: Ġjava . name ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > ĠMutable Collection < T >. set All ( new Items : ĠIterable < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠĠĠĠĠ Ġadd All ( new Items ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠConfig ( ĊĠĠĠĠĠĠĠ Ġvar Ġversion : ĠInt Ġ= ĠCONFIG _ VERSION , ĊĠĠĠĠĠĠĠ Ġvar Ġport : ĠInt Ġ= ĠDEFAULT _ PORT , ĊĠĠĠĠĠĠĠ Ġvar Ġid : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġvar Ġd ota Path : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġvar Ġnext Feedback : ĠLong Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġvar Ġupdates : ĠUpdates Ġ= ĠUpdates (), ĊĠĠĠĠĠĠĠ Ġvar Ġspecial : ĠSpecial Config Ġ= ĠSpecial Config (), ĊĠĠĠĠĠĠĠ Ġvar Ġlast Sync : ĠLong Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġvar Ġvolume : ĠInt Ġ= ĠDEFAULT _ VOLUME , ĊĠĠĠĠĠĠĠ Ġvar Ġdark Mode : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġvar Ġdiscord Bot Enabled : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġvar Ġdiscord Token : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġvar Ġminimize To Tray : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġvar Ġalways Show Tray Icon : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġvar Ġtr ay Not ified : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġval Ġsounds : ĠMutable Map < String , ĠToggle > Ġ= Ġmutable Map Of (), ĊĠĠĠĠĠĠĠ Ġval Ġsound Board : ĠMutable List < String > Ġ= Ġmutable ListOf (), ĊĠĠĠĠĠĠĠ Ġvar Ġsound Board Rate : ĠInt Ġ= ĠDEFAULT _ RATE , ĊĠĠĠĠĠĠĠ Ġval Ġinvalid Sounds : ĠMutable Set < String > Ġ= Ġmutable Set Of (), ĊĠĠĠĠĠĠĠ Ġval Ġvolumes : ĠMutable Map < String , ĠInt > Ġ= Ġmutable Map Of (), ĊĠĠĠĠĠĠĠ Ġvar Ġmod Risk Accepted : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġval Ġenabled Mods : ĠMutable Set < String > Ġ= Ġmutable Set Of (), ĊĠĠĠĠĠĠĠ Ġval Ġsound Com bos : ĠMutable Map < String , ĠList < String >> Ġ= Ġmutable Map Of () ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠUpdates ( ĊĠĠĠĠĠĠĠ Ġvar Ġapp Update Check : ĠLong Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġvar Ġapp Update Frequency : ĠUpdate Frequency Ġ= ĠUpdate Frequency . WEEK LY , ĊĠĠĠĠĠĠĠ Ġvar Ġsounds Update Frequency : ĠUpdate Frequency Ġ= ĠUpdate Frequency . DA IL Y , ĊĠĠĠĠĠĠĠ Ġvar Ġmod Update Check : ĠLong Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġvar Ġmod Update Frequency : ĠUpdate Frequency Ġ= ĠUpdate Frequency . ALWAYS ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠSpecial Config ( ĊĠĠĠĠĠĠĠ Ġvar Ġuse He al Smart Chance : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġvar Ġmin Period : ĠInt Ġ= ĠDEFAULT _ MIN _ PERIOD , ĊĠĠĠĠĠĠĠ Ġvar Ġmax Period : ĠInt Ġ= ĠDEFAULT _ MAX _ PERIOD , ĊĠĠĠĠĠĠĠ Ġvar Ġb ount y Rune Timer : ĠInt Ġ= ĠDEFAULT _ BOUN TY _ RUN E _ TIMER ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠToggle ( ĊĠĠĠĠĠĠĠ Ġvar Ġenabled : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġvar Ġchance : ĠInt Ġ= ĠDEFAULT _ CH ANCE , ĊĠĠĠĠĠĠĠ Ġvar Ġmin Rate : ĠInt Ġ= ĠDEFAULT _ RATE , ĊĠĠĠĠĠĠĠ Ġvar Ġmax Rate : ĠInt Ġ= ĠDEFAULT _ RATE , ĊĠĠĠĠĠĠĠ Ġvar Ġplay Through Discord : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġval Ġsounds : ĠMutable List < String > Ġ= Ġmutable ListOf () ĊĠĠĠ Ġ) Ċ }