From 9f038fae63ea71336ad5cbccecebaed0440b2326 Mon Sep 17 00:00:00 2001 From: NEZNAMY Date: Thu, 27 Feb 2025 18:21:49 +0100 Subject: [PATCH] [Placeholders] Allow placeholder refresh intervals to define overrides for internal placeholders --- .../bukkit/platform/BukkitPlatform.java | 29 ++++---- .../bukkit/platform/FoliaPlatform.java | 4 +- .../tab/platforms/fabric/FabricPlatform.java | 3 +- .../tab/shared/backend/BackendPlatform.java | 14 ++-- .../neznamy/tab/shared/config/Converter.java | 1 + .../tab/shared/config/files/Config.java | 2 +- .../features/PlaceholderManagerImpl.java | 69 +++++++++++++------ .../features/bossbar/BossBarManagerImpl.java | 2 +- .../globalplayerlist/GlobalPlayerList.java | 2 +- .../features/nametags/CollisionManager.java | 2 +- .../nametags/VisibilityRefresher.java | 2 +- .../shared/features/proxy/ProxySupport.java | 6 +- .../features/sorting/types/Permissions.java | 2 +- .../PlaceholderRefreshConfiguration.java | 32 ++++++++- .../UniversalPlaceholderRegistry.java | 67 +++++++++--------- .../placeholders/conditions/Condition.java | 2 +- .../tab/shared/proxy/ProxyPlatform.java | 6 +- shared/src/main/resources/config/config.yml | 2 +- 18 files changed, 147 insertions(+), 100 deletions(-) diff --git a/bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/platform/BukkitPlatform.java b/bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/platform/BukkitPlatform.java index 7e6d14535..44063f3ee 100644 --- a/bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/platform/BukkitPlatform.java +++ b/bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/platform/BukkitPlatform.java @@ -252,20 +252,18 @@ public void loadPlayers() { @Override public void registerPlaceholders() { PlaceholderManagerImpl manager = TAB.getInstance().getPlaceholderManager(); - manager.registerServerPlaceholder("%vault-prefix%", -1, () -> ""); - manager.registerServerPlaceholder("%vault-suffix%", -1, () -> ""); + manager.registerInternalServerPlaceholder("%vault-prefix%", -1, () -> ""); + manager.registerInternalServerPlaceholder("%vault-suffix%", -1, () -> ""); if (Bukkit.getPluginManager().isPluginEnabled("Vault")) { RegisteredServiceProvider rspChat = Bukkit.getServicesManager().getRegistration(Chat.class); if (rspChat != null) { Chat chat = rspChat.getProvider(); - int refresh = TAB.getInstance().getConfiguration().getConfig().getPermissionRefreshInterval(); - manager.registerPlayerPlaceholder("%vault-prefix%", refresh, p -> chat.getPlayerPrefix((Player) p.getPlayer())); - manager.registerPlayerPlaceholder("%vault-suffix%", refresh, p -> chat.getPlayerSuffix((Player) p.getPlayer())); + manager.registerInternalPlayerPlaceholder("%vault-prefix%", 1000, p -> chat.getPlayerPrefix((Player) p.getPlayer())); + manager.registerInternalPlayerPlaceholder("%vault-suffix%", 1000, p -> chat.getPlayerSuffix((Player) p.getPlayer())); } } // Override for the PAPI placeholder to prevent console errors on unsupported server versions when ping field changes - manager.registerPlayerPlaceholder("%player_ping%", manager.getRefreshInterval("%player_ping%"), - p -> PerformanceUtil.toString(((TabPlayer) p).getPing())); + manager.registerPlayerPlaceholder("%player_ping%", p -> PerformanceUtil.toString(((TabPlayer) p).getPing())); BackendPlatform.super.registerPlaceholders(); } @@ -299,34 +297,31 @@ public void registerUnknownPlaceholder(@NotNull String identifier) { return; } PlaceholderManagerImpl pl = TAB.getInstance().getPlaceholderManager(); - int refresh = pl.getRefreshInterval(identifier); if (identifier.startsWith("%rel_")) { //relational placeholder - TAB.getInstance().getPlaceholderManager().registerRelationalPlaceholder(identifier, pl.getRefreshInterval(identifier), (viewer, target) -> + TAB.getInstance().getPlaceholderManager().registerRelationalPlaceholder(identifier, (viewer, target) -> PlaceholderAPI.setRelationalPlaceholders((Player) viewer.getPlayer(), (Player) target.getPlayer(), identifier)); } else if (identifier.startsWith("%sync:")) { - registerSyncPlaceholder(identifier, refresh); + registerSyncPlaceholder(identifier); } else if (identifier.startsWith("%server_")) { - TAB.getInstance().getPlaceholderManager().registerServerPlaceholder(identifier, refresh, + TAB.getInstance().getPlaceholderManager().registerServerPlaceholder(identifier, () -> PlaceholderAPI.setPlaceholders(null, identifier)); } else { - TAB.getInstance().getPlaceholderManager().registerPlayerPlaceholder(identifier, refresh, + TAB.getInstance().getPlaceholderManager().registerPlayerPlaceholder(identifier, p -> PlaceholderAPI.setPlaceholders((Player) p.getPlayer(), identifier)); } } /** - * Registers a sync placeholder with given identifier and refresh. + * Registers a sync placeholder with given identifier and automatically decided refresh. * * @param identifier * Placeholder identifier - * @param refresh - * Placeholder refresh */ - public void registerSyncPlaceholder(@NotNull String identifier, int refresh) { + public void registerSyncPlaceholder(@NotNull String identifier) { String syncedPlaceholder = "%" + identifier.substring(6); PlayerPlaceholderImpl[] ppl = new PlayerPlaceholderImpl[1]; - ppl[0] = TAB.getInstance().getPlaceholderManager().registerPlayerPlaceholder(identifier, refresh, p -> { + ppl[0] = TAB.getInstance().getPlaceholderManager().registerPlayerPlaceholder(identifier, p -> { Bukkit.getScheduler().runTask(plugin, () -> { long time = System.nanoTime(); ppl[0].updateValue(p, placeholderAPI ? PlaceholderAPI.setPlaceholders((Player) p.getPlayer(), syncedPlaceholder) : identifier); diff --git a/bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/platform/FoliaPlatform.java b/bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/platform/FoliaPlatform.java index 051b4b9dd..b025bc778 100644 --- a/bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/platform/FoliaPlatform.java +++ b/bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/platform/FoliaPlatform.java @@ -57,10 +57,10 @@ public void loadPlayers() { } @Override - public void registerSyncPlaceholder(@NotNull String identifier, int refresh) { + public void registerSyncPlaceholder(@NotNull String identifier) { String syncedPlaceholder = "%" + identifier.substring(6); PlayerPlaceholderImpl[] ppl = new PlayerPlaceholderImpl[1]; - ppl[0] = TAB.getInstance().getPlaceholderManager().registerPlayerPlaceholder(identifier, refresh, p -> { + ppl[0] = TAB.getInstance().getPlaceholderManager().registerPlayerPlaceholder(identifier, p -> { runSync((Entity) p.getPlayer(), () -> { long time = System.nanoTime(); String output = isPlaceholderAPI() ? PlaceholderAPI.setPlaceholders((Player) p.getPlayer(), syncedPlaceholder) : identifier; diff --git a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricPlatform.java b/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricPlatform.java index b9b8f86a9..0ec04d9cc 100644 --- a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricPlatform.java +++ b/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricPlatform.java @@ -55,8 +55,7 @@ public void registerUnknownPlaceholder(@NotNull String identifier) { } PlaceholderManagerImpl manager = TAB.getInstance().getPlaceholderManager(); - int refresh = manager.getRefreshInterval(identifier); - manager.registerPlayerPlaceholder(identifier, refresh, + manager.registerPlayerPlaceholder(identifier, p -> Placeholders.parseText( FabricMultiVersion.newTextComponent(identifier), PlaceholderContext.of((ServerPlayer) p.getPlayer()) diff --git a/shared/src/main/java/me/neznamy/tab/shared/backend/BackendPlatform.java b/shared/src/main/java/me/neznamy/tab/shared/backend/BackendPlatform.java index 3238ecc29..d5fc63067 100644 --- a/shared/src/main/java/me/neznamy/tab/shared/backend/BackendPlatform.java +++ b/shared/src/main/java/me/neznamy/tab/shared/backend/BackendPlatform.java @@ -1,13 +1,13 @@ package me.neznamy.tab.shared.backend; -import me.neznamy.tab.api.placeholder.PlaceholderManager; import me.neznamy.tab.shared.GroupManager; import me.neznamy.tab.shared.TAB; import me.neznamy.tab.shared.TabConstants; +import me.neznamy.tab.shared.features.PlaceholderManagerImpl; +import me.neznamy.tab.shared.features.proxy.ProxySupport; import me.neznamy.tab.shared.hook.LuckPermsHook; import me.neznamy.tab.shared.placeholders.UniversalPlaceholderRegistry; import me.neznamy.tab.shared.platform.Platform; -import me.neznamy.tab.shared.features.proxy.ProxySupport; import me.neznamy.tab.shared.util.PerformanceUtil; import org.jetbrains.annotations.NotNull; @@ -29,14 +29,14 @@ public interface BackendPlatform extends Platform { @Override default void registerPlaceholders() { UniversalPlaceholderRegistry registry = new UniversalPlaceholderRegistry(); - PlaceholderManager manager = TAB.getInstance().getPlaceholderManager(); - manager.registerPlayerPlaceholder(TabConstants.Placeholder.HEALTH, 100, + PlaceholderManagerImpl manager = TAB.getInstance().getPlaceholderManager(); + manager.registerInternalPlayerPlaceholder(TabConstants.Placeholder.HEALTH, 100, p -> PerformanceUtil.toString((int) Math.ceil(((BackendTabPlayer)p).getHealth()))); - manager.registerPlayerPlaceholder(TabConstants.Placeholder.DISPLAY_NAME, 500, + manager.registerInternalPlayerPlaceholder(TabConstants.Placeholder.DISPLAY_NAME, 500, p -> ((BackendTabPlayer)p).getDisplayName()); - manager.registerServerPlaceholder(TabConstants.Placeholder.TPS, 1000, + manager.registerInternalServerPlaceholder(TabConstants.Placeholder.TPS, 1000, () -> registry.getDecimal2().format(Math.min(20, getTPS()))); - manager.registerServerPlaceholder(TabConstants.Placeholder.MSPT, 1000, + manager.registerInternalServerPlaceholder(TabConstants.Placeholder.MSPT, 1000, () -> registry.getDecimal2().format(getMSPT())); registry.registerPlaceholders(manager); } diff --git a/shared/src/main/java/me/neznamy/tab/shared/config/Converter.java b/shared/src/main/java/me/neznamy/tab/shared/config/Converter.java index bb8c41a53..c92fa30bf 100644 --- a/shared/src/main/java/me/neznamy/tab/shared/config/Converter.java +++ b/shared/src/main/java/me/neznamy/tab/shared/config/Converter.java @@ -511,5 +511,6 @@ public void convert507to508(@NotNull ConfigurationFile config) { config.set("proxy-support.rabbitmq.exchange", "plugin"); config.set("proxy-support.rabbitmq.url", "amqp://guest:guest@localhost:5672/%2F"); } + config.rename("placeholderapi-refresh-intervals", "placeholder-refresh-intervals"); } } diff --git a/shared/src/main/java/me/neznamy/tab/shared/config/files/Config.java b/shared/src/main/java/me/neznamy/tab/shared/config/files/Config.java index 4e6d7a3a6..a628d6e04 100644 --- a/shared/src/main/java/me/neznamy/tab/shared/config/files/Config.java +++ b/shared/src/main/java/me/neznamy/tab/shared/config/files/Config.java @@ -81,7 +81,7 @@ public Config() throws IOException { converter.convert507to508(config); conditions = ConditionsSection.fromSection(config.getConfigurationSection("conditions")); - refresh = PlaceholderRefreshConfiguration.fromSection(config.getConfigurationSection("placeholderapi-refresh-intervals")); + refresh = PlaceholderRefreshConfiguration.fromSection(config.getConfigurationSection("placeholder-refresh-intervals")); replacements = PlaceholderReplacementsConfiguration.fromSection(config.getConfigurationSection("placeholder-output-replacements")); placeholders = PlaceholdersConfiguration.fromSection(config.getConfigurationSection("placeholders")); if (config.getBoolean("belowname-objective.enabled", false)) belowname = BelowNameConfiguration.fromSection(config.getConfigurationSection("belowname-objective")); diff --git a/shared/src/main/java/me/neznamy/tab/shared/features/PlaceholderManagerImpl.java b/shared/src/main/java/me/neznamy/tab/shared/features/PlaceholderManagerImpl.java index 3b84d0a39..4c29f7124 100644 --- a/shared/src/main/java/me/neznamy/tab/shared/features/PlaceholderManagerImpl.java +++ b/shared/src/main/java/me/neznamy/tab/shared/features/PlaceholderManagerImpl.java @@ -42,7 +42,9 @@ public class PlaceholderManagerImpl extends RefreshableFeature implements Placeh private static final Pattern placeholderPattern = Pattern.compile("%([^%]*)%"); - @NotNull private final PlaceholderRefreshConfiguration configuration; + @NotNull + @Getter + private final PlaceholderRefreshConfiguration configuration; private final Map registeredPlaceholders = new HashMap<>(); @@ -200,18 +202,6 @@ private Set updateServerPlaceholders(@NotNull Map supplier) { + return registerServerPlaceholder(identifier, configuration.getRefreshInterval(identifier, defaultRefresh), supplier); + } + + @NotNull + public PlayerPlaceholderImpl registerInternalPlayerPlaceholder(@NonNull String identifier, int defaultRefresh, + @NonNull Function function) { + return registerPlayerPlaceholder(identifier, configuration.getRefreshInterval(identifier, defaultRefresh), function); + } + + @NotNull + public RelationalPlaceholderImpl registerInternalRelationalPlaceholder(@NonNull String identifier, int defaultRefresh, + @NonNull BiFunction function) { + return registerRelationalPlaceholder(identifier, configuration.getRefreshInterval(identifier, defaultRefresh), function); + } + + @NotNull + public ServerPlaceholderImpl registerServerPlaceholder(@NonNull String identifier, @NonNull Supplier supplier) { + return registerServerPlaceholder(identifier, configuration.getRefreshInterval(identifier), supplier); + } + + @NotNull + public PlayerPlaceholderImpl registerPlayerPlaceholder(@NonNull String identifier, + @NonNull Function function) { + return registerPlayerPlaceholder(identifier, configuration.getRefreshInterval(identifier), function); + } + + @NotNull + public RelationalPlaceholderImpl registerRelationalPlaceholder(@NonNull String identifier, + @NonNull BiFunction function) { + return registerRelationalPlaceholder(identifier, configuration.getRefreshInterval(identifier), function); + } + // ------------------ // API Implementation // ------------------ @Override - public @NotNull ServerPlaceholderImpl registerServerPlaceholder(@NonNull String identifier, int refresh, @NonNull Supplier supplier) { + @NotNull + public ServerPlaceholderImpl registerServerPlaceholder(@NonNull String identifier, int refresh, @NonNull Supplier supplier) { ensureActive(); bridgePlaceholders.remove(identifier); return registerPlaceholder(new ServerPlaceholderImpl(identifier, refresh, supplier)); } @Override - public @NotNull PlayerPlaceholderImpl registerPlayerPlaceholder(@NonNull String identifier, int refresh, - @NonNull Function function) { + @NotNull + public PlayerPlaceholderImpl registerPlayerPlaceholder(@NonNull String identifier, int refresh, + @NonNull Function function) { ensureActive(); bridgePlaceholders.remove(identifier); return registerPlaceholder(new PlayerPlaceholderImpl(identifier, refresh, function)); } @Override - public @NotNull RelationalPlaceholderImpl registerRelationalPlaceholder( - @NonNull String identifier, int refresh, @NonNull BiFunction function) { + @NotNull + public RelationalPlaceholderImpl registerRelationalPlaceholder(@NonNull String identifier, int refresh, + @NonNull BiFunction function) { ensureActive(); bridgePlaceholders.remove(identifier); return registerPlaceholder(new RelationalPlaceholderImpl(identifier, refresh, function)); @@ -436,11 +463,11 @@ public synchronized TabPlaceholder getPlaceholder(@NonNull String identifier) { TabPlaceholderRegisterEvent event = new TabPlaceholderRegisterEvent(identifier); if (TAB.getInstance().getEventBus() != null) TAB.getInstance().getEventBus().fire(event); if (event.getServerPlaceholder() != null) { - registerServerPlaceholder(identifier, getRefreshInterval(identifier), event.getServerPlaceholder()); + registerServerPlaceholder(identifier, event.getServerPlaceholder()); } else if (event.getPlayerPlaceholder() != null) { - registerPlayerPlaceholder(identifier, getRefreshInterval(identifier), event.getPlayerPlaceholder()); + registerPlayerPlaceholder(identifier, event.getPlayerPlaceholder()); } else if (event.getRelationalPlaceholder() != null) { - registerRelationalPlaceholder(identifier, getRefreshInterval(identifier), event.getRelationalPlaceholder()); + registerRelationalPlaceholder(identifier, event.getRelationalPlaceholder()); } else { TAB.getInstance().getPlatform().registerUnknownPlaceholder(identifier); } diff --git a/shared/src/main/java/me/neznamy/tab/shared/features/bossbar/BossBarManagerImpl.java b/shared/src/main/java/me/neznamy/tab/shared/features/bossbar/BossBarManagerImpl.java index 2c85a282c..16367b952 100644 --- a/shared/src/main/java/me/neznamy/tab/shared/features/bossbar/BossBarManagerImpl.java +++ b/shared/src/main/java/me/neznamy/tab/shared/features/bossbar/BossBarManagerImpl.java @@ -76,7 +76,7 @@ public BossBarManagerImpl(@NonNull BossBarConfiguration configuration) { @Override public void load() { - TAB.getInstance().getPlaceholderManager().registerServerPlaceholder(TabConstants.Placeholder.COUNTDOWN, 100, () -> { + TAB.getInstance().getPlaceholderManager().registerInternalServerPlaceholder(TabConstants.Placeholder.COUNTDOWN, 100, () -> { long seconds = TimeUnit.MILLISECONDS.toSeconds(announceEndTime - System.currentTimeMillis()); if (seconds < 0) return "0"; return Long.toString(seconds); diff --git a/shared/src/main/java/me/neznamy/tab/shared/features/globalplayerlist/GlobalPlayerList.java b/shared/src/main/java/me/neznamy/tab/shared/features/globalplayerlist/GlobalPlayerList.java index ff8ada5d9..d2179a02d 100644 --- a/shared/src/main/java/me/neznamy/tab/shared/features/globalplayerlist/GlobalPlayerList.java +++ b/shared/src/main/java/me/neznamy/tab/shared/features/globalplayerlist/GlobalPlayerList.java @@ -42,7 +42,7 @@ public class GlobalPlayerList extends RefreshableFeature implements JoinListener public GlobalPlayerList(@NotNull GlobalPlayerListConfiguration configuration) { this.configuration = configuration; for (Map.Entry> entry : configuration.getSharedServers().entrySet()) { - TAB.getInstance().getPlaceholderManager().registerServerPlaceholder(TabConstants.Placeholder.globalPlayerListGroup(entry.getKey()), 1000, () -> { + TAB.getInstance().getPlaceholderManager().registerInternalServerPlaceholder(TabConstants.Placeholder.globalPlayerListGroup(entry.getKey()), 1000, () -> { if (onlinePlayers == null) return "0"; // Not loaded yet int count = 0; for (TabPlayer player : onlinePlayers.getPlayers()) { diff --git a/shared/src/main/java/me/neznamy/tab/shared/features/nametags/CollisionManager.java b/shared/src/main/java/me/neznamy/tab/shared/features/nametags/CollisionManager.java index 587decf37..e216fb013 100644 --- a/shared/src/main/java/me/neznamy/tab/shared/features/nametags/CollisionManager.java +++ b/shared/src/main/java/me/neznamy/tab/shared/features/nametags/CollisionManager.java @@ -32,7 +32,7 @@ public CollisionManager(@NotNull NameTag nameTags) { @Override public void load() { - TAB.getInstance().getPlaceholderManager().registerPlayerPlaceholder(TabConstants.Placeholder.COLLISION, 500, p -> { + TAB.getInstance().getPlaceholderManager().registerInternalPlayerPlaceholder(TabConstants.Placeholder.COLLISION, 500, p -> { TabPlayer player = (TabPlayer) p; if (player.teamData.forcedCollision != null) return Boolean.toString(player.teamData.forcedCollision); boolean newCollision = !((TabPlayer)p).isDisguised() && enableCollision.isMet((TabPlayer) p); diff --git a/shared/src/main/java/me/neznamy/tab/shared/features/nametags/VisibilityRefresher.java b/shared/src/main/java/me/neznamy/tab/shared/features/nametags/VisibilityRefresher.java index 411055d28..eafee9ab5 100644 --- a/shared/src/main/java/me/neznamy/tab/shared/features/nametags/VisibilityRefresher.java +++ b/shared/src/main/java/me/neznamy/tab/shared/features/nametags/VisibilityRefresher.java @@ -26,7 +26,7 @@ public class VisibilityRefresher extends RefreshableFeature implements CustomThr public VisibilityRefresher(@NotNull NameTag nameTags) { this.nameTags = nameTags; int refresh = TAB.getInstance().getPlatform().isProxy() ? -1 : 500; - TAB.getInstance().getPlaceholderManager().registerPlayerPlaceholder(TabConstants.Placeholder.INVISIBLE, refresh, + TAB.getInstance().getPlaceholderManager().registerInternalPlayerPlaceholder(TabConstants.Placeholder.INVISIBLE, refresh, p -> Boolean.toString(((TabPlayer)p).hasInvisibilityPotion())); addUsedPlaceholder(TabConstants.Placeholder.INVISIBLE); } diff --git a/shared/src/main/java/me/neznamy/tab/shared/features/proxy/ProxySupport.java b/shared/src/main/java/me/neznamy/tab/shared/features/proxy/ProxySupport.java index b143161b8..e435b4347 100644 --- a/shared/src/main/java/me/neznamy/tab/shared/features/proxy/ProxySupport.java +++ b/shared/src/main/java/me/neznamy/tab/shared/features/proxy/ProxySupport.java @@ -127,7 +127,7 @@ private void overridePlaceholders() { }); } }; - TAB.getInstance().getPlaceholderManager().registerServerPlaceholder(TabConstants.Placeholder.ONLINE, 1000, () -> { + TAB.getInstance().getPlaceholderManager().registerInternalServerPlaceholder(TabConstants.Placeholder.ONLINE, 1000, () -> { int count = 0; for (TabPlayer player : TAB.getInstance().getOnlinePlayers()) { if (!player.isVanished()) count++; @@ -137,7 +137,7 @@ private void overridePlaceholders() { } return PerformanceUtil.toString(count); }); - TAB.getInstance().getPlaceholderManager().registerServerPlaceholder(TabConstants.Placeholder.STAFF_ONLINE, 1000, () -> { + TAB.getInstance().getPlaceholderManager().registerInternalServerPlaceholder(TabConstants.Placeholder.STAFF_ONLINE, 1000, () -> { int count = 0; for (TabPlayer player : TAB.getInstance().getOnlinePlayers()) { if (!player.isVanished() && player.hasPermission(TabConstants.Permission.STAFF)) count++; @@ -147,7 +147,7 @@ private void overridePlaceholders() { } return PerformanceUtil.toString(count); }); - TAB.getInstance().getPlaceholderManager().registerPlayerPlaceholder(TabConstants.Placeholder.SERVER_ONLINE, 1000, p -> { + TAB.getInstance().getPlaceholderManager().registerInternalPlayerPlaceholder(TabConstants.Placeholder.SERVER_ONLINE, 1000, p -> { int count = 0; for (TabPlayer player : TAB.getInstance().getOnlinePlayers()) { if (((TabPlayer)p).server.equals(player.server) && !player.isVanished()) count++; diff --git a/shared/src/main/java/me/neznamy/tab/shared/features/sorting/types/Permissions.java b/shared/src/main/java/me/neznamy/tab/shared/features/sorting/types/Permissions.java index 3d177dcb4..09a8f2e27 100644 --- a/shared/src/main/java/me/neznamy/tab/shared/features/sorting/types/Permissions.java +++ b/shared/src/main/java/me/neznamy/tab/shared/features/sorting/types/Permissions.java @@ -33,7 +33,7 @@ public Permissions(Sorting sorting, String options) { for (String permission : sortedGroups.keySet()) { String placeholder = "%permission:" + permission + "%"; placeholders.add(placeholder); - TAB.getInstance().getPlaceholderManager().registerPlayerPlaceholder(placeholder, + TAB.getInstance().getPlaceholderManager().registerInternalPlayerPlaceholder(placeholder, TAB.getInstance().getConfiguration().getConfig().getPermissionRefreshInterval(), p -> Boolean.toString(((TabPlayer)p).hasPermission(permission))); } diff --git a/shared/src/main/java/me/neznamy/tab/shared/placeholders/PlaceholderRefreshConfiguration.java b/shared/src/main/java/me/neznamy/tab/shared/placeholders/PlaceholderRefreshConfiguration.java index 0a8bb007c..56c368a34 100644 --- a/shared/src/main/java/me/neznamy/tab/shared/placeholders/PlaceholderRefreshConfiguration.java +++ b/shared/src/main/java/me/neznamy/tab/shared/placeholders/PlaceholderRefreshConfiguration.java @@ -20,12 +20,38 @@ public class PlaceholderRefreshConfiguration { @NotNull private final Map refreshIntervals; /** - * Returns instance of this class created from given configuration section. If there are - * issues in the configuration, console warns are printed. + * Returns refresh interval for specified placeholder. + * If not defined, {@link #defaultInterval} is returned. + * + * @param identifier + * Placeholder identifier + * @return Refresh interval for given placeholder + */ + public int getRefreshInterval(@NotNull String identifier) { + return refreshIntervals.getOrDefault(identifier, defaultInterval); + } + + /** + * Returns refresh interval for specified placeholder. + * If not defined, {@code defaultInterval} is returned. + * + * @param identifier + * Placeholder identifier + * @param defaultInterval + * Interval to use if not defined in config + * @return Refresh interval for given placeholder + */ + public int getRefreshInterval(@NotNull String identifier, int defaultInterval) { + return refreshIntervals.getOrDefault(identifier, defaultInterval); + } + + /** + * Returns instance of this class created from the given configuration section. + * If there are issues in the configuration, console warns are printed. * * @param section * Configuration section to load from - * @return Loaded instance from given configuration section + * @return Loaded instance from the given configuration section */ @NotNull public static PlaceholderRefreshConfiguration fromSection(@NotNull ConfigurationSection section) { diff --git a/shared/src/main/java/me/neznamy/tab/shared/placeholders/UniversalPlaceholderRegistry.java b/shared/src/main/java/me/neznamy/tab/shared/placeholders/UniversalPlaceholderRegistry.java index 2e9efacd1..3c35a8bd6 100644 --- a/shared/src/main/java/me/neznamy/tab/shared/placeholders/UniversalPlaceholderRegistry.java +++ b/shared/src/main/java/me/neznamy/tab/shared/placeholders/UniversalPlaceholderRegistry.java @@ -1,7 +1,6 @@ package me.neznamy.tab.shared.placeholders; import lombok.Getter; -import me.neznamy.tab.api.placeholder.PlaceholderManager; import me.neznamy.tab.shared.TAB; import me.neznamy.tab.shared.TabConstants; import me.neznamy.tab.shared.features.PlaceholderManagerImpl; @@ -44,52 +43,52 @@ public UniversalPlaceholderRegistry() { * @param manager * placeholder manager to register placeholders to */ - public void registerPlaceholders(@NotNull PlaceholderManager manager) { + public void registerPlaceholders(@NotNull PlaceholderManagerImpl manager) { registerConstants(manager); registerServerPlaceholders(manager); registerPlayerPlaceholders(manager); } - private void registerConstants(@NotNull PlaceholderManager manager) { + private void registerConstants(@NotNull PlaceholderManagerImpl manager) { // Player - manager.registerPlayerPlaceholder(TabConstants.Placeholder.BEDROCK, -1, p -> Boolean.toString(((TabPlayer)p).isBedrockPlayer())); - manager.registerPlayerPlaceholder(TabConstants.Placeholder.PLAYER, -1, me.neznamy.tab.api.TabPlayer::getName); - manager.registerPlayerPlaceholder(TabConstants.Placeholder.WORLD, -1, p -> ((TabPlayer)p).world); - manager.registerPlayerPlaceholder(TabConstants.Placeholder.SERVER, -1, p -> ((TabPlayer)p).server); - manager.registerPlayerPlaceholder(TabConstants.Placeholder.PLAYER_VERSION, -1, p -> ((TabPlayer)p).getVersion().getFriendlyName()); - manager.registerPlayerPlaceholder(TabConstants.Placeholder.PLAYER_VERSION_ID, -1, p -> PerformanceUtil.toString(((TabPlayer)p).getVersion().getNetworkId())); + manager.registerInternalPlayerPlaceholder(TabConstants.Placeholder.BEDROCK, -1, p -> Boolean.toString(((TabPlayer)p).isBedrockPlayer())); + manager.registerInternalPlayerPlaceholder(TabConstants.Placeholder.PLAYER, -1, me.neznamy.tab.api.TabPlayer::getName); + manager.registerInternalPlayerPlaceholder(TabConstants.Placeholder.WORLD, -1, p -> ((TabPlayer)p).world); + manager.registerInternalPlayerPlaceholder(TabConstants.Placeholder.SERVER, -1, p -> ((TabPlayer)p).server); + manager.registerInternalPlayerPlaceholder(TabConstants.Placeholder.PLAYER_VERSION, -1, p -> ((TabPlayer)p).getVersion().getFriendlyName()); + manager.registerInternalPlayerPlaceholder(TabConstants.Placeholder.PLAYER_VERSION_ID, -1, p -> PerformanceUtil.toString(((TabPlayer)p).getVersion().getNetworkId())); // Server - manager.registerServerPlaceholder("%%", -1, () -> "%"); - manager.registerServerPlaceholder(TabConstants.Placeholder.MEMORY_MAX, -1, () -> PerformanceUtil.toString((int) (Runtime.getRuntime().maxMemory()/1024/1024))); - manager.registerServerPlaceholder(TabConstants.Placeholder.MEMORY_MAX_GB, -1, () -> decimal2.format((float)Runtime.getRuntime().maxMemory()/1024/1024/1024)); + manager.registerInternalServerPlaceholder("%%", -1, () -> "%"); + manager.registerInternalServerPlaceholder(TabConstants.Placeholder.MEMORY_MAX, -1, () -> PerformanceUtil.toString((int) (Runtime.getRuntime().maxMemory()/1024/1024))); + manager.registerInternalServerPlaceholder(TabConstants.Placeholder.MEMORY_MAX_GB, -1, () -> decimal2.format((float)Runtime.getRuntime().maxMemory()/1024/1024/1024)); if (!LuckPermsHook.getInstance().isInstalled()) { - manager.registerServerPlaceholder(TabConstants.Placeholder.LUCKPERMS_PREFIX, -1, () -> ""); - manager.registerServerPlaceholder(TabConstants.Placeholder.LUCKPERMS_SUFFIX, -1, () -> ""); + manager.registerInternalServerPlaceholder(TabConstants.Placeholder.LUCKPERMS_PREFIX, -1, () -> ""); + manager.registerInternalServerPlaceholder(TabConstants.Placeholder.LUCKPERMS_SUFFIX, -1, () -> ""); } } - private void registerServerPlaceholders(@NotNull PlaceholderManager manager) { + private void registerServerPlaceholders(@NotNull PlaceholderManagerImpl manager) { PlaceholdersConfiguration placeholders = TAB.getInstance().getConfiguration().getConfig().getPlaceholders(); - manager.registerServerPlaceholder(TabConstants.Placeholder.TIME, 500, () -> placeholders.getTimeFormat().format(new Date(System.currentTimeMillis() + (int)(placeholders.getTimeOffset() *3600000)))); - manager.registerServerPlaceholder(TabConstants.Placeholder.DATE, 60000, () -> placeholders.getDateFormat().format(new Date(System.currentTimeMillis() + (int)(placeholders.getTimeOffset() *3600000)))); - manager.registerServerPlaceholder(TabConstants.Placeholder.MEMORY_USED, 200, () -> PerformanceUtil.toString((int) ((Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())/1024/1024))); - manager.registerServerPlaceholder(TabConstants.Placeholder.MEMORY_USED_GB, 200, () -> decimal2.format((float)(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) /1024/1024/1024)); - manager.registerServerPlaceholder(TabConstants.Placeholder.ONLINE, 1000, () -> { + manager.registerInternalServerPlaceholder(TabConstants.Placeholder.TIME, 500, () -> placeholders.getTimeFormat().format(new Date(System.currentTimeMillis() + (int)(placeholders.getTimeOffset() *3600000)))); + manager.registerInternalServerPlaceholder(TabConstants.Placeholder.DATE, 60000, () -> placeholders.getDateFormat().format(new Date(System.currentTimeMillis() + (int)(placeholders.getTimeOffset() *3600000)))); + manager.registerInternalServerPlaceholder(TabConstants.Placeholder.MEMORY_USED, 200, () -> PerformanceUtil.toString((int) ((Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())/1024/1024))); + manager.registerInternalServerPlaceholder(TabConstants.Placeholder.MEMORY_USED_GB, 200, () -> decimal2.format((float)(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) /1024/1024/1024)); + manager.registerInternalServerPlaceholder(TabConstants.Placeholder.ONLINE, 1000, () -> { int count = 0; for (TabPlayer player : TAB.getInstance().getOnlinePlayers()) { if (!player.isVanished()) count++; } return PerformanceUtil.toString(count); }); - manager.registerServerPlaceholder(TabConstants.Placeholder.STAFF_ONLINE, 2000, () -> { + manager.registerInternalServerPlaceholder(TabConstants.Placeholder.STAFF_ONLINE, 2000, () -> { int count = 0; for (TabPlayer player : TAB.getInstance().getOnlinePlayers()) { if (player.hasPermission(TabConstants.Permission.STAFF) && !player.isVanished()) count++; } return PerformanceUtil.toString(count); }); - manager.registerServerPlaceholder(TabConstants.Placeholder.NON_STAFF_ONLINE, 2000, () -> { + manager.registerInternalServerPlaceholder(TabConstants.Placeholder.NON_STAFF_ONLINE, 2000, () -> { int count = 0; for (TabPlayer player : TAB.getInstance().getOnlinePlayers()) { if (!player.hasPermission(TabConstants.Permission.STAFF) && !player.isVanished()) count++; @@ -98,42 +97,42 @@ private void registerServerPlaceholders(@NotNull PlaceholderManager manager) { }); } - private void registerPlayerPlaceholders(@NotNull PlaceholderManager manager) { + private void registerPlayerPlaceholders(@NotNull PlaceholderManagerImpl manager) { boolean proxy = TAB.getInstance().getPlatform().isProxy(); - manager.registerPlayerPlaceholder(TabConstants.Placeholder.GROUP, -1, me.neznamy.tab.api.TabPlayer::getGroup); - manager.registerPlayerPlaceholder(TabConstants.Placeholder.PING, 500, p -> PerformanceUtil.toString(((TabPlayer)p).getPing())); - manager.registerPlayerPlaceholder(TabConstants.Placeholder.VANISHED, 1000, p -> Boolean.toString(((TabPlayer)p).isVanished())); - manager.registerPlayerPlaceholder(TabConstants.Placeholder.WORLD_ONLINE, 1000, p -> { + manager.registerInternalPlayerPlaceholder(TabConstants.Placeholder.GROUP, -1, me.neznamy.tab.api.TabPlayer::getGroup); + manager.registerInternalPlayerPlaceholder(TabConstants.Placeholder.PING, 500, p -> PerformanceUtil.toString(((TabPlayer)p).getPing())); + manager.registerInternalPlayerPlaceholder(TabConstants.Placeholder.VANISHED, 1000, p -> Boolean.toString(((TabPlayer)p).isVanished())); + manager.registerInternalPlayerPlaceholder(TabConstants.Placeholder.WORLD_ONLINE, 1000, p -> { int count = 0; for (TabPlayer player : TAB.getInstance().getOnlinePlayers()) { if (((TabPlayer)p).world.equals(player.world) && !player.isVanished()) count++; } return PerformanceUtil.toString(count); }); - manager.registerPlayerPlaceholder(TabConstants.Placeholder.SERVER_ONLINE, 1000, p -> { + manager.registerInternalPlayerPlaceholder(TabConstants.Placeholder.SERVER_ONLINE, 1000, p -> { int count = 0; for (TabPlayer player : TAB.getInstance().getOnlinePlayers()) { if (((TabPlayer)p).server.equals(player.server) && !player.isVanished()) count++; } return PerformanceUtil.toString(count); }); - manager.registerPlayerPlaceholder(TabConstants.Placeholder.GAMEMODE, proxy ? -1 : 100, p -> PerformanceUtil.toString(((TabPlayer)p).getGamemode())); + manager.registerInternalPlayerPlaceholder(TabConstants.Placeholder.GAMEMODE, proxy ? -1 : 100, p -> PerformanceUtil.toString(((TabPlayer)p).getGamemode())); if (LuckPermsHook.getInstance().isInstalled()) { int refresh = TAB.getInstance().getConfiguration().getConfig().getPermissionRefreshInterval(); - manager.registerPlayerPlaceholder(TabConstants.Placeholder.LUCKPERMS_PREFIX, refresh, + manager.registerInternalPlayerPlaceholder(TabConstants.Placeholder.LUCKPERMS_PREFIX, refresh, p -> LuckPermsHook.getInstance().getPrefix((TabPlayer) p)); - manager.registerPlayerPlaceholder(TabConstants.Placeholder.LUCKPERMS_SUFFIX, refresh, + manager.registerInternalPlayerPlaceholder(TabConstants.Placeholder.LUCKPERMS_SUFFIX, refresh, p -> LuckPermsHook.getInstance().getSuffix((TabPlayer) p)); } for (Entry entry : TAB.getInstance().getConfiguration().getAnimations().getAnimations().getAnimations().entrySet()) { - Animation a = new Animation((PlaceholderManagerImpl) manager, entry.getKey(), entry.getValue()); - manager.registerPlayerPlaceholder(TabConstants.Placeholder.animation(a.getName()), a.getRefresh(), p -> a.getMessage()); + Animation a = new Animation(manager, entry.getKey(), entry.getValue()); + manager.registerInternalPlayerPlaceholder(TabConstants.Placeholder.animation(a.getName()), a.getRefresh(), p -> a.getMessage()); } Condition.clearConditions(); for (Entry condition : TAB.getInstance().getConfiguration().getConfig().getConditions().getConditions().entrySet()) { ConditionDefinition def = condition.getValue(); Condition c = new Condition(def.isType(), condition.getKey(), def.getConditions(), def.getYes(), def.getNo()); - manager.registerPlayerPlaceholder(TabConstants.Placeholder.condition(c.getName()), c.getRefresh(), p -> c.getText((TabPlayer)p)); + manager.registerInternalPlayerPlaceholder(TabConstants.Placeholder.condition(c.getName()), c.getRefresh(), p -> c.getText((TabPlayer)p)); } Condition.finishSetups(); } diff --git a/shared/src/main/java/me/neznamy/tab/shared/placeholders/conditions/Condition.java b/shared/src/main/java/me/neznamy/tab/shared/placeholders/conditions/Condition.java index 276d1c003..badaa554e 100644 --- a/shared/src/main/java/me/neznamy/tab/shared/placeholders/conditions/Condition.java +++ b/shared/src/main/java/me/neznamy/tab/shared/placeholders/conditions/Condition.java @@ -194,7 +194,7 @@ public static Condition getCondition(String string) { conditions = conditions.stream().map(String::trim).collect(Collectors.toList()); Condition c = new Condition(type, anonVersion, conditions, "true", "false"); c.finishSetup(); - TAB.getInstance().getPlaceholderManager().registerPlayerPlaceholder(TabConstants.Placeholder.condition(c.name), c.refresh, + TAB.getInstance().getPlaceholderManager().registerInternalPlayerPlaceholder(TabConstants.Placeholder.condition(c.name), c.refresh, p -> c.getText((TabPlayer) p)); return c; } diff --git a/shared/src/main/java/me/neznamy/tab/shared/proxy/ProxyPlatform.java b/shared/src/main/java/me/neznamy/tab/shared/proxy/ProxyPlatform.java index 086fcdd0e..658d07842 100644 --- a/shared/src/main/java/me/neznamy/tab/shared/proxy/ProxyPlatform.java +++ b/shared/src/main/java/me/neznamy/tab/shared/proxy/ProxyPlatform.java @@ -40,7 +40,7 @@ public void registerUnknownPlaceholder(@NotNull String identifier) { //internal dynamic %online_% placeholder if (identifier.startsWith("%online_")) { String server = identifier.substring(8, identifier.length()-1); - pl.registerServerPlaceholder(identifier, 1000, () -> { + pl.registerInternalServerPlaceholder(identifier, 1000, () -> { int count = 0; for (TabPlayer player : TAB.getInstance().getOnlinePlayers()) { if (player.server.equals(server) && !player.isVanished()) count++; @@ -50,7 +50,7 @@ public void registerUnknownPlaceholder(@NotNull String identifier) { return; } Placeholder placeholder; - int refresh = pl.getRefreshInterval(identifier); + int refresh = pl.getConfiguration().getRefreshInterval(identifier); if (identifier.startsWith("%rel_")) { placeholder = pl.registerRelationalBridgePlaceholder(identifier, refresh); } else { @@ -63,7 +63,7 @@ public void registerUnknownPlaceholder(@NotNull String identifier) { @Override public void registerPlaceholders() { - TAB.getInstance().getPlaceholderManager().registerServerPlaceholder(TabConstants.Placeholder.TPS, -1, + TAB.getInstance().getPlaceholderManager().registerInternalServerPlaceholder(TabConstants.Placeholder.TPS, -1, () -> "\"tps\" is a backend-only placeholder as the proxy does not tick anything. If you wish to display TPS of " + "the server player is connected to, use placeholders from PlaceholderAPI and install TAB-Bridge for forwarding support to the proxy."); new UniversalPlaceholderRegistry().registerPlaceholders(TAB.getInstance().getPlaceholderManager()); diff --git a/shared/src/main/resources/config/config.yml b/shared/src/main/resources/config/config.yml index c4985e624..c87d59f72 100644 --- a/shared/src/main/resources/config/config.yml +++ b/shared/src/main/resources/config/config.yml @@ -188,7 +188,7 @@ conditions: yes: "%player%" no: "~%essentials_nickname%" -placeholderapi-refresh-intervals: +placeholder-refresh-intervals: default-refresh-interval: 500 "%server_uptime%": 1000 "%server_tps_1_colored%": 1000