package Ġcom . ill uz ion z stud ios . mist . util Ċ Ċ import Ġcom . google . gson . Gson Builder Ċ import Ġcom . ill uz ion z stud ios . mist . util . UUID Fetcher Ċ import Ġcom . moj ang . util . UUID Type Adapter Ċ import Ġjava . io .* Ċ import Ġjava . net . Http URLConnection Ċ import Ġjava . net . URL Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . function . Consumer Ċ Ċ /** Ċ Ġ* ĠExternal ĠUUID Ġlibrary Ġincluded Ġfor Ġour Ġplugin . ĠRuns ĠAsync Ċ Ġ*/ Ċ class ĠUUID Fetcher ( ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCached Ġname ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġname : ĠString ? Ġ= Ġnull , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCached Ġ[ UUID ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġid : ĠUUID ? Ġ= Ġnull Ċ ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġgson Ġ= ĠGson Builder (). register Type Adapter ( UUID :: class . java , ĠUUID Type Adapter ()). create () ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠUUID _ URL Ġ= Ġ" https :// api . moj ang . com / users / profiles / minecraft /% s ? at =% d " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNAME _ URL Ġ= Ġ" https :// api . moj ang . com / user / profiles /% s / names " ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġuuid Cache : ĠMutable Map < String , ĠUUID ?> Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġname Cache : ĠMutable Map < UUID ?, ĠString ?> Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpool Ġ= ĠExec utors . new Cached ThreadPool () ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠF etches Ġthe Ġuuid Ġasynchronously Ġand Ġpasses Ġit Ġto Ġthe Ġconsumer ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġname ĠĠ ĠThe Ġname ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġaction ĠDo Ġwhat Ġyou Ġwant Ġto Ġdo Ġwith Ġthe Ġuuid Ġher ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget UUID ( name : ĠString , Ġaction : ĠConsumer < UUID ?> ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpool . execute Ġ{ Ġaction . accept ( get UUID ( name )) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠF etches Ġthe Ġuuid Ġsynchronous ly Ġand Ġreturns Ġit ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġname ĠThe Ġname ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠThe Ġuuid ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget UUID ( name : ĠString ): ĠUUID ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget UUID At ( name , ĠSystem . currentTimeMillis ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠF etches Ġthe Ġuuid Ġsynchronous ly Ġfor Ġa Ġspecified Ġname Ġand Ġtime Ġand Ġpasses Ġthe Ġresult Ġto Ġthe Ġconsumer ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġname ĠĠĠĠĠ ĠThe Ġname ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtimestamp ĠTime Ġwhen Ġthe Ġplayer Ġhad Ġthis Ġname Ġin Ġmilliseconds ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġaction ĠĠĠ ĠDo Ġwhat Ġyou Ġwant Ġto Ġdo Ġwith Ġthe Ġuuid Ġher ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget UUID At ( name : ĠString , Ġtimestamp : ĠLong , Ġaction : ĠConsumer < UUID ?> ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpool . execute Ġ{ Ġaction . accept ( get UUID At ( name , Ġtimestamp )) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠF etches Ġthe Ġuuid Ġsynchronous ly Ġfor Ġa Ġspecified Ġname Ġand Ġtime ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġname ĠĠĠĠĠ ĠThe Ġname ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtimestamp ĠTime Ġwhen Ġthe Ġplayer Ġhad Ġthis Ġname Ġin Ġmilliseconds ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget UUID At ( name : ĠString , Ġtimestamp : ĠLong ): ĠUUID ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġname Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname . lowercase ( Locale . getDefault ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uuid Cache . containsKey ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġuuid Cache [ name ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠURL ( String . format ( UUID _ URL , Ġname , Ġtimestamp Ġ/ Ġ 1 0 0 0 )). open Connection () Ġas ĠHttp URLConnection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . read Timeout Ġ= Ġ 5 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgson . fromJson ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBufferedReader ( InputStream Reader ( connection . inputStream )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUUID Fetcher :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuuid Cache [ name ] Ġ= Ġdata . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Cache [ data . id ] Ġ= Ġdata . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdata . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠF etches Ġthe Ġname Ġasynchronously Ġand Ġpasses Ġit Ġto Ġthe Ġconsumer ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġuuid ĠĠ ĠThe Ġuuid ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġaction ĠDo Ġwhat Ġyou Ġwant Ġto Ġdo Ġwith Ġthe Ġname Ġher ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun ĠgetName ( uuid : ĠUUID ?, Ġaction : ĠConsumer < String ?> ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpool . execute Ġ{ Ġaction . accept ( getName ( uuid )) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠF etches Ġthe Ġname Ġsynchronous ly Ġand Ġreturns Ġit ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġuuid ĠThe Ġuuid ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠThe Ġname ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun ĠgetName ( uuid : ĠUUID ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name Cache . containsKey ( uuid )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġname Cache [ uuid ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠURL ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNAME _ URL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUUID Type Adapter . from UUID ( uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). open Connection () Ġas ĠHttp URLConnection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . read Timeout Ġ= Ġ 5 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname History Ġ= Ġgson . fromJson ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBufferedReader ( InputStream Reader ( connection . inputStream )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArray < UUID Fetcher >:: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Name Data Ġ= Ġname History [ name History . size Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuuid Cache [ current Name Data . name !!. lowercase ( Locale . getDefault ()) ] Ġ= Ġuuid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Cache [ uuid ] Ġ= Ġcurrent Name Data . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcurrent Name Data . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }