Skip to content

Commit

Permalink
lang 13 rework
Browse files Browse the repository at this point in the history
  • Loading branch information
FireInstall committed Feb 1, 2024
1 parent a06f7c0 commit bc8c4c2
Show file tree
Hide file tree
Showing 29 changed files with 354 additions and 262 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ public class Minigames extends JavaPlugin {
private MinigamePlayerManager playerManager;
private MinigameManager minigameManager;
private PlaceHolderManager placeHolderManager;
private CommandDispatcher disp;
private boolean debug;
private boolean hasPAPI = false;
private long lastUpdateCheck;
Expand Down Expand Up @@ -101,6 +102,10 @@ public PlaceHolderManager getPlaceHolderManager() {
return placeHolderManager;
}

public CommandDispatcher getCommandDispatcher(){
return disp;
}

public void onDisable() {
if (getPlugin() == null) {
this.getComponentLogger().info("Minigames is disabled");
Expand Down Expand Up @@ -213,7 +218,7 @@ public void onEnable() {
minigameSigns = new SignBase();
this.minigameManager.loadRewardSigns();

final CommandDispatcher disp = new CommandDispatcher();
disp = new CommandDispatcher();
PluginCommand command = this.getCommand("minigame");
if (command == null) {
throw (new NoSuchElementException("Could not find command `minigame`"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,29 +8,9 @@

import java.util.List;

public abstract class ACommand {
public abstract class ACommand implements ICommandInfo {
protected static final Minigames PLUGIN = Minigames.getPlugin();

abstract public @NotNull String getName();

/**
* if this returns null, no aliases exists. Only {@link #getName()} is always valid
*/
public @NotNull String @Nullable [] getAliases() {
return null;
}

abstract public boolean canBeConsole();

abstract public @NotNull Component getDescription();

abstract public Component getUsage();

/**
* If this returns null, everyone should be able to use this command!
*/
abstract public @Nullable String getPermission();

abstract public boolean onCommand(@NotNull CommandSender sender, @NotNull String @NotNull [] args);

abstract public @Nullable List<@NotNull String> onTabComplete(@NotNull CommandSender sender, @NotNull String @NotNull [] args);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,12 @@
import org.bukkit.command.TabCompleter;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.*;

public class CommandDispatcher implements CommandExecutor, TabCompleter {
private static final Map<String, ACommand> commands = new HashMap<>();
private static final Map<String, ACommand> commands = new TreeMap<>(); // sort by name for display in help
private static final Minigames plugin = Minigames.getPlugin();

static {
Expand Down Expand Up @@ -59,37 +60,25 @@ public class CommandDispatcher implements CommandExecutor, TabCompleter {
registerCommand(new ResourcePackCommand());
}

public static @NotNull Collection<ACommand> getCommands(){
return commands.values();
}

public static void registerCommand(ACommand command) {
commands.put(command.getName(), command);
}

public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
Player ply = null;
if (sender instanceof Player) {
ply = (Player) sender;
}

if (args != null && args.length > 0) {
ACommand comd = null;
ACommand cmd = getCommand(args[0]);

if (commands.containsKey(args[0].toLowerCase())) {
comd = commands.get(args[0].toLowerCase());
} else {
AliasCheck:
for (ACommand com : commands.values()) {
if (com.getAliases() != null) {
for (String alias : com.getAliases()) {
if (args[0].equalsIgnoreCase(alias)) {
comd = com;
break AliasCheck;
}
}
}
}
}

if (comd != null) {
if (ply != null || comd.canBeConsole()) {
if (cmd != null) {
if (ply != null || cmd.canBeConsole()) {
String[] shortArgs;
if (args.length > 1) {
shortArgs = new String[args.length - 1];
Expand All @@ -98,15 +87,15 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command
shortArgs = new String[]{};
}

if (ply == null || (comd.getPermission() == null || ply.hasPermission(comd.getPermission()))) {
boolean returnValue = comd.onCommand(sender, shortArgs);
if (ply == null || (cmd.getPermission() == null || ply.hasPermission(cmd.getPermission()))) {
boolean returnValue = cmd.onCommand(sender, shortArgs);
if (!returnValue) {
MinigameMessageManager.sendMgMessage(sender, MinigameMessageType.NONE, MgCommandLangKey.COMMAND_ERROR_INFO_HEADER);
MinigameMessageManager.sendMgMessage(sender, MinigameMessageType.NONE, MgCommandLangKey.COMMAND_ERROR_INFO_DESCRIPTION,
Placeholder.unparsed(MinigamePlaceHolderKey.TEXT.getKey(), command.getDescription()));
MinigameMessageManager.sendMgMessage(sender, MinigameMessageType.NONE, MgCommandLangKey.COMMAND_ERROR_INFO_USAGE,
Placeholder.unparsed(MinigamePlaceHolderKey.TEXT.getKey(), command.getUsage()));
if (comd.getAliases() != null) {
if (cmd.getAliases() != null) {
MinigameMessageManager.sendMgMessage(sender, MinigameMessageType.NONE, MgCommandLangKey.COMMAND_ERROR_INFO_ALIASES,
Placeholder.unparsed(MinigamePlaceHolderKey.TEXT.getKey(), String.join(", ", command.getAliases())));
}
Expand All @@ -131,6 +120,26 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command
return false;
}

public static @Nullable ACommand getCommand(@NotNull String name) {
ACommand comd = null;
if (commands.containsKey(name.toLowerCase())) {
comd = commands.get(name.toLowerCase());
} else {
AliasCheck:
for (ACommand com : commands.values()) {
if (com.getAliases() != null) {
for (String alias : com.getAliases()) {
if (name.equalsIgnoreCase(alias)) {
comd = com;
break AliasCheck;
}
}
}
}
}
return comd;
}

public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) {
if (args != null && args.length > 0) {
ACommand comd = commands.get(args[0].toLowerCase());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import java.util.ArrayList;
import java.util.List;

public class GlobalLoadoutCommand extends ACommand {
public class GlobalLoadoutCommand extends ACommand { //todo merge with loadout command
private final MinigameManager mdata = Minigames.getPlugin().getMinigameManager();

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,33 @@
package au.com.mineauz.minigames.commands;

import au.com.mineauz.minigames.MinigameUtils;
import au.com.mineauz.minigames.commands.set.ASetCommand;
import au.com.mineauz.minigames.commands.set.SetCommand;
import au.com.mineauz.minigames.managers.MinigameMessageManager;
import au.com.mineauz.minigames.managers.language.MinigameMessageType;
import au.com.mineauz.minigames.managers.language.MinigamePlaceHolderKey;
import au.com.mineauz.minigames.managers.language.langkeys.MgCommandLangKey;
import net.kyori.adventure.text.Component;
import org.bukkit.ChatColor;
import net.kyori.adventure.text.JoinConfiguration;
import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import org.bukkit.command.CommandSender;
import org.bukkit.permissions.Permissible;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class HelpCommand extends ACommand {
private final Pattern NUM_PATTERN = Pattern.compile("^\\d*$");
private final int COMMANDS_PER_SITE = 6; // just a random number. Change it if you know a better one!

@Override
public @NotNull String getName() {
Expand All @@ -23,74 +41,108 @@ public boolean canBeConsole() {

@Override
public @NotNull Component getDescription() {
return MinigameMessageManager.getMgMessage("command.help.description");
return MinigameMessageManager.getMgMessage(MgCommandLangKey.COMMAND_HELP_DESCRIPTION);
}

@Override
public String[] getUsage() {
return new String[]{"/minigame help"};
public Component getUsage() {
return MinigameMessageManager.getMgMessage(MgCommandLangKey.COMMAND_HELP_USAGE);
}

@Override
public @Nullable String getPermission() {
return "minigame.help";
}

@Override
public boolean onCommand(@NotNull CommandSender sender,
@NotNull String @NotNull [] args) {
sender.sendMessage(ChatColor.GREEN + MinigameMessageManager.getUnformattedMgMessage("command.info.header"));
sender.sendMessage(ChatColor.BLUE + "/minigame");
sender.sendMessage(ChatColor.GRAY + MinigameMessageManager.getUnformattedMgMessage("command.info.mgm"));
if (sender.hasPermission("minigame.join")) {
sender.sendMessage(ChatColor.BLUE + "/minigame join <Minigame>");
sender.sendMessage(MinigameMessageManager.getMessage(null, "command.info.join"));
}
if (sender.hasPermission("minigame.quit")) {
sender.sendMessage(ChatColor.BLUE + "/minigame quit");
sender.sendMessage(MinigameMessageManager.getMessage(null, "command.info.quit"));
if (sender.hasPermission("minigame.quit.other")) {
sender.sendMessage(MinigameMessageManager.getMessage(null, "command.info.quitOther"));
private Component makePage(@NotNull Permissible permissible, int pageNumber){
List<ICommandInfo> allCommands = new ArrayList<>(CommandDispatcher.getCommands());
allCommands.addAll(SetCommand.getSetCommands());
// filter per permission
allCommands = allCommands.stream().filter(cmd -> cmd.getPermission() == null || permissible.hasPermission(cmd.getPermission())).toList();

final int numPages = (int)Math.ceil((float) allCommands.size() / COMMANDS_PER_SITE);
pageNumber = Math.max(1, Math.min(pageNumber, numPages)); // stay in range

final List<ICommandInfo> commandsOfPage = allCommands.subList(COMMANDS_PER_SITE*(pageNumber-1), Math.min(allCommands.size(), pageNumber*COMMANDS_PER_SITE));
// command name + description + click event for detailed info
final Component pageCore = Component.join(JoinConfiguration.newlines(), commandsOfPage.stream().
map(cmd -> Component.text(cmd.getName()).append(Component.text(" - ")).append(cmd.getDescription()).
clickEvent(ClickEvent.suggestCommand("/minigame help " + cmd.getName()))).toList()); //todo needs formatting (not hardcoded)

final Component header = MinigameMessageManager.getMgMessage(MgCommandLangKey.COMMAND_HELP_LIST_HEADER,
Placeholder.unparsed(MinigamePlaceHolderKey.NUMBER.getKey(), String.valueOf(pageNumber)),
Placeholder.unparsed(MinigamePlaceHolderKey.MAX.getKey(), String.valueOf(numPages)));
//todo clickable next/back buttons on footer

return header.appendNewline().append(pageCore);
}

private static boolean sendHelpInfo(@NotNull CommandSender sender, @NotNull ICommandInfo setCommand) {
if (setCommand.getPermission() != null || sender.hasPermission(setCommand.getPermission())){
Component info = Component.empty();
if (setCommand.getAliases() != null) {
info = info.append(Component.text("[").append(Component.text(String.join(", ", setCommand.getAliases()))).append(Component.text("]")));
}

MinigameMessageManager.sendMessage(sender, MinigameMessageType.NONE,
MinigameMessageManager.getMgMessage(MgCommandLangKey.COMMAND_HELP_INFO_HEADER,
Placeholder.unparsed(MinigamePlaceHolderKey.TEXT.getKey(), setCommand.getName())).appendNewline().
append(info.appendNewline().append(setCommand.getUsage()).appendNewline().append(setCommand.getDescription())));//todo needs formatting (not hardcoded)
return true;
} else {
return false;
}
if (sender.hasPermission("minigame.end")) {
sender.sendMessage(ChatColor.BLUE + "/minigame end [Player]");
sender.sendMessage(MinigameMessageManager.getMessage(null, "command.info.end"));
}
if (sender.hasPermission("minigame.revert")) {
sender.sendMessage(ChatColor.BLUE + "/minigame revert");
sender.sendMessage(MinigameMessageManager.getMessage(null, "command.info.revert"));
}
if (sender.hasPermission("minigame.delete")) {
sender.sendMessage(ChatColor.BLUE + "/minigame delete <Minigame>");
sender.sendMessage(MinigameMessageManager.getMessage(null, "command.info.delete"));
}
if (sender.hasPermission("minigame.hint")) {
sender.sendMessage(ChatColor.BLUE + "/minigame hint <minigame>");
sender.sendMessage(MinigameMessageManager.getMessage(null, "command.info.hint"));
}
if (sender.hasPermission("minigame.toggletimer")) {
sender.sendMessage(ChatColor.BLUE + "/minigame toggletimer <Minigame>");
sender.sendMessage(MinigameMessageManager.getMessage(null, "command.info.timer"));
}
if (sender.hasPermission("minigame.list")) {
sender.sendMessage(ChatColor.BLUE + "/minigame list");
sender.sendMessage(MinigameMessageManager.getMessage(null, "command.info.list"));
}
if (sender.hasPermission("minigame.reload")) {
sender.sendMessage(ChatColor.BLUE + "/minigame reload");
sender.sendMessage(MinigameMessageManager.getMessage(null, "command.info.reload"));
}
}

sender.sendMessage(ChatColor.BLUE + "/minigame set <Minigame> <parameter>...");
sender.sendMessage(MinigameMessageManager.getMessage(null, "command.info.set"));
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull String @NotNull [] args) {
if (args.length > 0) {
if (NUM_PATTERN.matcher(args[0]).matches()){
MinigameMessageManager.sendMessage(sender, MinigameMessageType.NONE, makePage(sender, Integer.parseInt(args[0])));
} else {
ACommand subCommand = CommandDispatcher.getCommand(args[0]);

if (subCommand != null) {
return sendHelpInfo(sender, subCommand);
} else {
ASetCommand setCommand = SetCommand.getSetCommand(args[0]);

if (setCommand != null){
return sendHelpInfo(sender, setCommand);
} else {
return false;
}
}
}
} else {
MinigameMessageManager.sendMessage(sender, MinigameMessageType.NONE, makePage(sender, 1));
}
return true;
}

@Override
public @Nullable List<@NotNull String> onTabComplete(@NotNull CommandSender sender,
@NotNull String @NotNull [] args) {
public @Nullable List<@NotNull String> onTabComplete(@NotNull CommandSender sender, @NotNull String @NotNull [] args) {
if (args.length == 1) {
List<ICommandInfo> allCommands = new ArrayList<>(CommandDispatcher.getCommands());
allCommands.addAll(SetCommand.getSetCommands());
// filter per permission
allCommands = allCommands.stream().filter(cmd -> cmd.getPermission() == null || sender.hasPermission(cmd.getPermission())).toList();
// get number of filtered commands before the next step
final int numPages = (int)Math.ceil((float) allCommands.size() / COMMANDS_PER_SITE);

// can't reuse the stream from above, since using Stream#count() would terminate it.
// first map commands to name + aliases, then append all possible page numbers
List<String> result = Stream.concat(allCommands.stream().flatMap(c -> {
if (c.getAliases() != null) {
return Stream.concat(Stream.of(c.getName()), Arrays.stream(c.getAliases()));
} else {
return Stream.of(c.getName());
}
}), IntStream.range(1, numPages).boxed().map(String::valueOf)).toList();

return MinigameUtils.tabCompleteMatch(result, args[0]);
}

return null;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import java.util.ArrayList;
import java.util.List;

public class HintCommand extends ACommand {
public class HintCommand extends ACommand { //todo make subcommands for all treasure hunt ones

@Override
public @NotNull String getName() {
Expand Down Expand Up @@ -47,7 +47,7 @@ public String[] getUsage() {
public boolean onCommand(@NotNull CommandSender sender,
@NotNull String @NotNull [] args) {
MinigamePlayer player = PLUGIN.getPlayerManager().getMinigamePlayer((Player) sender);
if (args != null) {
if (args.length > 0) {
Minigame mgm = PLUGIN.getMinigameManager().getMinigame(args[0]);

if (mgm != null && mgm.getMinigameTimer() != null && mgm.getType() == MinigameType.GLOBAL &&
Expand Down
Loading

0 comments on commit bc8c4c2

Please sign in to comment.