package Ġme . t ass u . features . misc Ċ Ċ import Ġcom . google . inject . Inject Ċ import Ġcom . google . inject . Singleton Ċ import Ġme . t ass u . internal . db . table . tables . User Cache Table Ċ import Ġme . t ass u . internal . feature . Feature Ċ import Ġorg . spongepowered . api . event . Listener Ċ import Ġorg . spongepowered . api . event . network . Client Connection Event Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġcom . google . common . cache . Cache Builder Ċ import Ġcom . google . common . cache . Cache Loader Ċ import Ġcom . google . common . cache . Loading Cache Ċ import Ġme . t ass u . internal . feature . Simple Feature Ċ import Ġorg . spongepowered . api . Game Ċ import Ġjava . net . Inet Address Ċ Ċ @ Singleton Ċ class ĠUser Data Feature Ġ: ĠSimple Feature () Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġid : ĠString Ġ= Ġ" user _ data " ĊĊĠĠĠ Ġoverride Ġval Ġlisteners : ĠList < Any > Ġ= ĠlistOf () ĊĠĠĠ Ġoverride Ġval Ġpermissions : ĠList < String > Ġ= ĠlistOf () ĊĠĠĠ Ġoverride Ġval Ġdependencies : ĠList < String > Ġ= ĠlistOf () ĊĊĠĠĠ Ġ@ Inject Ġlateinit Ġvar Ġtable : ĠUser Cache Table ĊĠĠĠ Ġ@ Inject Ġlateinit Ġvar Ġgame : ĠGame ĊĊĠĠĠ Ġ@ Listener ĊĠĠĠ Ġfun Ġon Join ( event : ĠClient Connection Event . Login ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuuid Ġ= Ġevent . profile . unique Id ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġevent . profile . name . orElse (" No Ġknown Ġname .") ĊĠĠĠĠĠĠĠ Ġval Ġip Ġ= Ġevent . connection . address . address ĊĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠUser Cache Table . UserData ( name , Ġip , Ġuuid ) ĊĠĠĠĠĠĠĠ Ġtable . update ( data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Listener ĊĠĠĠ Ġfun Ġon Quit ( event : ĠClient Connection Event . Disconnect ) Ġ{ ĊĠĠĠĠĠĠĠ Ġname Cache . invalidate ( event . target Entity . name ) ĊĠĠĠĠĠĠĠ Ġip Cache . invalidate ( event . target Entity . connection . virtual Host . address ) ĊĠĠĠĠĠĠĠ Ġuuid Cache . invalidate ( event . target Entity . unique Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġuuid Cache : ĠLoading Cache < UUID , ĠUser Cache Table . UserData > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠCache Builder . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. maximum Size ( game . server . max Players . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. expire After Access ( 5 , ĠTimeUnit . MIN UTES ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ( object Ġ: ĠCache Loader < UUID , ĠUser Cache Table . UserData >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġload ( uuid : ĠUUID ?): ĠUser Cache Table . UserData ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uuid Ġ== Ġnull ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtable . query User By UUID ( uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġname Cache : ĠLoading Cache < String , ĠUUID > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠCache Builder . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. maximum Size ( game . server . max Players . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. expire After Access ( 5 , ĠTimeUnit . MIN UTES ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ( object Ġ: ĠCache Loader < String , ĠUUID >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġload ( name : ĠString ): ĠUUID ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġload Ġ= Ġtable . query User ByName ( name ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuuid Cache . put ( load . uuid , Ġload ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġload . uuid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġip Cache : ĠLoading Cache < Inet Address , ĠUUID > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠCache Builder . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. maximum Size ( game . server . max Players . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. expire After Access ( 5 , ĠTimeUnit . MIN UTES ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ( object Ġ: ĠCache Loader < Inet Address , ĠUUID >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġload ( ip : ĠInet Address ): ĠUUID ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġload Ġ= Ġtable . query User By Ip ( ip ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuuid Cache . put ( load . uuid , Ġload ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġload . uuid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclear Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġuuid Cache . clean Up () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġquery User By UUID ( uuid : ĠUUID ): ĠUser Cache Table . UserData ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġuuid Cache . get ( uuid ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġquery User ByName ( name : ĠString ) Ġ: ĠUser Cache Table . UserData ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġuuid Cache . get ( name Cache . get ( name )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġquery User By Ip ( ip : ĠInet Address ) Ġ: ĠUser Cache Table . UserData ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġuuid Cache . get ( ip Cache . get ( ip )) ĊĠĠĠ Ġ} Ċ Ċ } Ċ