Skip to content

Commit

Permalink
[Placeholders] Allow placeholder refresh intervals to define override…
Browse files Browse the repository at this point in the history
…s for internal placeholders
  • Loading branch information
NEZNAMY committed Feb 27, 2025
1 parent a61a520 commit 9f038fa
Show file tree
Hide file tree
Showing 18 changed files with 147 additions and 100 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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<Chat> 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();
}

Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, Placeholder> registeredPlaceholders = new HashMap<>();

Expand Down Expand Up @@ -200,18 +202,6 @@ private Set<RefreshableFeature> updateServerPlaceholders(@NotNull Map<ServerPlac
return set;
}

/**
* Returns refresh interval the placeholder has configured. If not configured,
* default refresh interval is returned.
*
* @param identifier
* Placeholder identifier
* @return Configured refresh interval for placeholder
*/
public int getRefreshInterval(@NotNull String identifier) {
return configuration.getRefreshIntervals().getOrDefault(identifier, configuration.getDefaultInterval());
}

/**
* Returns collection of all currently registered placeholders.
*
Expand Down Expand Up @@ -384,28 +374,65 @@ public Placeholder getPlaceholderRaw(@NotNull String identifier) {
return registeredPlaceholders.get(identifier);
}

@NotNull
public ServerPlaceholderImpl registerInternalServerPlaceholder(@NonNull String identifier, int defaultRefresh, @NonNull Supplier<String> supplier) {
return registerServerPlaceholder(identifier, configuration.getRefreshInterval(identifier, defaultRefresh), supplier);
}

@NotNull
public PlayerPlaceholderImpl registerInternalPlayerPlaceholder(@NonNull String identifier, int defaultRefresh,
@NonNull Function<me.neznamy.tab.api.TabPlayer, String> function) {
return registerPlayerPlaceholder(identifier, configuration.getRefreshInterval(identifier, defaultRefresh), function);
}

@NotNull
public RelationalPlaceholderImpl registerInternalRelationalPlaceholder(@NonNull String identifier, int defaultRefresh,
@NonNull BiFunction<me.neznamy.tab.api.TabPlayer, me.neznamy.tab.api.TabPlayer, String> function) {
return registerRelationalPlaceholder(identifier, configuration.getRefreshInterval(identifier, defaultRefresh), function);
}

@NotNull
public ServerPlaceholderImpl registerServerPlaceholder(@NonNull String identifier, @NonNull Supplier<String> supplier) {
return registerServerPlaceholder(identifier, configuration.getRefreshInterval(identifier), supplier);
}

@NotNull
public PlayerPlaceholderImpl registerPlayerPlaceholder(@NonNull String identifier,
@NonNull Function<me.neznamy.tab.api.TabPlayer, String> function) {
return registerPlayerPlaceholder(identifier, configuration.getRefreshInterval(identifier), function);
}

@NotNull
public RelationalPlaceholderImpl registerRelationalPlaceholder(@NonNull String identifier,
@NonNull BiFunction<me.neznamy.tab.api.TabPlayer, me.neznamy.tab.api.TabPlayer, String> function) {
return registerRelationalPlaceholder(identifier, configuration.getRefreshInterval(identifier), function);
}

// ------------------
// API Implementation
// ------------------

@Override
public @NotNull ServerPlaceholderImpl registerServerPlaceholder(@NonNull String identifier, int refresh, @NonNull Supplier<String> supplier) {
@NotNull
public ServerPlaceholderImpl registerServerPlaceholder(@NonNull String identifier, int refresh, @NonNull Supplier<String> supplier) {
ensureActive();
bridgePlaceholders.remove(identifier);
return registerPlaceholder(new ServerPlaceholderImpl(identifier, refresh, supplier));
}

@Override
public @NotNull PlayerPlaceholderImpl registerPlayerPlaceholder(@NonNull String identifier, int refresh,
@NonNull Function<me.neznamy.tab.api.TabPlayer, String> function) {
@NotNull
public PlayerPlaceholderImpl registerPlayerPlaceholder(@NonNull String identifier, int refresh,
@NonNull Function<me.neznamy.tab.api.TabPlayer, String> function) {
ensureActive();
bridgePlaceholders.remove(identifier);
return registerPlaceholder(new PlayerPlaceholderImpl(identifier, refresh, function));
}

@Override
public @NotNull RelationalPlaceholderImpl registerRelationalPlaceholder(
@NonNull String identifier, int refresh, @NonNull BiFunction<me.neznamy.tab.api.TabPlayer, me.neznamy.tab.api.TabPlayer, String> function) {
@NotNull
public RelationalPlaceholderImpl registerRelationalPlaceholder(@NonNull String identifier, int refresh,
@NonNull BiFunction<me.neznamy.tab.api.TabPlayer, me.neznamy.tab.api.TabPlayer, String> function) {
ensureActive();
bridgePlaceholders.remove(identifier);
return registerPlaceholder(new RelationalPlaceholderImpl(identifier, refresh, function));
Expand Down Expand Up @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public class GlobalPlayerList extends RefreshableFeature implements JoinListener
public GlobalPlayerList(@NotNull GlobalPlayerListConfiguration configuration) {
this.configuration = configuration;
for (Map.Entry<String, List<String>> 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()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
Loading

0 comments on commit 9f038fa

Please sign in to comment.