fix: correctly parse help messages with prefix (#4652)

This commit is contained in:
Pierre Maurice Schwang 2025-05-24 14:39:31 +02:00 committed by GitHub
parent 629646ab06
commit 7da4eb1ab5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 74 additions and 44 deletions

View File

@ -24,6 +24,7 @@ import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -98,6 +99,14 @@ public enum CommandCategory implements Caption {
return MiniMessage.miniMessage().deserialize(getComponent(localeHolder)); return MiniMessage.miniMessage().deserialize(getComponent(localeHolder));
} }
@Override
public @NonNull Component toComponent(
@NonNull final LocaleHolder localeHolder,
final @NonNull TagResolver @NonNull ... tagResolvers
) {
return MiniMessage.miniMessage().deserialize(getComponent(localeHolder));
}
/** /**
* Checks if a player has access to this command category * Checks if a player has access to this command category
* *

View File

@ -113,38 +113,34 @@ public class Help extends Command {
} }
if (cat == null && page == 0) { if (cat == null && page == 0) {
TextComponent.Builder builder = Component.text(); TextComponent.Builder builder = Component.text();
builder.append(MINI_MESSAGE.deserialize(TranslatableCaption.of("help.help_header").getComponent(player))); builder.append(TranslatableCaption.of("help.help_header").toComponent(player));
for (CommandCategory c : CommandCategory.values()) { for (CommandCategory c : CommandCategory.values()) {
if (!c.canAccess(player)) { if (!c.canAccess(player)) {
continue; continue;
} }
builder.append(Component.newline()).append(MINI_MESSAGE builder.append(Component.newline());
.deserialize( builder.append(TranslatableCaption.of("help.help_info_item").toComponent(
TranslatableCaption.of("help.help_info_item").getComponent(player), player, TagResolver.builder()
TagResolver.builder() .tag("command", Tag.inserting(Component.text("/plot help")))
.tag("command", Tag.inserting(Component.text("/plot help"))) .tag("category", Tag.inserting(Component.text(c.name().toLowerCase())))
.tag("category", Tag.inserting(Component.text(c.name().toLowerCase()))) .tag("category_desc", Tag.inserting(c.toComponent(player)))
.tag("category_desc", Tag.inserting(c.toComponent(player))) .build()
.build() ));
));
} }
builder.append(Component.newline()).append(MINI_MESSAGE builder.append(Component.newline());
.deserialize( builder.append(TranslatableCaption.of("help.help_info_item").toComponent(
TranslatableCaption.of("help.help_info_item").getComponent(player), player, TagResolver.builder()
TagResolver.builder() .tag("command", Tag.inserting(Component.text("/plot help")))
.tag("command", Tag.inserting(Component.text("/plot help"))) .tag("category", Tag.inserting(Component.text("all")))
.tag("category", Tag.inserting(Component.text("all"))) .tag(
.tag( "category_desc", Tag.inserting(TranslatableCaption
"category_desc", .of("help.help_display_all_commands")
Tag.inserting(TranslatableCaption .toComponent(player))
.of("help.help_display_all_commands") )
.toComponent(player)) .build()
) ));
.build() builder.append(Component.newline());
)); builder.append(TranslatableCaption.of("help.help_footer").toComponent(player));
builder.append(Component.newline()).append(MINI_MESSAGE.deserialize(TranslatableCaption
.of("help.help_footer")
.getComponent(player)));
player.sendMessage(StaticCaption.of(MINI_MESSAGE.serialize(builder.asComponent()))); player.sendMessage(StaticCaption.of(MINI_MESSAGE.serialize(builder.asComponent())));
return true; return true;
} }

View File

@ -20,6 +20,7 @@ package com.plotsquared.core.configuration.caption;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.ComponentLike; import net.kyori.adventure.text.ComponentLike;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
/** /**
@ -44,6 +45,16 @@ public interface Caption {
*/ */
@NonNull Component toComponent(@NonNull LocaleHolder localeHolder); @NonNull Component toComponent(@NonNull LocaleHolder localeHolder);
/**
* Get the Adventure {@link ComponentLike} for this caption while applying custom {@link TagResolver}
* (apart from the default {@code core.prefix})
* @param localeHolder Local holder
* @param tagResolvers custom tag resolvers to replace placeholders / parameters
* @return {@link ComponentLike}
* @since TODO
*/
@NonNull Component toComponent(@NonNull LocaleHolder localeHolder, @NonNull TagResolver @NonNull... tagResolvers);
@NonNull String toString(); @NonNull String toString();
} }

