/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// 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 . fa endir . z ach tron ics . bot . om . discord Ċ Ċ import Ġcom . fa endir . discord 4 j . command . annotation . Application Command Ċ import Ġcom . fa endir . discord 4 j . command . annotation . Auto Complete Ċ import Ġcom . fa endir . discord 4 j . command . annotation . Converter Ċ import Ġcom . fa endir . discord 4 j . command . parse . Application Command Parser Ċ import Ġcom . fa endir . z ach tron ics . bot . discord . command . Abstract Sub Command Ċ import Ġcom . fa endir . z ach tron ics . bot . discord . command . security . Discord User Ċ import Ġcom . fa endir . z ach tron ics . bot . discord . command . security . Discord User Sec ured Ċ import Ġcom . fa endir . z ach tron ics . bot . model . Display Context Ċ import Ġcom . fa endir . z ach tron ics . bot . om . JN IS olution Verifier Ċ import Ġcom . fa endir . z ach tron ics . bot . om . Om Qualifier Ċ import Ġcom . fa endir . z ach tron ics . bot . om . get Metrics Ċ import Ġcom . fa endir . z ach tron ics . bot . om . model .* Ċ import Ġcom . fa endir . z ach tron ics . bot . om . repository . Om Solution Repository Ċ import Ġcom . fa endir . z ach tron ics . bot . utils . Safe Embed Message Builder Ċ import Ġcom . fa endir . z ach tron ics . bot . utils . or Empty Ċ import Ġdiscord 4 j . core . event . domain . interaction . Def err able Interaction Event Ċ import Ġdiscord 4 j . discord json . json . Application Command Option Data Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġreactor . core . publisher . Mono Ċ Ċ @ Component Ċ @ Om Qualifier Ċ class ĠRe verify Command ( private Ġval Ġrepository : ĠOm Solution Repository ) Ġ: ĠAbstract Sub Command < Re verify >(), ĊĠĠĠ ĠApplication Command Parser < Re verify , ĠApplication Command Option Data > Ġby ĠRe verify Parser Ġ{ ĊĠĠĠ Ġoverride Ġval Ġsec ured Ġ= ĠDiscord User Sec ured ( Discord User . BOT _ OWN ERS ) ĊĊĠĠĠ Ġoverride Ġfun Ġhandle ( event : ĠDef err able Interaction Event , Ġparameters : ĠRe verify ): ĠMono < Void > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġp uzz les Ġ= Ġ( parameters . pu zzle ?. let Ġ{ ĠlistOf ( it ) Ġ} Ġ?: ĠOm P uzzle . values (). toList ()). filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . type Ġ== Ġnull Ġ|| Ġparameters . type Ġ== Ġit . type ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġparts Ġ= Ġparameters . part ?. let Ġ{ ĠlistOf ( it ) Ġ} Ġ?: ĠOm Score Part . values (). toList () ĊĠĠĠĠĠĠĠ Ġval Ġoverride Existing Ġ= Ġparameters . override Existing Ġ== Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġoverride Records Ġ= Ġmutable ListOf < Pair < Om Record , ĠOm Score >>() ĊĠĠĠĠĠĠĠ Ġval Ġerrors Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( pu zzle Ġin Ġp uzz les ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pu zzle . file Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerrors . add (" No Ġpuzzle Ġfile Ġfor Ġ${ pu zzle . displayName }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecords Ġ= Ġrepository . find Category Hold ers ( pu zzle , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( record , Ġ_) Ġin Ġrecords ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( record . data Path Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerrors . add (" No Ġsolution Ġfile Ġfor Ġ${ record . to Display String ( Display Context . discord ()) }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( override Existing Ġ|| Ġparts . any Ġ{ Ġit . getValue ( record . score ) Ġ== Ġnull Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomputed Ġ= ĠJ N IS olution Verifier . open ( pu zzle . file , Ġrecord . data Path . to File ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. use Ġ{ Ġit . get Metrics ( parts ) Ġ{ Ġe , Ġpart Ġ-> Ġerrors . add (" Failed Ġto Ġget Ġ${ part . displayName } Ġfor Ġ${ record . to Display String ( Display Context . discord ()) }: Ġ${ e . message }") Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( computed . size Ġ< Ġparts . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerrors . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" W anted Ġ${ parts . join ToString Ġ{ Ġit . displayName Ġ}}, Ġbut Ġgot Ġ${ computed . keys . join ToString Ġ{ Ġit . displayName Ġ}} Ġfor Ġ${ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecord . to Display String ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDisplay Context . discord () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Score Ġ= Ġif Ġ( override Existing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOm Score ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcost Ġ= Ġcomputed [ Om Score Part . CO ST ]?. toInt () Ġ?: Ġrecord . score . cost , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcycles Ġ= Ġcomputed [ Om Score Part . CY C LES ]?. toInt () Ġ?: Ġrecord . score . cycles , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarea Ġ= Ġcomputed [ Om Score Part . AREA ]?. toInt () Ġ?: Ġrecord . score . area , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstructions Ġ= Ġcomputed [ Om Score Part . INSTR UCTION S ]?. toInt () Ġ?: Ġrecord . score . instructions , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġcomputed [ Om Score Part . HEIGHT ]?. toInt () Ġ?: Ġrecord . score . height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġcomputed [ Om Score Part . WIDTH ]?. toDouble () Ġ?: Ġrecord . score . width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrate Ġ= Ġcomputed [ Om Score Part . RATE ]?. toDouble () Ġ?: Ġrecord . score . rate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrack less Ġ= Ġrecord . score . track less , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverlap Ġ= Ġrecord . score . overlap , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOm Score ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcost Ġ= Ġrecord . score . cost Ġ?: Ġcomputed [ Om Score Part . CO ST ]?. toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcycles Ġ= Ġrecord . score . cycles Ġ?: Ġcomputed [ Om Score Part . CY C LES ]?. toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarea Ġ= Ġrecord . score . area Ġ?: Ġcomputed [ Om Score Part . AREA ]?. toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstructions Ġ= Ġrecord . score . instructions Ġ?: Ġcomputed [ Om Score Part . INSTR UCTION S ]?. toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġrecord . score . height Ġ?: Ġcomputed [ Om Score Part . HEIGHT ]?. toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġrecord . score . width Ġ?: Ġcomputed [ Om Score Part . WIDTH ]?. toDouble (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrate Ġ= Ġrecord . score . rate Ġ?: Ġcomputed [ Om Score Part . RATE ]?. toDouble (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrack less Ġ= Ġrecord . score . track less , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverlap Ġ= Ġrecord . score . overlap , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Score Ġ!= Ġrecord . score ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Records . add ( record Ġto Ġnew Score ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( override Records . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . override Scores ( override Records ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠSafe Embed Message Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. title ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Re verify " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . type ?. displayName ?. or Empty (" Ġ") Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . pu zzle ?. displayName ?. or Empty (" Ġ") Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . part ?. displayName ?. or Empty (" Ġ") Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parameters . override Existing Ġ== Ġtrue ) Ġ" Ġoverriding Ġexisting Ġvalues !" Ġelse Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. description (" ** Modified ĠRecords :** Ġ${ override Records . size }\ n \ n ** Errors :** \ n ${ errors . join ToString ("\ n ") }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. send ( event ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Application Command ( name Ġ= Ġ" re verify ", Ġdescription Ġ= Ġ" Re compute Ġmetrics Ġbased Ġon Ġfilters ", Ġsub Command Ġ= Ġtrue ) Ċ data Ġclass ĠRe verify ( ĊĠĠĠ Ġval Ġtype : ĠOm Type ?, ĊĠĠĠ Ġ@ Converter ( P uzzle Converter :: class ) ĊĠĠĠ Ġ@ Auto Complete ( P uzzle Auto Completion Provider :: class ) ĊĠĠĠ Ġval Ġpuzzle : ĠOm P uzzle ?, ĊĠĠĠ Ġval Ġpart : ĠOm Score Part ?, ĊĠĠĠ Ġval Ġoverride Existing : ĠBoolean ?, Ċ )