From a6f4f2d2d5b6f69d50cb3c3d58d32cc64f9d2725 Mon Sep 17 00:00:00 2001 From: Zax71 Date: Sat, 24 Feb 2024 12:26:05 +0000 Subject: [PATCH 1/2] Add /mv who and /mv whoall --- .../multiverse/core/commands/WhoCommand.java | 145 ++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 src/main/java/org/mvplugins/multiverse/core/commands/WhoCommand.java diff --git a/src/main/java/org/mvplugins/multiverse/core/commands/WhoCommand.java b/src/main/java/org/mvplugins/multiverse/core/commands/WhoCommand.java new file mode 100644 index 00000000..5eb03131 --- /dev/null +++ b/src/main/java/org/mvplugins/multiverse/core/commands/WhoCommand.java @@ -0,0 +1,145 @@ +package org.mvplugins.multiverse.core.commands; + +import co.aikar.commands.InvalidCommandArgument; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; +import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Optional; +import co.aikar.commands.annotation.Subcommand; +import co.aikar.commands.annotation.Syntax; +import jakarta.inject.Inject; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jvnet.hk2.annotations.Service; +import org.mvplugins.multiverse.core.commandtools.MultiverseCommand; +import org.mvplugins.multiverse.core.commandtools.MVCommandIssuer; +import org.mvplugins.multiverse.core.commandtools.MVCommandManager; +import org.mvplugins.multiverse.core.commandtools.flags.CommandValueFlag; +import org.mvplugins.multiverse.core.commandtools.flags.ParsedCommandFlags; +import org.mvplugins.multiverse.core.display.ContentDisplay; +import org.mvplugins.multiverse.core.display.filters.ContentFilter; +import org.mvplugins.multiverse.core.display.filters.DefaultContentFilter; +import org.mvplugins.multiverse.core.display.filters.RegexContentFilter; +import org.mvplugins.multiverse.core.display.handlers.PagedSendHandler; +import org.mvplugins.multiverse.core.display.parsers.MapContentProvider; +import org.mvplugins.multiverse.core.world.LoadedMultiverseWorld; +import org.mvplugins.multiverse.core.world.WorldManager; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@CommandAlias("mv") +public class WhoCommand extends MultiverseCommand { + + private final WorldManager worldManager; + + private final CommandValueFlag PAGE_FLAG = flag(CommandValueFlag + .builder("--page", Integer.class) + .addAlias("-p") + .context(value -> { + try { + return Integer.parseInt(value); + } catch (NumberFormatException e) { + throw new InvalidCommandArgument("Invalid page number: " + value); + } + }) + .build()); + + private final CommandValueFlag FILTER_FLAG = flag(CommandValueFlag + .builder("--filter", ContentFilter.class) + .addAlias("-f") + .context(value -> { + try { + return RegexContentFilter.fromString(value); + } catch (IllegalArgumentException e) { + throw new InvalidCommandArgument("Invalid filter: " + value); + } + }) + .build()); + + @Inject + WhoCommand(@NotNull MVCommandManager commandManager, @NotNull WorldManager worldManager) { + super(commandManager); + this.worldManager = worldManager; + } + + @Subcommand("whoall") + @CommandPermission("multiverse.core.list.who.all") + @CommandCompletion("@flags:groupName=mvwhocommand") + @Syntax("[--page ] [--filter ]") + @Description("{@@mv-core.who.all.description}") + void onWhoAllCommand( + MVCommandIssuer issuer, + + @Optional + @Syntax("[--page ] [--filter ]") + @Description("{@@mv-core.who.flags}") + String[] flags) { + ParsedCommandFlags parsedFlags = parseFlags(flags); + + // Send the display + getListDisplay(worldManager.getLoadedWorlds(), parsedFlags.flagValue(PAGE_FLAG, 1), parsedFlags.flagValue(FILTER_FLAG, DefaultContentFilter.get())).send(issuer); + + } + + @Subcommand("who") + @CommandPermission("multiverse.core.list.who") + @CommandCompletion("@mvworlds:scope=both @flags:groupName=mvwhocommand") + @Syntax(" [--page ] [--filter ]") + @Description("{@@mv-core.who.description}") + void onWhoCommand( + MVCommandIssuer issuer, + + @Syntax("") + @Description("{@@mv-core.who.world.description}") + LoadedMultiverseWorld inputtedWorld, + + @Optional + @Syntax("[--page ] [--filter ]") + @Description("{@@mv-core.who.flags}") + String[] flags) { + ParsedCommandFlags parsedFlags = parseFlags(flags); + + // Send the display + getListDisplay(inputtedWorld, parsedFlags.flagValue(PAGE_FLAG, 1), parsedFlags.flagValue(FILTER_FLAG, DefaultContentFilter.get())).send(issuer); + } + + private String phrasePlayerList(List players) { + return players.stream().map(Player::getName).collect(Collectors.joining(", ")); + } + + private ContentDisplay getListDisplay(LoadedMultiverseWorld world, int page, ContentFilter filter) { + Collection listingWorlds = new ArrayList<>(); + listingWorlds.add(world); + return getListDisplay(listingWorlds, page, filter); + } + + private ContentDisplay getListDisplay(Collection worlds, int page, ContentFilter filter) { + HashMap outMap = new HashMap<>(); + + // Add all the worlds to our hashmap + for (LoadedMultiverseWorld world : worlds) { + List players = world.getPlayers().getOrNull(); + + // If the world has 0 players in it, ignore it + if (players.isEmpty()) { + continue; + } + outMap.put(world.getAlias(), phrasePlayerList(players)); + } + + return ContentDisplay.create() + .addContent(MapContentProvider.forContent(outMap)) + .withSendHandler(PagedSendHandler.create() + .withHeader("%s====[ Multiverse World Players List ]====", ChatColor.AQUA) + .doPagination(true) + .withTargetPage(page) + .withFilter(filter)); + } +} From c640a251b6b321dcce6ce01c35f76b40a46bdbba Mon Sep 17 00:00:00 2001 From: Zax71 Date: Sat, 24 Feb 2024 13:03:12 +0000 Subject: [PATCH 2/2] Add i18n and tell user when a world is empty when using /mv who --- .../multiverse/core/commands/WhoCommand.java | 37 ++++++++++++++----- .../multiverse/core/utils/MVCorei18n.java | 8 ++++ .../resources/multiverse-core_en.properties | 8 ++++ 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/mvplugins/multiverse/core/commands/WhoCommand.java b/src/main/java/org/mvplugins/multiverse/core/commands/WhoCommand.java index 5eb03131..13e80c72 100644 --- a/src/main/java/org/mvplugins/multiverse/core/commands/WhoCommand.java +++ b/src/main/java/org/mvplugins/multiverse/core/commands/WhoCommand.java @@ -8,10 +8,12 @@ import co.aikar.commands.annotation.Description; import co.aikar.commands.annotation.Optional; import co.aikar.commands.annotation.Subcommand; import co.aikar.commands.annotation.Syntax; +import com.dumptruckman.minecraft.util.Logging; import jakarta.inject.Inject; import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jvnet.hk2.annotations.Service; import org.mvplugins.multiverse.core.commandtools.MultiverseCommand; import org.mvplugins.multiverse.core.commandtools.MVCommandIssuer; @@ -79,12 +81,17 @@ public class WhoCommand extends MultiverseCommand { @Optional @Syntax("[--page ] [--filter ]") - @Description("{@@mv-core.who.flags}") + @Description("{@@mv-core.who.flags.description}") String[] flags) { ParsedCommandFlags parsedFlags = parseFlags(flags); // Send the display - getListDisplay(worldManager.getLoadedWorlds(), parsedFlags.flagValue(PAGE_FLAG, 1), parsedFlags.flagValue(FILTER_FLAG, DefaultContentFilter.get())).send(issuer); + getListDisplay( + worldManager.getLoadedWorlds(), + parsedFlags.flagValue(PAGE_FLAG, 1), + parsedFlags.flagValue(FILTER_FLAG, DefaultContentFilter.get()), + true + ).send(issuer); } @@ -102,35 +109,45 @@ public class WhoCommand extends MultiverseCommand { @Optional @Syntax("[--page ] [--filter ]") - @Description("{@@mv-core.who.flags}") + @Description("{@@mv-core.who.flags.description}") String[] flags) { ParsedCommandFlags parsedFlags = parseFlags(flags); // Send the display - getListDisplay(inputtedWorld, parsedFlags.flagValue(PAGE_FLAG, 1), parsedFlags.flagValue(FILTER_FLAG, DefaultContentFilter.get())).send(issuer); + getListDisplay( + inputtedWorld, + parsedFlags.flagValue(PAGE_FLAG, 1), + parsedFlags.flagValue(FILTER_FLAG, DefaultContentFilter.get()), + false + ).send(issuer); } private String phrasePlayerList(List players) { return players.stream().map(Player::getName).collect(Collectors.joining(", ")); } - private ContentDisplay getListDisplay(LoadedMultiverseWorld world, int page, ContentFilter filter) { + private ContentDisplay getListDisplay(LoadedMultiverseWorld world, int page, ContentFilter filter, boolean ignoreEmptyWorlds) { Collection listingWorlds = new ArrayList<>(); listingWorlds.add(world); - return getListDisplay(listingWorlds, page, filter); + return getListDisplay(listingWorlds, page, filter, ignoreEmptyWorlds); } - private ContentDisplay getListDisplay(Collection worlds, int page, ContentFilter filter) { + private ContentDisplay getListDisplay(Collection worlds, int page, ContentFilter filter, boolean ignoreEmptyWorlds) { HashMap outMap = new HashMap<>(); // Add all the worlds to our hashmap for (LoadedMultiverseWorld world : worlds) { - List players = world.getPlayers().getOrNull(); + @Nullable List players = world.getPlayers().getOrNull(); - // If the world has 0 players in it, ignore it - if (players.isEmpty()) { + // If the world has 0 players in it, say that it is empty + if ((players == null || players.isEmpty()) && !ignoreEmptyWorlds) { + outMap.put(world.getAlias(), ChatColor.RED + "Empty"); continue; } + if (players == null || players.isEmpty()) { + continue; + } + outMap.put(world.getAlias(), phrasePlayerList(players)); } diff --git a/src/main/java/org/mvplugins/multiverse/core/utils/MVCorei18n.java b/src/main/java/org/mvplugins/multiverse/core/utils/MVCorei18n.java index 42d5fab2..9e11b39b 100644 --- a/src/main/java/org/mvplugins/multiverse/core/utils/MVCorei18n.java +++ b/src/main/java/org/mvplugins/multiverse/core/utils/MVCorei18n.java @@ -101,6 +101,14 @@ public enum MVCorei18n implements MessageKeyProvider { UNLOAD_UNLOADING, UNLOAD_SUCCESS, + // who command + WHO_DESCRIPTION, + WHO_ALL_DESCRIPTION, + WHO_WORLD_DESCRIPTION, + WHO_FLAGS_DESCRIPTION, + WHO_EMPTY, + + // debug command DEBUG_INFO_OFF, DEBUG_INFO_ON, diff --git a/src/main/resources/multiverse-core_en.properties b/src/main/resources/multiverse-core_en.properties index bfb4bcd5..0130a8e9 100644 --- a/src/main/resources/multiverse-core_en.properties +++ b/src/main/resources/multiverse-core_en.properties @@ -139,6 +139,14 @@ mv-core.unload.success=&aWorld '{world}' unloaded! # /mv usage mv-core.usage.description=Show Multiverse-Core command usage. +# /mv who +# /mv whoall +mv-core.who.description=Lists the players in the world specified +mv-core.who.all.description=Lists the players in all worlds +mv-core.who.world.description=Name of the world you want to list players in +mv-core.who.flags.description=Filter - only shows entries matching this. Page - the page to show +mv-core.who.empty=&rEmpty + # commands error mv-core.commands.error.playersonly=&cThis command can only be used by players mv-core.commands.error.multiverseworldonly=&cThis can only be used in multiverse worlds