package Ġme . min id ig ger . subscribe 4 whitelist Ċ Ċ import Ġcom . google . common . reflect . Type Token Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . google . gson . Gson Builder Ċ import Ġorg . bukkit . Bu kkit Ċ import Ġorg . bukkit . plugin . java . Java Plugin Ċ import Ġjava . io . File Ċ import Ġjava . io . FileReader Ċ import Ġjava . io . FileWriter Ċ import Ġjava . io . Reader Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . ExecutorService Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . collections . ArrayList Ċ Ċ class ĠSubscribe 4 Whitelist Ġ: ĠJava Plugin () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdata Providers Ġ= ĠlistOf ( Pat re on DataProvider (), ĠTw itch DataProvider ()) ĊĠĠĠ Ġprivate Ġvar Ġsubs Ġ= ĠlistOf < Subscriber >() ĊĠĠĠ Ġprivate Ġval Ġgson Ġ= ĠGson Builder (). set Pretty Print ing (). create () ĊĠĠĠ Ġprivate Ġval Ġsub File Ġ= ĠFile ( data Folder , Ġ" subs . json ") ĊĊĠĠĠ Ġoverride Ġfun Ġon Enable () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġcreate Ġdefault Ġstuff ĊĠĠĠĠĠĠĠ Ġsave Default Config () ĊĠĠĠĠĠĠĠ Ġif (! sub File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Writer ( sub File ). use Ġ{ Ġgson . toJson ( subs , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġload Ġsubs ĊĠĠĠĠĠĠĠ ĠFileReader ( sub File ). use Ġ{ Ġsubs Ġ= Ġgson . fromJson < List < Subscriber >>( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġstart Ġfetch Ġtask ĊĠĠĠĠĠĠĠ Ġserver . scheduler . run Task Timer ( this , Ġ{ Ġfetch () Ġ}, Ġ 0 , Ġconfig . getLong (" fetch - interval ", Ġ 3 0 0 )) ĊĠĠĠĠĠĠĠ Ġ// Ġsetup Ġproviders ĊĠĠĠĠĠĠĠ Ġdata Providers . forEach Ġ{ Ġit . setup ( config , Ġlogger ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfetch () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfetched Sub s Ġ= Ġdata Providers . p map Ġ{ Ġprovider Ġ-> Ġprovider . fetch Current Sub scribers () Ġ}. flatten (). toList () ĊĠĠĠĠĠĠĠ Ġval Ġnew Sub s Ġ= Ġfetched Sub s . to Mutable List () ĊĠĠĠĠĠĠĠ Ġval Ġlost Sub s Ġ= Ġsubs . to Mutable List () ĊĠĠĠĠĠĠĠ Ġnew Sub s . removeAll ( subs ) ĊĠĠĠĠĠĠĠ Ġlost Sub s . removeAll ( f etched Sub s ) ĊĊĠĠĠĠĠĠĠ Ġsubs Ġ= Ġfetched Sub s ĊĊĠĠĠĠĠĠĠ Ġif Ġ( new Sub s . size Ġ> Ġ 0 ) Ġlogger . info (" Found Ġ${ new Sub s . size } Ġnew Ġsubs !") ĊĠĠĠĠĠĠĠ Ġif Ġ( lost Sub s . size Ġ> Ġ 0 ) Ġlogger . info (" Lost Ġ${ new Sub s . size } Ġsubs !") ĊĊĠĠĠĠĠĠĠ Ġnew Sub s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBu kkit . broadcast Message ( config . getString (" new - sub - msg ", Ġ"% 1 Ġjust Ġsubscribed Ġon Ġ% 2 Ġfor Ġ% 3 !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ("% 1 ", Ġit . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ("% 2 ", Ġit . source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ("% 3 ", Ġ"${ ( it . amount In Cent Ġ* Ġ 1 0 0 . 0 )} Ġbu cks ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlost Sub s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBu kkit . broadcast Message ( config . getString (" lost - sub - msg ", Ġ"% 1 Ġjust Ġun subscribed Ġ& 2 !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ("% 1 ", Ġit . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ("% 2 ", Ġit . source )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠFile Writer ( sub File ). use Ġ{ Ġgson . toJson ( subs , Ġit ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T , ĠR > ĠIterable < T >. p map ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnum Threads : ĠInt Ġ= ĠRuntime . get Runtime (). available Processors () Ġ- Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexec : ĠExecutor Service Ġ= ĠExec utors . new Fixed ThreadPool ( num Threads ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransform : Ġ( T ) Ġ-> ĠR ): ĠList < R > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġdefault Size Ġ= Ġif Ġ( this Ġis ĠCollection <* >) Ġthis . size Ġelse Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġval Ġdestination Ġ= ĠCollections . synchronized List ( ArrayList < R >( default Size )) ĊĊĠĠĠĠĠĠĠ Ġthis . forEach Ġ{ Ġitem Ġ-> Ġexec . submit Ġ{ Ġdestination . add ( transform ( item )) Ġ} Ġ} ĊĊĠĠĠĠĠĠĠ Ġexec . shutdown () ĊĠĠĠĠĠĠĠ Ġexec . await Termination ( 2 , ĠTimeUnit . MIN UTES ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠArrayList < R >( destination ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT > ĠGson . fromJson ( reader : ĠReader ) Ġ= Ġthis . fromJson < T >( reader , Ġobject Ġ: ĠType Token < T >() Ġ{} . type ) Ċ } Ċ