4242import java .util .Date ;
4343import java .util .HashMap ;
4444import java .util .Map ;
45+ import java .util .StringJoiner ;
4546import java .util .concurrent .TimeUnit ;
4647import java .util .regex .Matcher ;
4748import java .util .regex .Pattern ;
@@ -53,11 +54,14 @@ public class ServerExpansion extends PlaceholderExpansion implements Cacheable,
5354 private Object craftServer ;
5455 private Field tps ;
5556 private String version ;
56- private String serverName = null ;
57+ private final String variant ;
58+
59+ // config stuff
60+ private String serverName ;
5761 private String low = "&c" ;
5862 private String medium = "&e" ;
5963 private String high = "&a" ;
60- private String variant ;
64+ // -----
6165
6266 private final Cache <String , Integer > cache = Caffeine .newBuilder ()
6367 .expireAfterWrite (1 , TimeUnit .MINUTES )
@@ -66,18 +70,20 @@ public class ServerExpansion extends PlaceholderExpansion implements Cacheable,
6670 private final String VERSION = getClass ().getPackage ().getImplementationVersion ();
6771
6872 public ServerExpansion () {
73+ this .version = Bukkit .getServer ().getClass ().getPackage ().getName ().split ("\\ ." )[3 ];
74+
6975 try {
70- version = Bukkit .getServer ().getClass ().getPackage ().getName ().split ("\\ ." )[3 ];
7176 if (minecraftVersion () >= 17 ) {
7277 craftServer = Class .forName ("net.minecraft.server.MinecraftServer" ).getMethod ("getServer" ).invoke (null );
7378 } else {
7479 craftServer = Class .forName ("net.minecraft.server." + version + ".MinecraftServer" ).getMethod ("getServer" ).invoke (null );
7580 }
7681 tps = craftServer .getClass ().getField ("recentTps" );
77- variant = initializeVariant ();
7882 } catch (Exception e ) {
7983 e .printStackTrace ();
8084 }
85+
86+ this .variant = ServerUtils .getServerVariant ();
8187 }
8288
8389 @ Override
@@ -114,30 +120,6 @@ public void clear() {
114120 return VERSION ;
115121 }
116122
117- public String initializeVariant () {
118- try {
119- Class .forName ("net.pl3x.purpur.PurpurConfig" );
120- return "Purpur" ;
121- } catch (ClassNotFoundException e ) {
122- try {
123- Class .forName ("com.tuinity.tuinity.config.TuinityConfig" );
124- return "Tuinity" ;
125- } catch (ClassNotFoundException e1 ) {
126- try {
127- Class .forName ("com.destroystokyo.paper.PaperConfig" );
128- return "Paper" ;
129- } catch (ClassNotFoundException e2 ) {
130- try {
131- Class .forName ("org.spigotmc.SpigotConfig" );
132- return "Spigot" ;
133- } catch (ClassNotFoundException e3 ) {
134- return "Unknown" ;
135- }
136- }
137- }
138- }
139- }
140-
141123 @ Override
142124 public Map <String , Object > getDefaults () {
143125 final Map <String , Object > defaults = new HashMap <>();
@@ -153,25 +135,25 @@ public String onRequest(OfflinePlayer p, String identifier) {
153135 final int MB = 1048576 ;
154136
155137 switch (identifier ) {
156- case "name" :
157- return serverName == null ? "" : serverName ;
158- case "variant" :
159- return variant ;
160- case "tps" :
161- return getTps (null );
138+ // Players placeholders
162139 case "online" :
163140 return String .valueOf (Bukkit .getOnlinePlayers ().size ());
164141 case "max_players" :
165142 return String .valueOf (Bukkit .getMaxPlayers ());
166143 case "unique_joins" :
167144 return String .valueOf (Bukkit .getOfflinePlayers ().length );
168- case "uptime" :
169- long seconds = TimeUnit .MILLISECONDS .toSeconds (ManagementFactory .getRuntimeMXBean ().getUptime ());
170- return formatTime (Duration .of (seconds , ChronoUnit .SECONDS ));
171- case "has_whitelist" :
172- return Bukkit .getServer ().hasWhitelist () ? PlaceholderAPIPlugin .booleanTrue () : PlaceholderAPIPlugin .booleanFalse ();
145+ // -----
146+
147+ // Version placeholders
173148 case "version" :
174- return Bukkit .getBukkitVersion ().split ("-" )[0 ];
149+ return ServerUtils .VERSION ;
150+ case "build" :
151+ return ServerUtils .BUILD ;
152+ case "version_build" :
153+ return ServerUtils .VERSION + '-' + ServerUtils .BUILD ;
154+ // -----
155+
156+ // Ram placeholders
175157 case "ram_used" :
176158 return String .valueOf ((runtime .totalMemory () - runtime .freeMemory ()) / MB );
177159 case "ram_free" :
@@ -180,12 +162,29 @@ public String onRequest(OfflinePlayer p, String identifier) {
180162 return String .valueOf (runtime .totalMemory () / MB );
181163 case "ram_max" :
182164 return String .valueOf (runtime .maxMemory () / MB );
165+ // -----
166+
167+ // Identity placeholders
168+ case "name" :
169+ return serverName == null ? "" : serverName ;
170+ case "variant" :
171+ return variant ;
172+ // -----
173+
174+ // Other placeholders
175+ case "tps" :
176+ return getTps (null );
177+ case "uptime" :
178+ long seconds = TimeUnit .MILLISECONDS .toSeconds (ManagementFactory .getRuntimeMXBean ().getUptime ());
179+ return formatTime (Duration .of (seconds , ChronoUnit .SECONDS ));
183180 case "total_chunks" :
184181 return String .valueOf (cache .get ("chunks" , k -> getChunks ()));
185182 case "total_living_entities" :
186183 return String .valueOf (cache .get ("livingEntities" , k -> getLivingEntities ()));
187184 case "total_entities" :
188185 return String .valueOf (cache .get ("totalEntities" , k -> getTotalEntities ()));
186+ case "has_whitelist" :
187+ return Bukkit .getServer ().hasWhitelist () ? PlaceholderAPIPlugin .booleanTrue () : PlaceholderAPIPlugin .booleanFalse ();
189188 }
190189
191190 if (identifier .startsWith ("tps_" )) {
@@ -322,14 +321,15 @@ public String getTps(String arg) {
322321 case "15_colored" :
323322 case "fifteen_colored" :
324323 return getColoredTps (tps ()[2 ]);
325- case "percent" :
326- StringBuilder sb = new StringBuilder ();
324+ case "percent" : {
325+ final StringJoiner joiner = new StringJoiner (ChatColor .GRAY + ", " );
326+
327327 for (double t : tps ()) {
328- sb .append (getColoredTpsPercent (t ))
329- .append (ChatColor .GRAY )
330- .append (", " );
328+ joiner .add (getColoredTpsPercent (t ));
331329 }
332- return sb .toString ();
330+
331+ return joiner .toString ();
332+ }
333333 case "1_percent" :
334334 case "one_percent" :
335335 return getPercent (tps ()[0 ]);
0 commit comments