diff --git a/src/main/java/org/mvplugins/multiverse/core/command/MVCommandCompletions.java b/src/main/java/org/mvplugins/multiverse/core/command/MVCommandCompletions.java index 2fed28d46..60a23cfaa 100644 --- a/src/main/java/org/mvplugins/multiverse/core/command/MVCommandCompletions.java +++ b/src/main/java/org/mvplugins/multiverse/core/command/MVCommandCompletions.java @@ -40,8 +40,8 @@ import org.mvplugins.multiverse.core.config.node.functions.DefaultSuggesterProvider; import org.mvplugins.multiverse.core.config.handle.PropertyModifyAction; import org.mvplugins.multiverse.core.destination.DestinationInstance; +import org.mvplugins.multiverse.core.destination.DestinationSuggestionPacket; import org.mvplugins.multiverse.core.destination.DestinationsProvider; -import org.mvplugins.multiverse.core.destination.core.WorldDestination; import org.mvplugins.multiverse.core.permissions.CorePermissionsChecker; import org.mvplugins.multiverse.core.utils.REPatterns; import org.mvplugins.multiverse.core.utils.StringFormatter; @@ -235,9 +235,7 @@ private Collection suggestDestinationsWithPerms(CommandSender teleporter return destinationsProvider.suggestDestinations(teleporter, deststring).stream() .filter(packet -> corePermissionsChecker .checkDestinationPacketPermission(teleporter, Arrays.asList(players), packet)) - .map(packet -> packet.destination() instanceof WorldDestination - ? packet.destinationString() - : packet.destination().getIdentifier() + ":" + packet.destinationString()) + .map(DestinationSuggestionPacket::parsableString) .toList(); } diff --git a/src/main/java/org/mvplugins/multiverse/core/config/CoreConfigNodes.java b/src/main/java/org/mvplugins/multiverse/core/config/CoreConfigNodes.java index d591b1b9b..e14b4bf82 100644 --- a/src/main/java/org/mvplugins/multiverse/core/config/CoreConfigNodes.java +++ b/src/main/java/org/mvplugins/multiverse/core/config/CoreConfigNodes.java @@ -20,7 +20,6 @@ import org.mvplugins.multiverse.core.config.node.functions.NodeStringParser; import org.mvplugins.multiverse.core.config.node.serializer.NodeSerializer; import org.mvplugins.multiverse.core.destination.DestinationsProvider; -import org.mvplugins.multiverse.core.destination.core.WorldDestination; import org.mvplugins.multiverse.core.dynamiclistener.EventPriorityMapper; import org.mvplugins.multiverse.core.event.MVDebugModeEvent; import org.mvplugins.multiverse.core.exceptions.MultiverseException; @@ -547,14 +546,8 @@ private N node(N node) { .hidden() .build()); - // todo: Maybe combine with the similar method in MVCommandCompletion but that has permission checking private Collection suggestDestinations(CommandSender sender, String input) { - return destinationsProvider.get().suggestDestinations(sender, input) - .stream() - .map(packet -> packet.destination() instanceof WorldDestination - ? packet.destinationString() - : packet.destination().getIdentifier() + ":" + packet.destinationString()) - .toList(); + return destinationsProvider.get().suggestDestinationStrings(sender, input); } private static final class DimensionFormatNodeSerializer implements NodeSerializer { diff --git a/src/main/java/org/mvplugins/multiverse/core/destination/DestinationSuggestionPacket.java b/src/main/java/org/mvplugins/multiverse/core/destination/DestinationSuggestionPacket.java index fafc9b6ae..7d496011a 100644 --- a/src/main/java/org/mvplugins/multiverse/core/destination/DestinationSuggestionPacket.java +++ b/src/main/java/org/mvplugins/multiverse/core/destination/DestinationSuggestionPacket.java @@ -1,5 +1,8 @@ package org.mvplugins.multiverse.core.destination; +import org.jetbrains.annotations.ApiStatus; +import org.mvplugins.multiverse.core.destination.core.WorldDestination; + /** * Data of a possible destination for tab completion and permission checking * @@ -8,4 +11,19 @@ * @param finerPermissionSuffix The finer permission suffix */ public record DestinationSuggestionPacket(Destination destination, String destinationString, String finerPermissionSuffix) { + + /** + * Gets a parsable string representation of the destination that is most likely valid for + * {@link DestinationsProvider#parseDestination(String)}. + * + * @return The parsable string + * + * @since 5.1 + */ + @ApiStatus.AvailableSince("5.1") + public String parsableString() { + return destination instanceof WorldDestination + ? destinationString + : destination.getIdentifier() + ":" + destinationString; + } } diff --git a/src/main/java/org/mvplugins/multiverse/core/destination/DestinationsProvider.java b/src/main/java/org/mvplugins/multiverse/core/destination/DestinationsProvider.java index f1cd37dd6..b4368c8f9 100644 --- a/src/main/java/org/mvplugins/multiverse/core/destination/DestinationsProvider.java +++ b/src/main/java/org/mvplugins/multiverse/core/destination/DestinationsProvider.java @@ -8,6 +8,7 @@ import co.aikar.locales.MessageKeyProvider; import jakarta.inject.Inject; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jvnet.hk2.annotations.Service; @@ -95,12 +96,36 @@ public void registerDestination(@NotNull Destination destination) { return this.destinationMap.values(); } + /** + * Gets suggestions for possible parsable destinations. + * + * @param sender The target sender context. + * @param destinationParams The current user input. + * @return A collection of destination suggestions. + */ public @NotNull Collection suggestDestinations(@NotNull CommandSender sender, @Nullable String destinationParams) { return this.getDestinations().stream() .flatMap(destination -> destination.suggestDestinations(sender, destinationParams).stream()) .toList(); } + /** + * Gets suggestions for possible parsable destinations. + * + * @param sender The target sender context. + * @param destinationParams The current user input. + * @return A collection of destination suggestions in parsable string format. + * + * @since 5.1 + */ + @ApiStatus.AvailableSince("5.1") + public @NotNull Collection suggestDestinationStrings(@NotNull CommandSender sender, @Nullable String destinationParams) { + return suggestDestinations(sender, destinationParams) + .stream() + .map(DestinationSuggestionPacket::parsableString) + .toList(); + } + public enum ParseFailureReason implements FailureReason { INVALID_DESTINATION_ID(MVCorei18n.DESTINATION_PARSE_FAILUREREASON_INVALIDDESTINATIONID), ;