Skip to content

Commit 6aaba51

Browse files
authored
Update for MiniPlaceholders v3 (#690)
1 parent 6865e0a commit 6aaba51

File tree

13 files changed

+161
-85
lines changed

13 files changed

+161
-85
lines changed

common/src/main/java/net/draycia/carbon/common/command/commands/NicknameCommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ private void checkOthersNickname(final Audience sender, final CarbonPlayer targe
177177

178178
private static Component parseNickname(final Commander sender, final String nick) {
179179
// trim one level of quotes, to allow for nicknames which collide with command literals
180-
return TagPermissions.parseTags(TagPermissions.NICKNAME, trimQuotes(nick), sender::hasPermission);
180+
return TagPermissions.parseTags(sender, TagPermissions.NICKNAME, trimQuotes(nick), sender::hasPermission);
181181
}
182182

183183
private static String trimQuotes(final String string) {

common/src/main/java/net/draycia/carbon/common/command/commands/PartyCommands.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ private void createParty(final CommandContext<PlayerCommander> ctx) {
184184
return;
185185
}
186186
final String name = ctx.getOrDefault("name", player.username() + "'s party");
187-
final Component component = TagPermissions.parseTags(TagPermissions.PARTY_NAME, name, player::hasPermission);
187+
final Component component = TagPermissions.parseTags(player, TagPermissions.PARTY_NAME, name, player::hasPermission);
188188
final Party party;
189189
try {
190190
party = this.userManager.createParty(component);

common/src/main/java/net/draycia/carbon/common/integration/miniplaceholders/MiniPlaceholdersExpansion.java

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@
2222
import com.google.inject.Inject;
2323
import com.google.inject.Injector;
2424
import io.github.miniplaceholders.api.Expansion;
25-
import io.github.miniplaceholders.api.MiniPlaceholders;
26-
import java.util.Objects;
2725
import java.util.UUID;
2826
import net.draycia.carbon.api.channels.ChannelRegistry;
2927
import net.draycia.carbon.api.channels.ChatChannel;
@@ -44,8 +42,6 @@ public final class MiniPlaceholdersExpansion {
4442
private final UserManager<?> userManager;
4543
private final ChannelRegistry channels;
4644

47-
private static byte miniPlaceholdersLoaded = -1;
48-
4945
@Inject
5046
private MiniPlaceholdersExpansion(
5147
final UserManager<?> userManager,
@@ -56,39 +52,45 @@ private MiniPlaceholdersExpansion(
5652
}
5753

5854
public static void register(final Injector injector) {
59-
if (miniPlaceholdersLoaded()) {
55+
if (MiniPlaceholdersUtil.miniPlaceholdersLoaded()) {
6056
injector.getInstance(MiniPlaceholdersExpansion.class).registerExpansion();
6157
}
6258
}
6359

64-
public static boolean miniPlaceholdersLoaded() {
65-
if (miniPlaceholdersLoaded == -1) {
66-
try {
67-
final String name = MiniPlaceholders.class.getName();
68-
Objects.requireNonNull(name);
69-
miniPlaceholdersLoaded = 1;
70-
} catch (final NoClassDefFoundError error) {
71-
miniPlaceholdersLoaded = 0;
72-
}
73-
}
74-
return miniPlaceholdersLoaded == 1;
75-
}
76-
7760
private void registerExpansion() {
7861
final Expansion expansion = Expansion.builder("carbonchat")
79-
.filter(audience -> audience.get(Identity.UUID).isPresent())
80-
.audiencePlaceholder("party", (audience, queue, ctx) ->
81-
Tag.selfClosingInserting(this.partyName(id(audience))))
82-
.audiencePlaceholder("nickname", (audience, queue, ctx) ->
83-
Tag.selfClosingInserting(this.nickname(id(audience))))
84-
.audiencePlaceholder("displayname", (audience, queue, ctx) ->
85-
Tag.selfClosingInserting(this.displayName(id(audience))))
86-
.audiencePlaceholder("channel_key", (audience, queue, ctx) ->
87-
Tag.preProcessParsed(this.selectedChannelKey(id(audience))))
62+
.audiencePlaceholder("party", (audience, queue, ctx) -> {
63+
if (!hasId(audience)) {
64+
return null;
65+
}
66+
return Tag.selfClosingInserting(this.partyName(id(audience)));
67+
})
68+
.audiencePlaceholder("nickname", (audience, queue, ctx) -> {
69+
if (!hasId(audience)) {
70+
return null;
71+
}
72+
return Tag.selfClosingInserting(this.nickname(id(audience)));
73+
})
74+
.audiencePlaceholder("displayname", (audience, queue, ctx) -> {
75+
if (!hasId(audience)) {
76+
return null;
77+
}
78+
return Tag.selfClosingInserting(this.displayName(id(audience)));
79+
})
80+
.audiencePlaceholder("channel_key", (audience, queue, ctx) -> {
81+
if (!hasId(audience)) {
82+
return null;
83+
}
84+
return Tag.preProcessParsed(this.selectedChannelKey(id(audience)));
85+
})
8886
.build();
8987
expansion.register();
9088
}
9189

90+
private static boolean hasId(final Audience audience) {
91+
return audience.get(Identity.UUID).isPresent();
92+
}
93+
9294
private static UUID id(final Audience audience) {
9395
return audience.get(Identity.UUID).orElseThrow();
9496
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*
2+
* CarbonChat
3+
*
4+
* Copyright (c) 2024 Josua Parks (Vicarious)
5+
* Contributors
6+
*
7+
* This program is free software: you can redistribute it and/or modify
8+
* it under the terms of the GNU General Public License as published by
9+
* the Free Software Foundation, either version 3 of the License, or
10+
* (at your option) any later version.
11+
*
12+
* This program is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Public License
18+
* along with this program. If not, see <https://www.gnu.org/licenses/>.
19+
*/
20+
package net.draycia.carbon.common.integration.miniplaceholders;
21+
22+
import io.github.miniplaceholders.api.MiniPlaceholders;
23+
import io.github.miniplaceholders.api.types.RelationalAudience;
24+
import java.util.Objects;
25+
import net.kyori.adventure.audience.Audience;
26+
import org.checkerframework.checker.nullness.qual.Nullable;
27+
28+
public final class MiniPlaceholdersUtil {
29+
30+
private static byte miniPlaceholdersLoaded = -1;
31+
32+
private MiniPlaceholdersUtil() {
33+
}
34+
35+
public static boolean miniPlaceholdersLoaded() {
36+
if (miniPlaceholdersLoaded == -1) {
37+
try {
38+
final String name = MiniPlaceholders.class.getName();
39+
Objects.requireNonNull(name);
40+
miniPlaceholdersLoaded = 1;
41+
} catch (final NoClassDefFoundError error) {
42+
miniPlaceholdersLoaded = 0;
43+
}
44+
}
45+
return miniPlaceholdersLoaded == 1;
46+
}
47+
48+
public static Audience wrapAudiences(final @Nullable Audience recipient, final Audience sender) {
49+
if (!miniPlaceholdersLoaded()) {
50+
return sender;
51+
}
52+
return wrapAudiences_(recipient, sender);
53+
}
54+
55+
private static Audience wrapAudiences_(final @Nullable Audience recipient, final Audience sender) {
56+
if (recipient == null) {
57+
return sender;
58+
}
59+
return RelationalAudience.from(recipient, sender);
60+
}
61+
}

common/src/main/java/net/draycia/carbon/common/listeners/ChatListenerInternal.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ protected ChatListenerInternal(
102102
if (sender instanceof WrappedCarbonPlayer wrapped) {
103103
message = wrapped.parseMessageTags(content);
104104
} else {
105-
message = TagPermissions.parseTags(TagPermissions.MESSAGE, content, sender::hasPermission);
105+
message = TagPermissions.parseTags(sender, TagPermissions.MESSAGE, content, sender::hasPermission);
106106
}
107107
if (probablyBlank(message)) {
108108
return null;

common/src/main/java/net/draycia/carbon/common/messages/TagPermissions.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@
2121

2222
import java.util.Map;
2323
import java.util.function.Predicate;
24+
import net.kyori.adventure.audience.Audience;
2425
import net.kyori.adventure.text.Component;
2526
import net.kyori.adventure.text.format.TextDecoration;
2627
import net.kyori.adventure.text.minimessage.MiniMessage;
2728
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
2829
import net.kyori.adventure.text.minimessage.tag.standard.StandardTags;
2930
import org.checkerframework.checker.nullness.qual.NonNull;
31+
import org.checkerframework.checker.nullness.qual.Nullable;
3032
import org.checkerframework.framework.qual.DefaultQualifier;
3133

3234
@DefaultQualifier(NonNull.class)
@@ -56,7 +58,13 @@ public final class TagPermissions {
5658
private TagPermissions() {
5759
}
5860

59-
public static Component parseTags(final String basePermission, final String message, final Predicate<String> permission, final TagResolver.Builder resolver) {
61+
public static Component parseTags(
62+
final @Nullable Audience audience,
63+
final String basePermission,
64+
final String message,
65+
final Predicate<String> permission,
66+
final TagResolver.Builder resolver
67+
) {
6068
boolean hasAllDecorations = false;
6169
for (final Map.Entry<String, TagResolver> entry : DEFAULT_TAGS.entrySet()) {
6270
if (permission.test(basePermission + '.' + entry.getKey())) {
@@ -79,11 +87,19 @@ public static Component parseTags(final String basePermission, final String mess
7987

8088
final MiniMessage miniMessage = MiniMessage.builder().tags(resolver.build()).build();
8189

90+
if (audience != null) {
91+
return miniMessage.deserialize(message, audience);
92+
}
8293
return miniMessage.deserialize(message);
8394
}
8495

85-
public static Component parseTags(final String basePermission, final String message, final Predicate<String> permission) {
86-
return parseTags(basePermission, message, permission, TagResolver.builder());
96+
public static Component parseTags(
97+
final @Nullable Audience audience,
98+
final String basePermission,
99+
final String message,
100+
final Predicate<String> permission
101+
) {
102+
return parseTags(audience, basePermission, message, permission, TagResolver.builder());
87103
}
88104

89105
}

common/src/main/java/net/draycia/carbon/common/users/WrappedCarbonPlayer.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import net.draycia.carbon.api.users.Party;
3434
import net.draycia.carbon.api.util.InventorySlot;
3535
import net.draycia.carbon.common.config.PrimaryConfig;
36-
import net.draycia.carbon.common.integration.miniplaceholders.MiniPlaceholdersExpansion;
36+
import net.draycia.carbon.common.integration.miniplaceholders.MiniPlaceholdersUtil;
3737
import net.draycia.carbon.common.messages.SourcedAudience;
3838
import net.draycia.carbon.common.messages.TagPermissions;
3939
import net.kyori.adventure.identity.Identity;
@@ -73,12 +73,12 @@ public CarbonPlayerCommon carbonPlayerCommon() {
7373
public Component parseMessageTags(final String message) {
7474
final TagResolver.Builder resolver = TagResolver.builder();
7575

76-
if (MiniPlaceholdersExpansion.miniPlaceholdersLoaded() && this.hasPermission("carbon.chatplaceholders")) {
77-
resolver.resolver(MiniPlaceholders.getGlobalPlaceholders());
78-
resolver.resolver(MiniPlaceholders.getAudiencePlaceholders(this));
76+
if (MiniPlaceholdersUtil.miniPlaceholdersLoaded() && this.hasPermission("carbon.chatplaceholders")) {
77+
resolver.resolver(MiniPlaceholders.globalPlaceholders());
78+
resolver.resolver(MiniPlaceholders.audiencePlaceholders());
7979
}
8080

81-
return TagPermissions.parseTags(TagPermissions.MESSAGE, message, this::hasPermission, resolver);
81+
return TagPermissions.parseTags(this, TagPermissions.MESSAGE, message, this::hasPermission, resolver);
8282
}
8383

8484
@Override

fabric/src/main/java/net/draycia/carbon/fabric/FabricMessageRenderer.java

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,10 @@
2323
import com.google.inject.Singleton;
2424
import io.github.miniplaceholders.api.MiniPlaceholders;
2525
import net.draycia.carbon.common.config.ConfigManager;
26+
import net.draycia.carbon.common.integration.miniplaceholders.MiniPlaceholdersUtil;
2627
import net.draycia.carbon.common.messages.CarbonMessageRenderer;
2728
import net.draycia.carbon.common.messages.RenderForTagResolver;
2829
import net.draycia.carbon.common.messages.SourcedAudience;
29-
import net.draycia.carbon.common.users.ConsoleCarbonPlayer;
30-
import net.draycia.carbon.fabric.users.CarbonPlayerFabric;
3130
import net.fabricmc.loader.api.FabricLoader;
3231
import net.kyori.adventure.audience.Audience;
3332
import net.kyori.adventure.text.Component;
@@ -57,22 +56,19 @@ public Component render(
5756
final String placeholderResolvedMessage = this.configManager.primaryConfig().applyCustomPlaceholders(intermediateMessage);
5857

5958
if (FabricLoader.getInstance().isModLoaded("miniplaceholders")) {
60-
tagResolver.resolver(MiniPlaceholders.getGlobalPlaceholders());
59+
tagResolver.resolver(MiniPlaceholders.globalPlaceholders());
6160

62-
if (receiver instanceof SourcedAudience sourced) {
63-
if (sourced.sender() instanceof CarbonPlayerFabric sender) {
64-
tagResolver.resolver(MiniPlaceholders.getAudiencePlaceholders(sender));
65-
if (sourced.recipient() instanceof CarbonPlayerFabric recipient && recipient.online()) {
66-
tagResolver.resolver(MiniPlaceholders.getRelationalPlaceholders(recipient, sender));
67-
}
68-
} else if (sourced.sender() instanceof ConsoleCarbonPlayer console) {
69-
// I don't know if this will ever actually resolve anything, or if anything supports console audience
70-
tagResolver.resolver(MiniPlaceholders.getAudiencePlaceholders(console));
71-
}
61+
if (receiver instanceof SourcedAudience) {
62+
tagResolver.resolver(MiniPlaceholders.audiencePlaceholders());
63+
tagResolver.resolver(MiniPlaceholders.relationalPlaceholders());
7264
}
7365
}
7466

75-
return MiniMessage.miniMessage().deserialize(placeholderResolvedMessage, tagResolver.build());
67+
final Audience parseAudience = receiver instanceof SourcedAudience sourced
68+
? MiniPlaceholdersUtil.wrapAudiences(sourced.recipient(), sourced.sender())
69+
: receiver;
70+
71+
return MiniMessage.miniMessage().deserialize(placeholderResolvedMessage, parseAudience, tagResolver.build());
7672
}
7773

7874
}

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ luckPermsApi = "5.4"
4444
essentialsx = "2.20.1"
4545
discordsrv = "1.28.1"
4646
placeholderapi = "2.11.6"
47-
miniplaceholders = "2.3.0"
47+
miniplaceholders = "3.0.1"
4848
jdbi = "3.49.5"
4949
hikari = "6.3.0"
5050
mysql = "9.3.0"

paper/src/main/java/net/draycia/carbon/paper/integration/dsrv/DSRVListener.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public void register() {
9797
if (carbonPlayer instanceof WrappedCarbonPlayer wrapped) {
9898
eventMessage = wrapped.parseMessageTags(messageContents);
9999
} else {
100-
eventMessage = TagPermissions.parseTags(TagPermissions.MESSAGE, messageContents, carbonPlayer::hasPermission);
100+
eventMessage = TagPermissions.parseTags(carbonPlayer, TagPermissions.MESSAGE, messageContents, carbonPlayer::hasPermission);
101101
}
102102

103103
DiscordSRV.debug(Debug.MINECRAFT_TO_DISCORD, "Received a CarbonChatEvent (player: " + carbonPlayer.username() + ")");

0 commit comments

Comments
 (0)