package Ġcom . kot l ind is cord . k ord . extensions . commands Ċ Ċ import Ġcom . gitlab . k ord lib . cache . api . query Ċ import Ġcom . gitlab . k ord lib . common . entity . Snow flake Ċ import Ġcom . gitlab . k ord lib . core . cache . data . Message Data Ċ import Ġcom . gitlab . k ord lib . core . entity .* Ċ import Ġcom . gitlab . k ord lib . core . entity . channel . Channel Ċ import Ġcom . gitlab . k ord lib . core . event . message . Message Create Event Ċ import Ġcom . kot l ind is cord . k ord . extensions . Ext ensible Bot Ċ import Ġcom . kot l ind is cord . k ord . extensions . ParseException Ċ import Ġcom . kot l ind is cord . k ord . extensions . parsers . parse Duration Ċ import Ġmu . Kotlin Logging Ċ import Ġnet . time 4 j . Duration Ċ import Ġnet . time 4 j . Iso Unit Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . math . BigInteger Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Parameter Ċ import Ġkotlin . reflect . K Type Ċ import Ġkotlin . reflect . K Type Projection Ċ import Ġkotlin . reflect . full . create Type Ċ import Ġkotlin . reflect . full . is Subtype Of Ċ import Ġkotlin . reflect . full . primary Constructor Ċ Ċ private Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} Ċ Ċ private Ġval ĠD URATION _ TYPE Ġ= ĠDuration :: class . create Type ( listOf ( K Type Projection . in variant ( Iso Unit :: class . create Type ()))) Ċ private Ġval ĠD URATION _ TYPE _ NULL ABLE Ġ= ĠDuration :: class . create Type ( ĊĠĠĠ ĠlistOf ( K Type Projection . in variant ( Iso Unit :: class . create Type ())), ĊĠĠĠ Ġnullable Ġ= Ġtrue Ċ ) Ċ Ċ /** Ċ Ġ* ĠClass Ġin Ġcharge Ġof Ġconverting Ġstring Ġarguments Ġfor Ġcommands Ġinto Ġfully - typed Ġdata Ġclasses . Ċ Ġ* Ċ Ġ* ĠYou Ġmost Ġlikely Ġdon 't Ġneed Ġto Ġtouch Ġthis Ġyourself Ġ- Ġit 's Ġpart Ġof Ġthe Ġcommands Ġframework . Ċ Ġ* Ċ Ġ* Ġ@ param Ġbot ĠInstance Ġof Ġ[ Ext ensible Bot ] Ġwe 're Ġworking Ġwith . Ċ Ġ*/ Ċ open Ġclass ĠArgument Parser ( private Ġval Ġbot : ĠExt ensible Bot ) Ġ{ ĊĠĠĠ Ġ/** ĠDefined Ġhere Ġso Ġwe Ġdon 't Ġhave Ġto Ġcreate Ġit Ġevery Ġtime Ġwe Ġtry Ġto Ġparse Ġsomething . Ġ*/ ĊĠĠĠ Ġopen Ġval Ġlist Type Ġ= ĠList :: class . create Type ( arguments Ġ= ĠlistOf ( K Type Projection . STAR )) ĊĊĠĠĠ Ġ/** Ġ@ suppress Ġ**/ ĊĠĠĠ Ġopen Ġval Ġnullable ListType Ġ= ĠList :: class . create Type ( arguments Ġ= ĠlistOf ( K Type Projection . STAR ), Ġnullable Ġ= Ġtrue ) ĊĊĠĠĠ Ġ/** Ġ@ suppress Ġ**/ ĊĠĠĠ Ġopen Ġval Ġmention Regex Ġ= ĠRegex ("^ < (?: @ [! & ]? | # )( \\ d + )> $ ") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġa Ġdata Ġclass Ġand Ġan Ġarray Ġof Ġstrings , Ġreturn Ġan Ġinstance Ġof Ġthe Ġdata Ġclass Ġthat ĊĠĠĠĠ Ġ* Ġhas Ġbeen Ġpopulated Ġfrom Ġthe Ġarray Ġof Ġstrings . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠFor Ġmore Ġinformation Ġon Ġhow Ġexactly Ġthis Ġfunctions , Ġplease Ġtake Ġa Ġlook Ġat Ġthe Ġwiki . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdat aclass ĠData Ġclass Ġto Ġparse ĠStrings Ġinto . ĊĠĠĠĠ Ġ* Ġ@ param Ġargs ĠArray Ġof ĠStrings Ġto Ġparse . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠParseException ĠThrow n Ġif Ġthe Ġarguments Ġcouldn 't Ġbe Ġparsed Ġfor Ġsome Ġreason . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( ParseException :: class ) ĊĠĠĠ Ġopen Ġsuspend Ġfun Ġ< T Ġ: ĠAny > Ġparse ( dataclass : ĠK Class < T >, Ġargs : ĠArray < out ĠString >, Ġevent : ĠMessage Create Event ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! dataclass . is Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠParseException (" Given Ġclass Ġis Ġnot Ġa Ġdata Ġclass .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdc Args Ġ= Ġdo Parse ( dataclass , Ġargs , Ġevent , Ġdat aclass . primary Constructor !!. parameters ) ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" Too Generic Exception Ca ught ") ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdat aclass . primary Constructor !!. call By ( dc Args ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . toString (). contains (" No Ġargument Ġprovided Ġfor Ġa Ġrequired Ġparameter ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠParseException (" A Ġrequired Ġargument Ġis Ġmissing .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠParseException (" Data Ġclass Ġcannot Ġbe Ġconstructed Ġ($ e )") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ@ suppress Ġ**/ ĊĠĠĠ Ġ@ Throws ( ParseException :: class ) ĊĠĠĠ Ġopen Ġsuspend Ġfun Ġ< T Ġ: ĠAny > Ġdo Parse ( ĊĠĠĠĠĠĠĠ Ġdat aclass : ĠK Class < T >, ĊĠĠĠĠĠĠĠ Ġargs : ĠArray < out ĠString >, ĊĠĠĠĠĠĠĠ Ġevent : ĠMessage Create Event , ĊĠĠĠĠĠĠĠ Ġelements : ĠList < K Parameter >, ĊĊĠĠĠĠĠĠĠ Ġarg Index : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġelement Index : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġdc Args : ĠMutable Map < K Parameter , ĠAny ?> Ġ= Ġmutable Map Of () ĊĠĠĠ Ġ): ĠMap < K Parameter , ĠAny ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( arg Index Ġ>= Ġargs . size Ġ|| Ġelement Index Ġ>= Ġelements . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdc Args ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġargument Ġ= Ġargs [ arg Index ] ĊĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġelements [ element Index ] ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" Too Generic Exception Ca ught ", Ġ" Re throw Ca ught Exception ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( argument . contains (': ')) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġargument Ġhas Ġa Ġ`: `, Ġwe Ġassign Ġthe Ġvalue Ġon Ġthe Ġright Ġto Ġthe Ġparameter Ġon Ġthe Ġleft . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( param Name , Ġparam Arg ) Ġ= Ġargument . split (': ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Property Ġ= Ġdat aclass . primary Constructor !!. parameters . single Ġ{ Ġit . name Ġ== Ġparam Name Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( param Property . type . is Subtype Of ( list Type ) Ġ|| Ġparam Property . type . is Subtype Of ( nullable ListType )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġstring To Type ( param Arg , Ġparam Property . type . arguments [ 0 ]. type !! , Ġevent ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( dc Args . get Or Put ( param Property , Ġ{ Ġmutable ListOf < Any ?> () Ġ}) Ġas ĠMutable List < Any ?> ). add ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġstring To Type ( param Arg , Ġparam Property . type , Ġevent ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdc Args [ param Property ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdo Parse ( dataclass , Ġargs , Ġevent , Ġelements , Ġarg Index Ġ+ Ġ 1 , Ġelement Index , Ġdc Args ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( element . type . is Subtype Of ( list Type ) Ġ|| Ġelement . type . is Subtype Of ( nullable ListType )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdc Args [ element ] Ġ= Ġstrings To Types ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargs . slice Array ( arg Index Ġuntil Ġargs . size ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . type . arguments [ 0 ]. type !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdc Args ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdc Args [ element ] Ġ= Ġstring To Type ( argument , Ġelement . type , Ġevent ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠElement Ġindex Ġshould Ġord in arily Ġmatch Ġarg Ġindex , Ġbut Ġwhen Ġan Ġoptional Ġparameter Ġis Ġskipped , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthey Ġaren 't Ġsynced Ġanymore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdo Parse ( dataclass , Ġargs , Ġevent , Ġelements , Ġarg Index Ġ+ Ġ 1 , Ġelement Index Ġ+ Ġ 1 , Ġdc Args ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠParseException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ Ġ// ĠAny thing Ġcan Ġhappen Ġhere , Ġreally ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! element . is Optional ) Ġ{ Ġ Ġ// ĠOptional Ġparams Ġhave Ġdefault Ġvalues Ġand Ġthus Ġcan Ġbe Ġskipped ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( e ) Ġ{ Ġ" Failed Ġto Ġconvert Ġargument : Ġ$ argument " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠParseException (" `$ argument ` Ġcannot Ġbe Ġconverted Ġto Ġ${ element . type } Ġ($ e )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġwant Ġto Ġtry Ġthis Ġagain Ġwith Ġthe Ġnext Ġelement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdo Parse ( dataclass , Ġargs , Ġevent , Ġelements , Ġarg Index , Ġelement Index Ġ+ Ġ 1 , Ġdc Args ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ@ suppress Ġ**/ ĊĠĠĠ Ġopen Ġsuspend Ġfun Ġstring To Type ( string : ĠString , Ġtype : ĠK Type , Ġevent : ĠMessage Create Event ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" Too Generic Exception Ca ught ") Ġ Ġ// ĠAs Ġusual , Ġanything Ġcan Ġhappen Ġhere . ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( String :: class . create Type ()) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( String :: class . create Type ( nullable Ġ= Ġtrue )) Ġ-> Ġstring ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( Regex :: class . create Type ()) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( Regex :: class . create Type ( nullable Ġ= Ġtrue )) Ġ-> Ġstring . to Regex () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( Boolean :: class . create Type ()) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( Boolean :: class . create Type ( nullable Ġ= Ġtrue )) Ġ-> Ġstring . to Boolean () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( Int :: class . create Type ()) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( Int :: class . create Type ( nullable Ġ= Ġtrue )) Ġ-> Ġstring . toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( Short :: class . create Type ()) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( Short :: class . create Type ( nullable Ġ= Ġtrue )) Ġ-> Ġstring . to Short () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( Long :: class . create Type ()) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( Long :: class . create Type ( nullable Ġ= Ġtrue )) Ġ-> Ġstring . to Long () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( Float :: class . create Type ()) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( Float :: class . create Type ( nullable Ġ= Ġtrue )) Ġ-> Ġstring . toFloat () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( Double :: class . create Type ()) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( Double :: class . create Type ( nullable Ġ= Ġtrue )) Ġ-> Ġstring . toDouble () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( BigDecimal :: class . create Type ()) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( BigDecimal :: class . create Type ( nullable Ġ= Ġtrue )) Ġ-> Ġstring . to BigDecimal () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( BigInteger :: class . create Type ()) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( BigInteger :: class . create Type ( nullable Ġ= Ġtrue )) Ġ-> Ġstring . to BigInteger () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( DURATION _ TYPE ) Ġ-> Ġparse Duration ( string ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( DURATION _ TYPE _ NULL ABLE ) Ġ-> Ġparse Duration ( string ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( Channel :: class . create Type ()) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed String Ġ= Ġparse Mention ( string ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbot . k ord . getChannel ( Snow flake ( parse Mention ( parsed String ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠParseException (" No Ġsuch Ġchannel : Ġ`$ parsed String ` ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( Channel :: class . create Type ( nullable Ġ= Ġtrue )) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed String Ġ= Ġparse Mention ( string ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbot . k ord . getChannel ( Snow flake ( parse Mention ( parsed String ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( Guild Emoji :: class . create Type ()) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed String Ġ= Ġparse Mention ( string ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . message . get Guild OrNull ()?. get Emoji OrNull ( Snow flake ( parsed String )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠParseException (" No Ġsuch Ġemoji : Ġ`$ parsed String ` ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( Guild Emoji :: class . create Type ( nullable Ġ= Ġtrue )) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed String Ġ= Ġparse Mention ( string ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . message . get Guild OrNull ()?. get Emoji OrNull ( Snow flake ( parsed String )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( Guild :: class . create Type ()) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed String Ġ= Ġparse Mention ( string ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbot . k ord . get Guild ( Snow flake ( parsed String )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠParseException (" No Ġsuch Ġguild : Ġ`$ parsed String ` ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( Guild :: class . create Type ( nullable Ġ= Ġtrue )) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed String Ġ= Ġparse Mention ( string ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbot . k ord . get Guild ( Snow flake ( parsed String )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( Role :: class . create Type ()) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed String Ġ= Ġparse Mention ( string ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . message . get Guild OrNull ()?. get Role OrNull ( Snow flake ( parsed String )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠParseException (" No Ġsuch Ġrole : Ġ`$ parsed String ` ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( Role :: class . create Type ( nullable Ġ= Ġtrue )) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed String Ġ= Ġparse Mention ( string ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . message . get Guild OrNull ()?. get Role OrNull ( Snow flake ( parsed String )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( User :: class . create Type ()) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed String Ġ= Ġparse Mention ( string ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbot . k ord . getUser ( Snow flake ( parsed String )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠParseException (" No Ġsuch Ġuser : Ġ`$ parsed String ` ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( User :: class . create Type ( nullable Ġ= Ġtrue )) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed String Ġ= Ġparse Mention ( string ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbot . k ord . getUser ( Snow flake ( parsed String )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( Message :: class . create Type ()) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed String Ġ= Ġparse Mention ( string ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Col Ġ= Ġbot . k ord . cache . query < Message Data > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠMessage Data :: id Ġeq Ġparsed String . to Long () Ġ}. to Collection () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! message Col . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġmessage Col . first () Ġ// ĠDoes n 't Ġdefine Ġget , Ġwe Ġhave Ġto Ġuse Ġa Ġworkaround ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessage ( data , Ġbot . k ord ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠParseException (" No Ġsuch Ġmessage : Ġ`$ parsed String ` ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Subtype Of ( Message :: class . create Type ( nullable Ġ= Ġtrue )) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed String Ġ= Ġparse Mention ( string ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Col Ġ= Ġbot . k ord . cache . query < Message Data > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠMessage Data :: id Ġeq Ġparsed String . to Long () Ġ}. to Collection () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! message Col . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġmessage Col . first () Ġ// ĠDoes n 't Ġdefine Ġget , Ġwe Ġhave Ġto Ġuse Ġa Ġworkaround ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessage ( data , Ġbot . k ord ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠNotImplementedError (" String Ġconversion Ġnot Ġsupported Ġfor Ġtype : Ġ$ type ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ@ suppress Ġ**/ ĊĠĠĠ Ġopen Ġsuspend Ġfun Ġstrings To Types ( strings : ĠArray < out ĠString >, Ġtype : ĠK Type , Ġevent : ĠMessage Create Event ): ĠList < Any ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalues : ĠMutable List < Any ?> Ġ= Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠ Ġstrings . forEach Ġ{ Ġvalues . add ( string To Type ( it , Ġtype , Ġevent )) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġvalues ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ@ suppress Ġ**/ ĊĠĠĠ Ġopen Ġfun Ġparse Mention ( string : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( string . to Long OrNull () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstring ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmention Regex . match Ent ire ( string . trim ()) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ== Ġnull Ġ-> Ġthrow ĠParseException (" Could Ġnot Ġconvert Ġ`$ string ` Ġto Ġan ĠID .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . groups . size Ġ< Ġ 2 Ġ-> Ġthrow ĠParseException (" Could Ġnot Ġconvert Ġ`$ string ` Ġto Ġan ĠID .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . groups [ 1 ] Ġ== Ġnull Ġ-> Ġthrow ĠParseException (" Could Ġnot Ġconvert Ġ`$ string ` Ġto Ġan ĠID .") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġresult . groups [ 1 ] !!. value ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