package Ġcom . ser eb it . aut ot itan . internal Ċ Ċ import Ġcom . ser eb it . aut ot itan . api . Em ote Ċ import Ġcom . ser eb it . aut ot itan . api . Long String Ċ import Ġnet . dv 8 tion . j da . api . J DA Ċ import Ġnet . dv 8 tion . j da . api . entities .* Ċ import Ġnet . dv 8 tion . j da . api . events . message . Message Received Event Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . math . BigInteger Ċ import Ġkotlin . reflect . K Type Ċ import Ġkotlin . reflect . type Of Ċ Ċ internal Ġobject ĠParser Ġ{ ĊĠĠĠ Ġfun Ġtokenize ( message : ĠString , Ġsignature : ĠRegex ): ĠList < String >? Ġ= ĊĠĠĠĠĠĠĠ Ġsignature . find ( message )?. groups ?. map NotNull Ġ{ Ġit ?. value Ġ} ?. drop ( 1 ) ĊĊĠĠĠ Ġfun Ġparse Tokens ( evt : ĠMessage Received Event , Ġtokens : ĠList < String >, Ġtoken Types : ĠList < TokenType >): ĠList < Any >? Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( tokens . isNotEmpty ()) Ġcast Tokens ( evt , Ġtoken Types , Ġtokens . take Last ( token Types . size )) Ġelse Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġcast Tokens ( evt : ĠMessage Received Event , Ġtypes : ĠList < TokenType >, Ġtokens : ĠList < String >): ĠList < Any >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcast ed Tokens Ġ= Ġtypes . zip ( tokens ). map Ġ{ Ġ( type , Ġtoken ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTokenType . Number Ġ-> Ġcast Num eral ( type , Ġtoken ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTokenType . J da Ġ-> Ġcast J da Mention able ( evt , Ġtype , Ġtoken ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTokenType . Other Ġ-> Ġcast Other ( evt , Ġtype , Ġtoken ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( null Ġin Ġcast ed Tokens ) Ġnull Ġelse Ġcast ed Tokens . require No Null s () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcast J da Mention able ( evt : ĠMessage Received Event , Ġtype : ĠTokenType . J da , Ġtoken : ĠString ): ĠIM ention able ? Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTokenType . J da . User Token Ġ-> Ġevt . j da . getUser By Mention ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTokenType . J da . Member Token Ġ-> Ġevt . guild . get Member By Mention ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTokenType . J da . Text Channel Token Ġ-> Ġevt . guild . getText Channel By Mention ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTokenType . J da . Role Token Ġ-> Ġevt . guild . get Role By Mention ( token ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcast Num eral ( type : ĠTokenType . Number , Ġtoken : ĠString ): ĠNumber ? Ġ= Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTokenType . Number . Byte Token Ġ-> Ġtoken . to Byte OrNull () ĊĠĠĠĠĠĠĠ ĠTokenType . Number . Short Token Ġ-> Ġtoken . to Short OrNull () ĊĠĠĠĠĠĠĠ ĠTokenType . Number . Int Token Ġ-> Ġtoken . toInt OrNull () ĊĠĠĠĠĠĠĠ ĠTokenType . Number . Long Token Ġ-> Ġtoken . to Long OrNull () ĊĠĠĠĠĠĠĠ ĠTokenType . Number . BigInt Token Ġ-> Ġtoken . to BigInteger OrNull () ĊĠĠĠĠĠĠĠ ĠTokenType . Number . Double Token Ġ-> Ġtoken . toDouble OrNull () ĊĠĠĠĠĠĠĠ ĠTokenType . Number . Float Token Ġ-> Ġtoken . toFloat OrNull () ĊĠĠĠĠĠĠĠ ĠTokenType . Number . BigDecimal Token Ġ-> Ġtoken . to BigDecimal OrNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcast Other ( evt : ĠMessage Received Event , Ġtype : ĠTokenType . Other , Ġtoken : ĠString ): ĠAny ? Ġ= Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTokenType . Other . String Token Ġ-> Ġif Ġ( token . any Ġ{ Ġit . is Whitespace () Ġ}) Ġnull Ġelse Ġtoken ĊĠĠĠĠĠĠĠ ĠTokenType . Other . Long String Token Ġ-> ĠLong String ( token ) ĊĠĠĠĠĠĠĠ ĠTokenType . Other . Char Token Ġ-> Ġtoken . single OrNull () ĊĠĠĠĠĠĠĠ ĠTokenType . Other . Boolean Token Ġ-> Ġtoken . to Boolean OrNull () ĊĠĠĠĠĠĠĠ ĠTokenType . Other . Em ote Token Ġ-> ĠEm ote . from ( token , Ġevt . guild ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . to Boolean OrNull () Ġ= Ġif Ġ( this Ġ== Ġ" true " Ġ|| Ġthis Ġ== Ġ" false ") Ġto Boolean () Ġelse Ġnull ĊĊĠĠĠ Ġprivate Ġfun ĠGuild . get Member By Mention ( mention : ĠString ): ĠMember ? Ġ= ĊĠĠĠĠĠĠĠ Ġget Member ById ( mention . remove Sur rounding ("< @ ", Ġ"> "). remove Prefix (" ! ")) ĊĊĠĠĠ Ġprivate Ġfun ĠJ DA . getUser By Mention ( mention : ĠString ): ĠUser ? Ġ= ĊĠĠĠĠĠĠĠ Ġretrieve User ById ( mention . remove Sur rounding ("< @ ", Ġ"> "). remove Prefix (" ! ")). complete () ĊĊĠĠĠ Ġprivate Ġfun ĠGuild . getText Channel By Mention ( mention : ĠString ): ĠText Channel ? Ġ= ĊĠĠĠĠĠĠĠ ĠgetText Channel ById ( mention . remove Sur rounding ("< # ", Ġ"> ")) ĊĊĠĠĠ Ġprivate Ġfun ĠGuild . get Role By Mention ( mention : ĠString ): ĠRole ? Ġ= ĊĠĠĠĠĠĠĠ Ġget Role ById ( mention . remove Sur rounding ("< @ & ", Ġ"> ")) Ċ } Ċ Ċ internal Ġsealed Ġclass ĠTokenType ( val Ġname : ĠString , Ġval Ġsignature : ĠRegex ) Ġ{ ĊĠĠĠ Ġsealed Ġclass ĠNumber ( name : ĠString , Ġsignature : ĠRegex ) Ġ: ĠTokenType ( name , Ġsignature ) Ġ{ ĊĠĠĠĠĠĠĠ Ġobject ĠByte Token Ġ: ĠNumber (" Byte ", Ġ"[ +- ]? \\ d { 1 , 3 }? ". to Regex ()) ĊĠĠĠĠĠĠĠ Ġobject ĠShort Token Ġ: ĠNumber (" Short ", Ġ"[ +- ]? \\ d { 1 , 5 }? ". to Regex ()) ĊĠĠĠĠĠĠĠ Ġobject ĠInt Token Ġ: ĠNumber (" Int ", Ġ"[ +- ]? \\ d { 1 , 1 0 }? ". to Regex ()) ĊĠĠĠĠĠĠĠ Ġobject ĠLong Token Ġ: ĠNumber (" Long ", Ġ"[ +- ]? \\ d { 1 , 1 9 }? L ? ". to Regex ()) ĊĠĠĠĠĠĠĠ Ġobject ĠBigInt Token Ġ: ĠNumber (" BigInt ", Ġ"[ +- ]? \\ d + ? ". to Regex ()) ĊĠĠĠĠĠĠĠ Ġobject ĠFloat Token Ġ: ĠNumber (" Float ", Ġ"[ +- ] ?( ?: \\ d * \\. \\ d + | \\ d + \\. ? )( ?: [ e E ]\\ d + )? [ f F ]? ". to Regex ()) ĊĠĠĠĠĠĠĠ Ġobject ĠDouble Token Ġ: ĠNumber (" Double ", Ġ"[ +- ] ?( ?: \\ d * \\. \\ d + | \\ d + \\. ? )( ?: [ e E ]\\ d + )? ". to Regex ()) ĊĠĠĠĠĠĠĠ Ġobject ĠBigDecimal Token Ġ: ĠNumber (" BigDecimal ", Ġ"[ +- ] ?( ?: \\ d * \\. \\ d + | \\ d + \\. ? )( ?: [ e E ]\\ d + )? ". to Regex ()) ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Opt In ( Experimental Std lib Api :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Associations Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtypeOf < Byte >() Ġto ĠByte Token , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtypeOf < Short >() Ġto ĠShort Token , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtypeOf < Int >() Ġto ĠInt Token , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtypeOf < Long >() Ġto ĠLong Token , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtypeOf < BigInteger >() Ġto ĠBigInt Token , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtypeOf < Float >() Ġto ĠFloat Token , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtypeOf < Double >() Ġto ĠDouble Token , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtypeOf < BigDecimal >() Ġto ĠBigDecimal Token ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsealed Ġclass ĠJ da ( name : ĠString , Ġsignature : ĠRegex ) Ġ: ĠTokenType ( name , Ġsignature ) Ġ{ ĊĠĠĠĠĠĠĠ Ġobject ĠUser Token Ġ: ĠJ da (" User ", Ġ"< @ ! ? \\ d + >| \\ d +". to Regex ()) ĊĠĠĠĠĠĠĠ Ġobject ĠMember Token Ġ: ĠJ da (" Member ", Ġ"< @ ! ? \\ d + >| \\ d +". to Regex ()) ĊĠĠĠĠĠĠĠ Ġobject ĠText Channel Token Ġ: ĠJ da (" Channel ", Ġ"< # \\ d + >| \\ d +". to Regex ()) ĊĠĠĠĠĠĠĠ Ġobject ĠRole Token Ġ: ĠJ da (" Role ", Ġ"< @ & \\ d + >| \\ d +". to Regex ()) ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Opt In ( Experimental Std lib Api :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Associations Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtypeOf < User >() Ġto ĠUser Token , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtypeOf < Member >() Ġto ĠMember Token , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtypeOf < Text Channel >() Ġto ĠText Channel Token , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtypeOf < Message Channel >() Ġto ĠText Channel Token , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtypeOf < Role >() Ġto ĠRole Token ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsealed Ġclass ĠOther ( name : ĠString , Ġsignature : ĠRegex ) Ġ: ĠTokenType ( name , Ġsignature ) Ġ{ ĊĠĠĠĠĠĠĠ Ġobject ĠEm ote Token Ġ: ĠOther (" Em ote ", Ġ"< a ?: \\ S + :\\ d + >| \\ d + |[ \\ uD 8 3 C - \\ u DB FF \\ u DC 0 0 - \\ uD FFF ]+ ". to Regex ()) ĊĠĠĠĠĠĠĠ Ġobject ĠString Token Ġ: ĠOther (" String ", Ġ"\\ S +". to Regex ()) ĊĠĠĠĠĠĠĠ Ġobject ĠLong String Token Ġ: ĠOther (" Long String ", Ġ". + ? ". to Regex ()) ĊĠĠĠĠĠĠĠ Ġobject ĠBoolean Token Ġ: ĠOther (" Boolean ", Ġ" true | false ". to Regex ()) ĊĠĠĠĠĠĠĠ Ġobject ĠChar Token Ġ: ĠOther (" Char ", Ġ"\\ S ". to Regex ()) ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Opt In ( Experimental Std lib Api :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Associations Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtypeOf < Em ote >() Ġto ĠEm ote Token , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtypeOf < String >() Ġto ĠString Token , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtypeOf < Long String >() Ġto ĠLong String Token , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtypeOf < Boolean >() Ġto ĠBoolean Token , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtypeOf < Char >() Ġto ĠChar Token ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġfrom ( type : ĠK Type ): ĠTokenType ? Ġ= Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠNumber . type Associations Ġ-> ĠNumber . type Associations [ type ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠJ da . type Associations Ġ-> ĠJ da . type Associations [ type ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠOther . type Associations Ġ-> ĠOther . type Associations [ type ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠList < TokenType >. signature () Ġ= Ġif Ġ( isEmpty ()) Ġ"" Ġelse Ġjoin ToString (" Ġ") Ġ{ Ġ" (${ it . signature . pattern })" Ġ} Ċ