diff --git a/src/main/java/com/alttd/hunger_games/commands/BaseCommand.java b/src/main/java/com/alttd/hunger_games/commands/BaseCommand.java index eef0038..5067920 100644 --- a/src/main/java/com/alttd/hunger_games/commands/BaseCommand.java +++ b/src/main/java/com/alttd/hunger_games/commands/BaseCommand.java @@ -39,7 +39,8 @@ public class BaseCommand implements CommandExecutor, TabExecutor { new NextPhase(round), new EndRound(round), new Stuck(main), - new Stats(statService) + new Stats(statService), + new ListPlayers(roundService) )); } diff --git a/src/main/java/com/alttd/hunger_games/commands/subcommands/ListPlayers.java b/src/main/java/com/alttd/hunger_games/commands/subcommands/ListPlayers.java new file mode 100644 index 0000000..cfd8e80 --- /dev/null +++ b/src/main/java/com/alttd/hunger_games/commands/subcommands/ListPlayers.java @@ -0,0 +1,71 @@ +package com.alttd.hunger_games.commands.subcommands; + +import com.alttd.hunger_games.commands.SubCommand; +import com.alttd.hunger_games.config.Messages; +import com.alttd.hunger_games.data_objects.PLAYER_STATE; +import com.alttd.hunger_games.services.RoundService; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.JoinConfiguration; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.*; + +public class ListPlayers extends SubCommand { + + private final RoundService roundService; + + public ListPlayers(RoundService roundService) { + this.roundService = roundService; + } + + @Override + public boolean onCommand(CommandSender commandSender, String[] args) { + Set registeredUuids = roundService.getPlayers(PLAYER_STATE.REGISTERED); + Set spectatingUuids = roundService.getPlayers(PLAYER_STATE.SPECTATING); + + List registeredNames = registeredUuids.stream() + .map(Bukkit::getPlayer) + .filter(Objects::nonNull) + .map(Player::name) + .toList(); + + List spectatingNames = spectatingUuids.stream() + .map(Bukkit::getPlayer) + .filter(Objects::nonNull) + .map(Player::name) + .toList(); + + Component inGamePlayers = Component.join(JoinConfiguration.commas(true), registeredNames); + Component spectators = Component.join(JoinConfiguration.commas(true), spectatingNames); + + int inGameCount = registeredNames.size(); + int totalCount = inGameCount + spectatingNames.size(); + + commandSender.sendRichMessage(Messages.COMMANDS.LIST_PLAYERS, + Placeholder.unparsed("in_game", String.valueOf(inGameCount)), + Placeholder.unparsed("total", String.valueOf(totalCount)), + Placeholder.component("in_game_players", inGamePlayers), + Placeholder.component("spectators", spectators) + ); + + return true; + } + + @Override + public String getName() { + return "list"; + } + + @Override + public List getTabComplete(CommandSender commandSender, String[] args) { + return Collections.emptyList(); + } + + @Override + public String getHelpMessage() { + return Messages.HELP.LIST; + } +} diff --git a/src/main/java/com/alttd/hunger_games/config/Messages.java b/src/main/java/com/alttd/hunger_games/config/Messages.java index 78392da..d74c986 100644 --- a/src/main/java/com/alttd/hunger_games/config/Messages.java +++ b/src/main/java/com/alttd/hunger_games/config/Messages.java @@ -33,6 +33,7 @@ public class Messages extends AbstractConfig { public static String RELOAD = "Reload config and messages: /hg reload"; public static String STUCK = "Teleport to safety if stuck: /hg stuck"; public static String STATS = "Show player stats: /hg stats [player]"; + public static String LIST = "List all players in the game and spectators: /hg list"; public static String END_ROUND = "End the game: /hg end"; @SuppressWarnings("unused") @@ -46,6 +47,7 @@ public class Messages extends AbstractConfig { RELOAD = config.getString(prefix, "reload", RELOAD); STUCK = config.getString(prefix, "stuck", STUCK); STATS = config.getString(prefix, "stats", STATS); + LIST = config.getString(prefix, "list", LIST); END_ROUND = config.getString(prefix, "end-round", END_ROUND); } } @@ -210,10 +212,15 @@ public class Messages extends AbstractConfig { private static final String prefix = "commands."; public static String NEXT_PHASE_SUCCESS = "Skipping to the next phase/stage."; + public static String LIST_PLAYERS = """ + HungerGames Players (/): + In Game: + Spectators: """; @SuppressWarnings("unused") private static void load() { NEXT_PHASE_SUCCESS = config.getString(prefix + "next-phase", "success", NEXT_PHASE_SUCCESS); + LIST_PLAYERS = config.getString(prefix, "list-players", LIST_PLAYERS); } } }