Skip to content

Commit b364d55

Browse files
GertiusRollczivLuckyyy
authored
GH-99 Support PlaceholderAPI Relational Placeholder (#122)
* Support PlaceholderAPI Relational Placeholder * Use optional. Rename Bi -> Relational, otherTarget -> viewer. --------- Co-authored-by: Rollczi <[email protected]> Co-authored-by: Martin Sulikowski <[email protected]>
1 parent 39cfdc9 commit b364d55

File tree

8 files changed

+67
-8
lines changed

8 files changed

+67
-8
lines changed

chatformatter-core/src/main/java/com/eternalcode/formatter/ChatFormatterPlugin.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,13 @@ public ChatFormatterPlugin(Plugin plugin) {
4040
PluginConfig pluginConfig = configManager.getPluginConfig();
4141

4242
this.placeholderRegistry = new PlaceholderRegistry();
43+
44+
PlaceholderAPIStack placeholderAPIStack = new PlaceholderAPIStack();
4345
this.placeholderRegistry.playerStack(new ConfiguredPlaceholderAPIStack(pluginConfig));
44-
this.placeholderRegistry.playerStack(new PlaceholderAPIStack());
46+
this.placeholderRegistry.playerStack(placeholderAPIStack);
47+
this.placeholderRegistry.playerRelationalStack(placeholderAPIStack);
48+
49+
4550
this.templateService = new TemplateService(pluginConfig);
4651
this.rankProvider = new VaultRankProvider(server);
4752
UpdaterService updaterService = new UpdaterService(plugin.getDescription());

chatformatter-core/src/main/java/com/eternalcode/formatter/ChatHandlerImpl.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.eternalcode.formatter;
22

3+
import java.util.Optional;
34
import static net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection;
45

56
import com.eternalcode.formatter.adventure.TextColorTagResolver;
@@ -90,11 +91,14 @@ class ChatHandlerImpl implements ChatHandler {
9091
@Override
9192
public ChatRenderedMessage process(ChatMessage chatMessage) {
9293
Player sender = chatMessage.sender();
94+
Optional<Player> viewer = chatMessage.viewer();
9395

9496
String format = this.settings.getRawFormat(this.rankProvider.getRank(sender));
9597

9698
format = this.templateService.applyTemplates(format);
97-
format = this.placeholderRegistry.format(format, sender);
99+
format = viewer.isEmpty()
100+
? this.placeholderRegistry.format(format, sender)
101+
: this.placeholderRegistry.format(format, sender, viewer.get());
98102

99103
format = Legacy.clearSection(format);
100104
format = Legacy.legacyToAdventure(format);
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.eternalcode.formatter;
22

3+
import java.util.Optional;
34
import org.bukkit.entity.Player;
45

5-
public record ChatMessage(Player sender, String jsonMessage) {
6-
6+
public record ChatMessage(Player sender, Optional<Player> viewer, String jsonMessage) {
77
}

chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/PlaceholderAPIStack.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@
22

33
import me.clip.placeholderapi.PlaceholderAPI;
44
import org.bukkit.entity.Player;
5-
import com.eternalcode.formatter.placeholder.PlayerPlaceholderStack;
65

7-
public class PlaceholderAPIStack implements PlayerPlaceholderStack {
6+
public class PlaceholderAPIStack implements PlayerPlaceholderStack, PlayerRelationalPlaceholderStack {
87

98
@Override
109
public String apply(String text, Player target) {
1110
return PlaceholderAPI.setPlaceholders(target, text);
1211
}
1312

13+
@Override
14+
public String apply(String text, Player target, Player viewer) {
15+
return PlaceholderAPI.setRelationalPlaceholders(target, viewer, text);
16+
}
17+
1418
}

chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/PlaceholderRegistry.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@ public class PlaceholderRegistry {
1111

1212
private final Map<String, Placeholder> placeholders = new HashMap<>();
1313
private final Map<String, PlayerPlaceholder> playerPlaceholders = new HashMap<>();
14+
private final Map<String, PlayerRelationalPlaceholder> playerRelationalPlaceholders = new HashMap<>();
1415

1516
private final Set<PlaceholderStack> stacks = new HashSet<>();
1617
private final Set<PlayerPlaceholderStack> playerStacks = new HashSet<>();
18+
private final Set<PlayerRelationalPlaceholderStack> playerRelationalStacks = new HashSet<>();
1719

1820
public void placeholder(String key, Placeholder placeholder) {
1921
this.placeholders.put(key, placeholder);
@@ -23,6 +25,10 @@ public void playerPlaceholder(String key, PlayerPlaceholder placeholder) {
2325
this.playerPlaceholders.put(key, placeholder);
2426
}
2527

28+
public void playerRelationalPlaceholder(String key, PlayerRelationalPlaceholder placeholder) {
29+
this.playerRelationalPlaceholders.put(key, placeholder);
30+
}
31+
2632
public void stack(PlaceholderStack stack) {
2733
this.stacks.add(stack);
2834
}
@@ -31,6 +37,10 @@ public void playerStack(PlayerPlaceholderStack stack) {
3137
this.playerStacks.add(stack);
3238
}
3339

40+
public void playerRelationalStack(PlayerRelationalPlaceholderStack stack) {
41+
this.playerRelationalStacks.add(stack);
42+
}
43+
3444
public String format(String text) {
3545
for (PlaceholderStack stack : this.stacks) {
3646
text = stack.apply(text);
@@ -55,4 +65,16 @@ public String format(String text, Player target) {
5565
return this.format(text);
5666
}
5767

68+
public String format(String text, Player target, Player viewer) {
69+
for (PlayerRelationalPlaceholderStack stack : this.playerRelationalStacks) {
70+
text = stack.apply(text, target, viewer);
71+
}
72+
73+
for (Map.Entry<String, PlayerRelationalPlaceholder> entry : this.playerRelationalPlaceholders.entrySet()) {
74+
text = text.replace(entry.getKey(), entry.getValue().extract(target, viewer));
75+
}
76+
77+
return this.format(text, target);
78+
}
79+
5880
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.eternalcode.formatter.placeholder;
2+
3+
import org.bukkit.entity.Player;
4+
5+
@FunctionalInterface
6+
public interface PlayerRelationalPlaceholder {
7+
8+
String extract(Player target, Player viewer);
9+
10+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.eternalcode.formatter.placeholder;
2+
3+
import org.bukkit.entity.Player;
4+
5+
public interface PlayerRelationalPlaceholderStack {
6+
7+
String apply(String text, Player target, Player viewer);
8+
}

chatformatter-paper-plugin/src/main/java/com/eternalcode/formatter/paper/PaperChatEventExecutor.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,20 @@
44
import com.eternalcode.formatter.ChatMessage;
55
import com.eternalcode.formatter.ChatRenderedMessage;
66
import io.papermc.paper.event.player.AsyncChatEvent;
7+
import net.kyori.adventure.identity.Identity;
78
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
9+
import org.bukkit.entity.Player;
810
import org.bukkit.event.Event;
911
import org.bukkit.event.EventException;
1012
import org.bukkit.event.Listener;
1113
import org.bukkit.plugin.EventExecutor;
1214
import org.jetbrains.annotations.NotNull;
1315

16+
import java.util.Optional;
17+
1418
class PaperChatEventExecutor implements EventExecutor {
1519

16-
private final static GsonComponentSerializer GSON = GsonComponentSerializer.gson();
20+
private static final GsonComponentSerializer GSON = GsonComponentSerializer.gson();
1721

1822
@Override
1923
public void execute(@NotNull Listener listener, @NotNull Event event) throws EventException {
@@ -27,8 +31,10 @@ public void execute(@NotNull Listener listener, @NotNull Event event) throws Eve
2731

2832
paperEvent.renderer((source, sourceDisplayName, message, viewer) -> {
2933
String jsonMessage = GSON.serialize(message);
34+
Optional<Player> optionalViewer = viewer.get(Identity.UUID)
35+
.map(uuid -> source.getServer().getPlayer(uuid));
3036

31-
ChatMessage chatMessage = new ChatMessage(source, jsonMessage);
37+
ChatMessage chatMessage = new ChatMessage(source, optionalViewer, jsonMessage);
3238
ChatRenderedMessage result = handler.process(chatMessage);
3339

3440
return GSON.deserialize(result.jsonMessage());

0 commit comments

Comments
 (0)