Skip to content

Commit c13068a

Browse files
authored
Merge pull request #113 from TheNextLvl-net/placeholderapi
Refactored placeholder handling system
2 parents b6f5b1c + 9f7274c commit c13068a

9 files changed

+161
-113
lines changed

plugin/src/main/java/net/thenextlvl/service/ServicePlugin.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,11 @@
2929
import net.thenextlvl.service.controller.permission.SuperPermsPermissionController;
3030
import net.thenextlvl.service.listener.CitizensListener;
3131
import net.thenextlvl.service.listener.FancyNpcsListener;
32-
import net.thenextlvl.service.placeholder.chat.ServiceChatPlaceholderExpansion;
33-
import net.thenextlvl.service.placeholder.economy.ServiceBankPlaceholderExpansion;
34-
import net.thenextlvl.service.placeholder.economy.ServiceEconomyPlaceholderExpansion;
35-
import net.thenextlvl.service.placeholder.group.ServiceGroupPlaceholderExpansion;
32+
import net.thenextlvl.service.placeholder.api.PlaceholderExpansionBuilder;
33+
import net.thenextlvl.service.placeholder.chat.ServiceChatPlaceholderStore;
34+
import net.thenextlvl.service.placeholder.economy.ServiceBankPlaceholderStore;
35+
import net.thenextlvl.service.placeholder.economy.ServiceEconomyPlaceholderStore;
36+
import net.thenextlvl.service.placeholder.group.ServiceGroupPlaceholderStore;
3637
import net.thenextlvl.service.version.PluginVersionChecker;
3738
import net.thenextlvl.service.wrapper.VaultChatServiceWrapper;
3839
import net.thenextlvl.service.wrapper.VaultEconomyServiceWrapper;
@@ -52,6 +53,7 @@
5253
import org.jspecify.annotations.Nullable;
5354

5455
import java.nio.file.Path;
56+
import java.util.ArrayList;
5557
import java.util.Arrays;
5658
import java.util.Locale;
5759
import java.util.function.Function;
@@ -105,10 +107,12 @@ public void onEnable() {
105107

106108
private void registerPlaceholders() {
107109
if (getServer().getPluginManager().getPlugin("PlaceholderAPI") == null) return;
108-
new ServiceBankPlaceholderExpansion(this).register();
109-
new ServiceChatPlaceholderExpansion(this).register();
110-
new ServiceEconomyPlaceholderExpansion(this).register();
111-
new ServiceGroupPlaceholderExpansion(this).register();
110+
new PlaceholderExpansionBuilder(this)
111+
.registerStore(new ServiceBankPlaceholderStore(this))
112+
.registerStore(new ServiceChatPlaceholderStore(this))
113+
.registerStore(new ServiceEconomyPlaceholderStore(this))
114+
.registerStore(new ServiceGroupPlaceholderStore(this))
115+
.register();
112116
}
113117

114118
public ComponentBundle bundle() {

plugin/src/main/java/net/thenextlvl/service/placeholder/ServicePlaceholderExpansion.java

Lines changed: 0 additions & 92 deletions
This file was deleted.
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package net.thenextlvl.service.placeholder.api;
2+
3+
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
4+
import net.thenextlvl.service.ServicePlugin;
5+
import org.bukkit.OfflinePlayer;
6+
import org.jspecify.annotations.NullMarked;
7+
import org.jspecify.annotations.Nullable;
8+
9+
import java.util.Collection;
10+
import java.util.HashSet;
11+
import java.util.Objects;
12+
import java.util.Set;
13+
14+
@NullMarked
15+
public class PlaceholderExpansionBuilder extends PlaceholderExpansion {
16+
private final Set<PlaceholderStore<?>> stores = new HashSet<>();
17+
private final String identifier;
18+
19+
private String author;
20+
private String version;
21+
22+
protected final ServicePlugin plugin;
23+
24+
public PlaceholderExpansionBuilder(ServicePlugin plugin, String identifier) {
25+
this.author = String.join(", ", plugin.getPluginMeta().getAuthors());
26+
this.version = plugin.getPluginMeta().getVersion();
27+
this.identifier = identifier;
28+
this.plugin = plugin;
29+
}
30+
31+
public PlaceholderExpansionBuilder(ServicePlugin plugin) {
32+
this(plugin, "serviceio");
33+
}
34+
35+
public final PlaceholderExpansionBuilder registerStore(PlaceholderStore<?> store) {
36+
if (store.isEnabled()) stores.add(store);
37+
return this;
38+
}
39+
40+
public final PlaceholderExpansionBuilder setAuthors(Collection<String> authors) {
41+
this.author = String.join(", ", authors);
42+
return this;
43+
}
44+
45+
public PlaceholderExpansionBuilder setVersion(String version) {
46+
this.version = version;
47+
return this;
48+
}
49+
50+
@Override
51+
public boolean canRegister() {
52+
return !stores.isEmpty() && super.canRegister();
53+
}
54+
55+
@Override
56+
public final String getIdentifier() {
57+
return identifier;
58+
}
59+
60+
@Override
61+
public final String getAuthor() {
62+
return author;
63+
}
64+
65+
@Override
66+
public String getVersion() {
67+
return version;
68+
}
69+
70+
@Override
71+
public final boolean persist() {
72+
return true;
73+
}
74+
75+
@Override
76+
public final @Nullable String onRequest(@Nullable OfflinePlayer player, String params) {
77+
return player == null ? null : stores.stream()
78+
.map(store -> store.resolve(player, params))
79+
.filter(Objects::nonNull)
80+
.findAny().orElse(null);
81+
}
82+
}

plugin/src/main/java/net/thenextlvl/service/placeholder/PlaceholderResolver.java renamed to plugin/src/main/java/net/thenextlvl/service/placeholder/api/PlaceholderResolver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.thenextlvl.service.placeholder;
1+
package net.thenextlvl.service.placeholder.api;
22

33
import com.google.common.base.Preconditions;
44
import org.bukkit.OfflinePlayer;
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package net.thenextlvl.service.placeholder.api;
2+
3+
import net.thenextlvl.service.ServicePlugin;
4+
import org.bukkit.OfflinePlayer;
5+
import org.jspecify.annotations.Nullable;
6+
7+
import java.util.HashMap;
8+
import java.util.Map;
9+
import java.util.regex.Pattern;
10+
11+
public abstract class PlaceholderStore<T> {
12+
private final Map<Pattern, PlaceholderResolver> resolvers = new HashMap<>();
13+
private final @Nullable T provider;
14+
15+
protected final ServicePlugin plugin;
16+
17+
public PlaceholderStore(ServicePlugin plugin, Class<T> providerClass) {
18+
this.plugin = plugin;
19+
this.provider = plugin.getServer().getServicesManager().load(providerClass);
20+
if (provider == null) return;
21+
registerResolvers(provider);
22+
plugin.getComponentLogger().info("Registered placeholders for {} ({})",
23+
provider.getClass().getSimpleName(), providerClass.getSimpleName());
24+
}
25+
26+
public final void registerResolver(Pattern pattern, PlaceholderResolver resolver) {
27+
resolvers.put(pattern, resolver);
28+
}
29+
30+
protected final void registerResolver(String regex, PlaceholderResolver resolver) {
31+
resolvers.put(Pattern.compile(regex.replace("%s", "([^{}_]+)")), resolver);
32+
}
33+
34+
protected abstract void registerResolvers(T provider);
35+
36+
public final @Nullable String resolve(OfflinePlayer player, String params) {
37+
try {
38+
for (var entry : resolvers.entrySet()) {
39+
var matcher = entry.getKey().matcher(params);
40+
if (!matcher.matches()) continue;
41+
return entry.getValue().resolve(player, matcher);
42+
}
43+
return null;
44+
} catch (Exception e) {
45+
var name = player.getName() != null ? player.getName() : player.getUniqueId().toString();
46+
plugin.getComponentLogger().warn("Failed to resolve placeholder '{}' for player {}", params, name, e);
47+
return null;
48+
}
49+
}
50+
51+
public final boolean isEnabled() {
52+
return provider != null;
53+
}
54+
}
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
import net.thenextlvl.service.ServicePlugin;
44
import net.thenextlvl.service.api.chat.ChatController;
55
import net.thenextlvl.service.api.model.Display;
6-
import net.thenextlvl.service.placeholder.ServicePlaceholderExpansion;
6+
import net.thenextlvl.service.placeholder.api.PlaceholderStore;
77
import org.jspecify.annotations.NullMarked;
88

99
@NullMarked
10-
public class ServiceChatPlaceholderExpansion extends ServicePlaceholderExpansion<ChatController> {
11-
public ServiceChatPlaceholderExpansion(ServicePlugin plugin) {
10+
public class ServiceChatPlaceholderStore extends PlaceholderStore<ChatController> {
11+
public ServiceChatPlaceholderStore(ServicePlugin plugin) {
1212
super(plugin, ChatController.class);
1313
}
1414

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@
33
import net.thenextlvl.service.ServicePlugin;
44
import net.thenextlvl.service.api.economy.bank.Bank;
55
import net.thenextlvl.service.api.economy.bank.BankController;
6-
import net.thenextlvl.service.placeholder.ServicePlaceholderExpansion;
6+
import net.thenextlvl.service.placeholder.api.PlaceholderStore;
77
import org.jspecify.annotations.NullMarked;
88

99
import java.math.BigDecimal;
1010
import java.util.stream.Collectors;
1111

1212
@NullMarked
13-
public class ServiceBankPlaceholderExpansion extends ServicePlaceholderExpansion<BankController> {
14-
public ServiceBankPlaceholderExpansion(ServicePlugin plugin) {
13+
public class ServiceBankPlaceholderStore extends PlaceholderStore<BankController> {
14+
public ServiceBankPlaceholderStore(ServicePlugin plugin) {
1515
super(plugin, BankController.class);
1616
}
1717

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
import net.thenextlvl.service.ServicePlugin;
44
import net.thenextlvl.service.api.economy.Account;
55
import net.thenextlvl.service.api.economy.EconomyController;
6-
import net.thenextlvl.service.placeholder.ServicePlaceholderExpansion;
6+
import net.thenextlvl.service.placeholder.api.PlaceholderStore;
77
import org.jspecify.annotations.NullMarked;
88

99
import java.math.BigDecimal;
1010

1111
@NullMarked
12-
public class ServiceEconomyPlaceholderExpansion extends ServicePlaceholderExpansion<EconomyController> {
13-
public ServiceEconomyPlaceholderExpansion(ServicePlugin plugin) {
12+
public class ServiceEconomyPlaceholderStore extends PlaceholderStore<EconomyController> {
13+
public ServiceEconomyPlaceholderStore(ServicePlugin plugin) {
1414
super(plugin, EconomyController.class);
1515
}
1616

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44
import net.thenextlvl.service.api.group.Group;
55
import net.thenextlvl.service.api.group.GroupController;
66
import net.thenextlvl.service.api.group.GroupHolder;
7-
import net.thenextlvl.service.placeholder.ServicePlaceholderExpansion;
7+
import net.thenextlvl.service.placeholder.api.PlaceholderStore;
88
import org.jspecify.annotations.NullMarked;
99

1010
import java.util.stream.Collectors;
1111

1212
@NullMarked
13-
public class ServiceGroupPlaceholderExpansion extends ServicePlaceholderExpansion<GroupController> {
14-
public ServiceGroupPlaceholderExpansion(ServicePlugin plugin) {
13+
public class ServiceGroupPlaceholderStore extends PlaceholderStore<GroupController> {
14+
public ServiceGroupPlaceholderStore(ServicePlugin plugin) {
1515
super(plugin, GroupController.class);
1616
}
1717

0 commit comments

Comments
 (0)