View File

@ -21,6 +21,7 @@ package com.plotsquared.core.configuration.caption;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
public final class StaticCaption implements Caption { public final class StaticCaption implements Caption {
@ -51,6 +52,14 @@ public final class StaticCaption implements Caption {
return MiniMessage.miniMessage().deserialize(this.value); return MiniMessage.miniMessage().deserialize(this.value);
} }
@Override
public @NonNull Component toComponent(
@NonNull final LocaleHolder localeHolder,
final @NonNull TagResolver @NonNull ... tagResolvers
) {
return MiniMessage.miniMessage().deserialize(this.value, tagResolvers);
}
@Override @Override
public @NonNull String toString() { public @NonNull String toString() {
return "StaticCaption(" + value + ")"; return "StaticCaption(" + value + ")";

View File

@ -27,6 +27,7 @@ import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.Locale; import java.util.Locale;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -96,13 +97,23 @@ public final class TranslatableCaption implements NamespacedCaption {
@Override @Override
public @NonNull Component toComponent(@NonNull final LocaleHolder localeHolder) { public @NonNull Component toComponent(@NonNull final LocaleHolder localeHolder) {
return this.toComponent(localeHolder, new TagResolver[0]);
}
@Override
public @NonNull Component toComponent(
@NonNull final LocaleHolder localeHolder,
final @NonNull TagResolver @NonNull ... tagResolvers
) {
if (getKey().equals("core.prefix")) { if (getKey().equals("core.prefix")) {
return MiniMessage.miniMessage().deserialize(getComponent(localeHolder)); return MiniMessage.miniMessage().deserialize(getComponent(localeHolder));
} }
return MiniMessage.miniMessage().deserialize(getComponent(localeHolder), TagResolver.resolver( TagResolver[] finalResolvers = Arrays.copyOf(tagResolvers, tagResolvers.length + 1);
finalResolvers[finalResolvers.length - 1] = TagResolver.resolver(
"prefix", "prefix",
Tag.inserting(TranslatableCaption.of("core.prefix").toComponent(localeHolder)) Tag.inserting(TranslatableCaption.of("core.prefix").toComponent(localeHolder))
)); );
return MiniMessage.miniMessage().deserialize(getComponent(localeHolder), finalResolvers);
} }
@Override @Override

View File

@ -25,30 +25,24 @@ import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.util.StringMan; import com.plotsquared.core.util.StringMan;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.ComponentLike; import net.kyori.adventure.text.ComponentLike;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.Tag; import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public class HelpObject implements ComponentLike { public class HelpObject implements ComponentLike {
static final MiniMessage MINI_MESSAGE = MiniMessage.miniMessage();
private final Component rendered; private final Component rendered;
public HelpObject(final Command command, final String label, final PlotPlayer<?> audience) { public HelpObject(final Command command, final String label, final PlotPlayer<?> audience) {
rendered = MINI_MESSAGE.deserialize( this.rendered = TranslatableCaption.of("help.help_item").toComponent(audience, TagResolver.builder()
TranslatableCaption.of("help.help_item").getComponent(audience), .tag("usage", Tag.inserting(Component.text(command.getUsage().replace("{label}", label))))
TagResolver.builder() .tag("alias", Tag.inserting(Component.text(
.tag("usage", Tag.inserting(Component.text(command.getUsage().replace("{label}", label)))) command.getAliases().isEmpty() ? "" : StringMan.join(command.getAliases(), " | ")
.tag("alias", Tag.inserting(Component.text( )))
command.getAliases().isEmpty() ? "" : StringMan.join(command.getAliases(), " | ") .tag("desc", Tag.inserting(command.getDescription().toComponent(audience)))
))) .tag("arguments", Tag.inserting(Component.text(buildArgumentList(command.getRequiredArguments()))))
.tag("desc", Tag.inserting(command.getDescription().toComponent(audience))) .tag("label", Tag.inserting(Component.text(label)))
.tag("arguments", Tag.inserting(Component.text(buildArgumentList(command.getRequiredArguments())))) .build());
.tag("label", Tag.inserting(Component.text(label)))
.build()
);
} }
private String buildArgumentList(final Argument<?>[] arguments) { private String buildArgumentList(final Argument<?>[] arguments) {