package Ġdev . theme iner lp . skin server . service Ċ Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġdev . theme iner lp . skin server . config . Skin Server Config Ċ import Ġdev . theme iner lp . skin server . model . Game Profile Holder Ċ import Ġio . github . bucket 4 j . Bandwidth Ċ import Ġio . github . bucket 4 j . Bucket 4 j Ċ import Ġio . github . bucket 4 j . Ref ill Ċ import Ġio . github . bucket 4 j . local . Local Bucket Ċ import Ġorg . apache . http . client . config . Request Config Ċ import Ġorg . apache . http . client . methods . HttpGet Ċ import Ġorg . apache . http . impl . client . Closeable HttpClient Ċ import Ġorg . apache . http . impl . client . HttpClient s Ċ import Ġorg . springframework . beans . factory . annotation . Qualifier Ċ import Ġorg . springframework . http . HttpStatus Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġorg . springframework . web . server . ResponseStatus Exception Ċ import Ġjava . net . Inet Address Ċ import Ġjava . time . Duration Ċ import Ġjava . util . UUID ; Ċ import Ġkotlin . collections . HashMap Ċ Ċ @ Service Ċ class ĠGame Profile Service ( ĊĠĠĠ Ġ@ Qualifier (" skin Server Config ") ĊĠĠĠ Ġval Ġconfig : ĠSk in Server Config , ĊĠĠĠ Ġval Ġmapper : ĠObjectMapper Ċ ) Ġ{ ĊĊĠĠĠ Ġval ĠhttpClient : ĠClose able HttpClient Ġ= ĠHttpClient s . create Default () ĊĠĠĠ Ġval Ġuuid Regex : ĠRegex Ġ= ĠRegex (" ([ 0 - 9 a - fA - F ]{ 8 }) ([ 0 - 9 a - fA - F ]{ 4 }) ([ 0 - 9 a - fA - F ]{ 4 }) ([ 0 - 9 a - fA - F ]{ 4 }) ([ 0 - 9 a - fA - F ]+ )") ĊĠĠĠ Ġval Ġip Left : ĠMutable Map < String , ĠLocal Bucket > Ġ= ĠHashMap () ĊĠĠĠ Ġprivate Ġfinal Ġval Ġlimit : ĠBand width ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġref ill Ġ= ĠRe fill . inter v ally ( 6 0 0 , ĠDuration . of Minutes ( 1 0 )) ĊĠĠĠĠĠĠĠ Ġlimit Ġ= ĠBand width . classic ( 6 0 0 , Ġref ill ) ĊĠĠĠĠĠĠĠ Ġval Ġbucket Ġ= ĠBucket 4 j . builder (). add Limit ( limit ). build () ĊĠĠĠĠĠĠĠ Ġthis . config . connection Addresses !!. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . ip Left [ it ] Ġ= Ġbucket ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġfind Game Profile ( username : ĠString ): ĠGame Profile Holder ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġget Request Ġ= ĠHttp Get (" https :// api . moj ang . com / users / profiles / minecraft /${ username }") ĊĠĠĠĠĠĠĠ Ġget Request . config Ġ= ĠRequest Config ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. custom () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Redirect s Enabled ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Local Address ( Inet Address . get ByName ( getLocal Address ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Connect Timeout ( 3 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġget Request . setHeader (" User - Agent ", Ġ" Minecraft - Skin Server ") ĊĠĠĠĠĠĠĠ ĠhttpClient . execute ( getRequest ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . status Line . statusCode Ġ!= Ġ 2 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠResponse Status Exception ( HttpStatus . BAND WIDTH _ LIMIT _ EX CE EDED , Ġ" Mo j ang Ġhas Ġprobably Ġblocked Ġyou Ġ: (" ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġmapper . read Tree ( it . entity . content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprofile Ġ= ĠGame Profile Holder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew UUID Ġ= Ġnode . get (" id "). as Text (). replace First ( uuid Regex , Ġ"$ 1 -$ 2 -$ 3 -$ 4 -$ 5 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprofile . uuid Ġ= ĠUUID . fromString ( new UUID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprofile . name Ġ= Ġnode . get (" name "). as Text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġprofile ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Game Profile ( uuid : ĠUUID ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġget Request Ġ= ĠHttp Get (" https :// session server . moj ang . com / session / minecraft / profile /$ uuid ") ĊĠĠĠĠĠĠĠ Ġget Request . config Ġ= ĠRequest Config ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. custom () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Redirect s Enabled ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Local Address ( Inet Address . get ByName ( getLocal Address ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Connect Timeout ( 3 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġget Request . setHeader (" User - Agent ", Ġ" Minecraft - Skin Server ") ĊĠĠĠĠĠĠĠ ĠhttpClient . execute ( getRequest ). use Ġ{ Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . status Line . statusCode Ġ!= Ġ 2 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠResponse Status Exception ( HttpStatus . BAND WIDTH _ LIMIT _ EX CE EDED , Ġ" Mo j ang Ġhas Ġprobably Ġblocked Ġyou Ġ: (" ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . entity . content . use Ġ{ Ġiss Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġiss . read Bytes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠString ( content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Texture FromJson ( text : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġmapper . read Tree ( text ) ĊĠĠĠĠĠĠĠ Ġif Ġ( node . has (" properties ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnode . get (" properties "). find Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . has (" name ") Ġ&& Ġit . get (" name "). as Text (). equals (" textures ", Ġignore Case Ġ= Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit . get (" value "). as Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠResponse Status Exception ( HttpStatus . BAD _ REQUEST , Ġ" Player Ġhave Ġno Ġskin Ġvalue !! !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} !!. as Text () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠResponse Status Exception ( HttpStatus . BAD _ REQUEST , Ġ" Player Ġhave Ġno Ġproperties Ġvalue !! !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun ĠgetName FromJson ( text : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġmapper . read Tree ( text ) ĊĠĠĠĠĠĠĠ Ġif Ġ( node . has (" name ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnode . get (" name "). as Text () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠResponse Status Exception ( HttpStatus . BAD _ REQUEST , Ġ" Player Ġhave Ġno Ġname Ġvalue !! !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġget Local Address (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpair Ġ= Ġthis . ip Left . toList (). sorted By Ġ{ Ġ(_, Ġvalue ) Ġ-> Ġvalue . available Tokens Ġ}. first () ĊĠĠĠĠĠĠĠ Ġprintln ("${ pair . second . available Tokens } ĠTokens Ġleft Ġfor Ġ 1 0 ĠMin Ġfor : Ġ${ pair . first }") ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( pair . second . try Consume ( 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpair . first ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠResponse Status Exception ( HttpStatus . BAND WIDTH _ LIMIT _ EX CE EDED , Ġ" No ĠTokens Ġleft Ġfor ĠIP Ġ${ pair . first }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdownload Url To ByteArray ( url : ĠString ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġget Request Ġ= ĠHttp Get ( url ) ĊĠĠĠĠĠĠĠ Ġget Request . config Ġ= ĠRequest Config ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. custom () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Redirect s Enabled ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Local Address ( Inet Address . get ByName ( getLocal Address ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Connect Timeout ( 3 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġget Request . setHeader (" User - Agent ", Ġ" Minecraft - Skin Server ") ĊĠĠĠĠĠĠĠ ĠhttpClient . execute ( getRequest ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . status Line . statusCode Ġ!= Ġ 2 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Mo j ang Ġhas Ġprobably Ġblocked Ġyou Ġ: (" ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit . entity . content . read Bytes () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }