diff --git a/src/main/java/net/knarcraft/stargatecommand/command/CommandDial.java b/src/main/java/net/knarcraft/stargatecommand/command/CommandDial.java index e6ad748..c189442 100644 --- a/src/main/java/net/knarcraft/stargatecommand/command/CommandDial.java +++ b/src/main/java/net/knarcraft/stargatecommand/command/CommandDial.java @@ -5,8 +5,10 @@ import net.TheDgtl.Stargate.manager.PermissionManager; import net.TheDgtl.Stargate.network.Network; import net.TheDgtl.Stargate.network.RegistryAPI; import net.TheDgtl.Stargate.network.portal.RealPortal; -import net.knarcraft.stargatecommand.StargateCommand; +import net.knarcraft.stargatecommand.formatting.TranslatableMessage; +import net.knarcraft.stargatecommand.manager.IconManager; import net.knarcraft.stargatecommand.manager.OverrideManager; +import net.knarcraft.stargatecommand.property.Icon; import net.knarcraft.stargatecommand.property.StargateCommandCommand; import net.knarcraft.stargatecommand.util.PortalFinderHelper; import org.bukkit.command.Command; @@ -15,12 +17,15 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +import static net.knarcraft.stargatecommand.formatting.StringFormatter.getTranslatedErrorMessage; +import static net.knarcraft.stargatecommand.formatting.StringFormatter.getTranslatedInfoMessage; + /** * This command represents the dial command for dialing any available Stargate */ public class CommandDial implements CommandExecutor { - private final char spaceReplacement = StargateCommand.getSpaceReplacementCharacter(); + private final String spaceReplacement = IconManager.getIconString(Icon.SPACE_REPLACEMENT); private final StargateAPI stargateAPI; private final RegistryAPI registryAPI; @@ -38,50 +43,50 @@ public class CommandDial implements CommandExecutor { public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { if (!(commandSender instanceof Player player)) { - commandSender.sendMessage("This command can only be used by players"); + commandSender.sendMessage(getTranslatedErrorMessage(TranslatableMessage.COMMAND_PLAYER_ONLY)); return true; } if (!player.hasPermission(StargateCommandCommand.DIAL.getPermissionNode())) { - player.sendMessage("Permission Denied"); + player.sendMessage(getTranslatedErrorMessage(TranslatableMessage.PERMISSION_DENIED)); return true; } if (args.length < 2) { - player.sendMessage("You need to provide a network name and a portal name to dial"); + player.sendMessage(getTranslatedErrorMessage(TranslatableMessage.COMMAND_DIAL_ARGUMENTS)); return true; } PermissionManager permissionManager = stargateAPI.getPermissionManager(player); - String networkName = args[0].replace(spaceReplacement, ' '); - String portalName = args[1].replace(spaceReplacement, ' '); + String networkName = args[0].replace(spaceReplacement, " "); + String portalName = args[1].replace(spaceReplacement, " "); + + //Validate that the network and portal exists, and that the player can access the portal Network network = registryAPI.getNetwork(networkName, false); if (network == null) { - commandSender.sendMessage("Invalid network selected"); + commandSender.sendMessage(getTranslatedErrorMessage(TranslatableMessage.INVALID_NETWORK_GIVEN)); return true; } - RealPortal targetPortal = (RealPortal) network.getPortal(portalName); if (targetPortal == null) { - commandSender.sendMessage("Invalid portal selected"); + commandSender.sendMessage(getTranslatedErrorMessage(TranslatableMessage.INVALID_PORTAL_GIVEN)); return true; } - if (!permissionManager.hasAccessPermission(targetPortal)) { - commandSender.sendMessage("You don't have access to the selected portal"); + commandSender.sendMessage(getTranslatedErrorMessage(TranslatableMessage.PORTAL_NO_ACCESS)); return true; } //Find any Stargate block in the player's line of sight RealPortal originPortal = (RealPortal) PortalFinderHelper.findPortalByRaytrace(registryAPI, player, 10); if (originPortal == null) { - player.sendMessage("You need to look at a portal to dial"); + player.sendMessage(getTranslatedErrorMessage(TranslatableMessage.NO_PORTAL_IN_SIGHT)); return true; } originPortal.overrideDestination(targetPortal); OverrideManager.storeOverriddenDestination(originPortal); originPortal.open(player); - player.sendMessage("Your Stargate has been prepared"); + player.sendMessage(getTranslatedInfoMessage(TranslatableMessage.DIAL_SUCCESSFUL)); return true; } diff --git a/src/main/java/net/knarcraft/stargatecommand/command/CommandVisualizer.java b/src/main/java/net/knarcraft/stargatecommand/command/CommandVisualizer.java index 115e0c7..0792844 100644 --- a/src/main/java/net/knarcraft/stargatecommand/command/CommandVisualizer.java +++ b/src/main/java/net/knarcraft/stargatecommand/command/CommandVisualizer.java @@ -5,19 +5,25 @@ import net.TheDgtl.Stargate.network.RegistryAPI; import net.TheDgtl.Stargate.network.portal.FixedPortal; import net.TheDgtl.Stargate.network.portal.Portal; import net.TheDgtl.Stargate.network.portal.PortalFlag; -import net.knarcraft.stargatecommand.StargateCommand; +import net.knarcraft.stargatecommand.formatting.StringFormatter; +import net.knarcraft.stargatecommand.formatting.TranslatableMessage; +import net.knarcraft.stargatecommand.formatting.Translator; +import net.knarcraft.stargatecommand.manager.IconManager; +import net.knarcraft.stargatecommand.property.Icon; import net.knarcraft.stargatecommand.property.StargateCommandCommand; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; +import static net.knarcraft.stargatecommand.formatting.StringFormatter.getTranslatedErrorMessage; + /** * This command represents the command for visualizing a Stargate network */ public class CommandVisualizer implements CommandExecutor { - private final char spaceReplacement = StargateCommand.getSpaceReplacementCharacter(); + private final String spaceReplacement = IconManager.getIconString(Icon.SPACE_REPLACEMENT); private final RegistryAPI registryAPI; /** @@ -33,57 +39,60 @@ public class CommandVisualizer implements CommandExecutor { public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { if (!commandSender.hasPermission(StargateCommandCommand.VISUALIZER.getPermissionNode())) { - commandSender.sendMessage("Permission Denied"); + commandSender.sendMessage(getTranslatedErrorMessage(TranslatableMessage.PERMISSION_DENIED)); return true; } if (args.length < 1) { - commandSender.sendMessage("A network must be provided"); + commandSender.sendMessage(getTranslatedErrorMessage(TranslatableMessage.COMMAND_VISUALIZER_ARGUMENTS)); return true; } - Network network = registryAPI.getNetwork(args[0].replace(spaceReplacement, ' '), false); + Network network = registryAPI.getNetwork(args[0].replace(spaceReplacement, " "), false); if (network == null) { - commandSender.sendMessage("You must provide a valid network to visualize"); + commandSender.sendMessage(getTranslatedErrorMessage(TranslatableMessage.INVALID_NETWORK_GIVEN)); return true; } StringBuilder stringBuilder = new StringBuilder(); - - stringBuilder.append("Symbol explanation: ").append("\n"); - stringBuilder.append("⇒ = hidden, ⇄ = not hidden").append("\n"); - stringBuilder.append("⬛ = always open, ⬜ = not always open").append("\n"); - stringBuilder.append("↯ = random destination, ↠ = non-random destination").append("\n"); - stringBuilder.append("-> = fixed portal going to the specified portal").append("\n").append('|').append("\n"); - stringBuilder.append("All portals in network ").append(network.getName()).append(":"); + stringBuilder.append(Translator.getTranslatedMessage(TranslatableMessage.COMMAND_VISUALIZER_FORMAT)); //Print info about all portals in the network for (Portal portal : network.getAllPortals()) { stringBuilder.append("\n"); + StringBuilder iconBuilder = new StringBuilder(); if (portal.hasFlag(PortalFlag.HIDDEN)) { - stringBuilder.append('⇒'); + iconBuilder.append(Icon.HIDDEN.getPlaceholder()); } else { - stringBuilder.append('⇄'); + iconBuilder.append(Icon.NOT_HIDDEN.getPlaceholder()); } if (portal.hasFlag(PortalFlag.ALWAYS_ON)) { - stringBuilder.append('⬛'); + iconBuilder.append(Icon.ALWAYS_ON.getPlaceholder()); } else { - stringBuilder.append('⬜'); + iconBuilder.append(Icon.NOT_ALWAYS_ON.getPlaceholder()); } if (portal.hasFlag(PortalFlag.RANDOM)) { - stringBuilder.append('↯'); + iconBuilder.append(Icon.RANDOM.getPlaceholder()); } else { - stringBuilder.append('↠'); + iconBuilder.append(Icon.NOT_RANDOM.getPlaceholder()); } + String fixedString = ""; //TODO: Look for the fixed flag instead of FixedPortal once it's fixed - stringBuilder.append(" ").append(portal.getName()); if (portal instanceof FixedPortal) { - stringBuilder.append(" -> "); - stringBuilder.append(portal.getDestinationName()); + fixedString = StringFormatter.replacePlaceholder(Translator.getTranslatedMessage( + TranslatableMessage.COMMAND_VISUALIZER_FIXED_FORMAT), "{portal}", + portal.getDestinationName()); } + + stringBuilder.append(StringFormatter.replacePlaceholders( + Translator.getTranslatedMessage(TranslatableMessage.COMMAND_VISUALIZER_PORTAL_FORMAT), + new String[]{"{icons}", "{portal}", "{fixed}"}, new String[]{iconBuilder.toString(), + portal.getName(), fixedString})); + } - commandSender.sendMessage(stringBuilder.toString()); + commandSender.sendMessage(IconManager.replaceIconsInString( + StringFormatter.replacePlaceholder(stringBuilder.toString(), "{network}", network.getName()))); return true; } diff --git a/src/main/java/net/knarcraft/stargatecommand/command/DialTabCompleter.java b/src/main/java/net/knarcraft/stargatecommand/command/DialTabCompleter.java index 778ce27..e9b1d83 100644 --- a/src/main/java/net/knarcraft/stargatecommand/command/DialTabCompleter.java +++ b/src/main/java/net/knarcraft/stargatecommand/command/DialTabCompleter.java @@ -6,7 +6,8 @@ import net.TheDgtl.Stargate.network.Network; import net.TheDgtl.Stargate.network.RegistryAPI; import net.TheDgtl.Stargate.network.portal.Portal; import net.TheDgtl.Stargate.network.portal.RealPortal; -import net.knarcraft.stargatecommand.StargateCommand; +import net.knarcraft.stargatecommand.manager.IconManager; +import net.knarcraft.stargatecommand.property.Icon; import net.knarcraft.stargatecommand.property.StargateCommandCommand; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -29,7 +30,7 @@ import static net.knarcraft.stargatecommand.util.TabCompleterHelper.filterMatchi */ public class DialTabCompleter implements TabCompleter { - private final char spaceReplacement = StargateCommand.getSpaceReplacementCharacter(); + private final String spaceReplacement = IconManager.getIconString(Icon.SPACE_REPLACEMENT); private final StargateAPI stargateAPI; /** @@ -65,14 +66,14 @@ public class DialTabCompleter implements TabCompleter { if (args.length > 2) { return new ArrayList<>(); } else if (args.length > 1) { - Network network = registryAPI.getNetwork(args[0].replace(spaceReplacement, ' '), false); + Network network = registryAPI.getNetwork(args[0].replace(spaceReplacement, " "), false); if (network != null && availablePortals.containsKey(network)) { - return filterMatching(availablePortals.get(network), args[1].replace(spaceReplacement, ' ')); + return filterMatching(availablePortals.get(network), args[1].replace(spaceReplacement, " ")); } else { return new ArrayList<>(); } } else { - return filterMatching(availableNetworks, args[0].replace(spaceReplacement, ' ')); + return filterMatching(availableNetworks, args[0].replace(spaceReplacement, " ")); } } @@ -95,12 +96,12 @@ public class DialTabCompleter implements TabCompleter { if (!availablePortals.containsKey(network)) { availablePortals.put(network, new LinkedList<>()); } - availablePortals.get(network).add(portal.getName().replace(' ', spaceReplacement)); + availablePortals.get(network).add(portal.getName().replace(" ", spaceReplacement)); } } } //Add only the network names with portals available to the player - availablePortals.keySet().forEach((item) -> availableNetworks.add(item.getName().replace(' ', + availablePortals.keySet().forEach((item) -> availableNetworks.add(item.getName().replace(" ", spaceReplacement))); } diff --git a/src/main/java/net/knarcraft/stargatecommand/formatting/TranslatableMessage.java b/src/main/java/net/knarcraft/stargatecommand/formatting/TranslatableMessage.java index cef5973..60fc6c1 100644 --- a/src/main/java/net/knarcraft/stargatecommand/formatting/TranslatableMessage.java +++ b/src/main/java/net/knarcraft/stargatecommand/formatting/TranslatableMessage.java @@ -55,4 +55,59 @@ public enum TranslatableMessage { */ CONFIG_OPTION_DESCRIPTION, + /** + * The message to display when a command is used from the console, but requires a player + */ + COMMAND_PLAYER_ONLY, + + /** + * The message to display for explaining expected arguments for the dial command + */ + COMMAND_DIAL_ARGUMENTS, + + /** + * The message to display when the user provides an invalid network name + */ + INVALID_NETWORK_GIVEN, + + /** + * The message to display when the user provides an invalid portal name + */ + INVALID_PORTAL_GIVEN, + + /** + * The message to display when the user provides a portal they cannot access + */ + PORTAL_NO_ACCESS, + + /** + * The message to display when a command cannot find a portal in the player's line of sight + */ + NO_PORTAL_IN_SIGHT, + + /** + * The message to display when a Stargate has been successfully dialed + */ + DIAL_SUCCESSFUL, + + /** + * The message to display for explaining expected arguments for the visualizer command + */ + COMMAND_VISUALIZER_ARGUMENTS, + + /** + * The format used to display the visualization of a Stargate network + */ + COMMAND_VISUALIZER_FORMAT, + + /** + * The format used to display one portal int the visualized network + */ + COMMAND_VISUALIZER_PORTAL_FORMAT, + + /** + * The format used to display info about a portal's fixed destination + */ + COMMAND_VISUALIZER_FIXED_FORMAT, + } diff --git a/src/main/java/net/knarcraft/stargatecommand/manager/IconManager.java b/src/main/java/net/knarcraft/stargatecommand/manager/IconManager.java new file mode 100644 index 0000000..76b9508 --- /dev/null +++ b/src/main/java/net/knarcraft/stargatecommand/manager/IconManager.java @@ -0,0 +1,61 @@ +package net.knarcraft.stargatecommand.manager; + +import net.knarcraft.stargatecommand.formatting.StringFormatter; +import net.knarcraft.stargatecommand.property.Icon; + +import java.util.HashMap; +import java.util.Map; + +/** + * This manager keeps track of the different icons used as part of output + */ +public final class IconManager { + + private final static Map managedIcons = new HashMap<>(); + + private IconManager() { + + } + + /** + * Gets the String used to display the given icon + * + * @param icon

The icon to get the icon string for

+ * @return

The string used to display the icon

+ */ + public static String getIconString(Icon icon) { + if (managedIcons.containsKey(icon)) { + return managedIcons.get(icon); + } else { + return icon.getDefaultIconString(); + } + } + + /** + * Replaces all icon placeholders in the given string + * + * @param input

The input to replace placeholders for

+ * @return

The input with placeholders replaced

+ */ + public static String replaceIconsInString(String input) { + for (Icon icon : Icon.values()) { + input = StringFormatter.replacePlaceholder(input, icon.getPlaceholder(), getIconString(icon)); + } + return input; + } + + /** + * Registers the given icon string to the given icon + * + * @param icon

The icon to register an icon string for

+ * @param string

The icon string to register

+ */ + public static void registerIconString(Icon icon, String string) { + if (icon == null || string == null) { + managedIcons.remove(icon); + } else { + managedIcons.put(icon, string); + } + } + +} diff --git a/src/main/java/net/knarcraft/stargatecommand/property/Icon.java b/src/main/java/net/knarcraft/stargatecommand/property/Icon.java new file mode 100644 index 0000000..0e9c78c --- /dev/null +++ b/src/main/java/net/knarcraft/stargatecommand/property/Icon.java @@ -0,0 +1,79 @@ +package net.knarcraft.stargatecommand.property; + +/** + * A representation of configurable icons used in this plugin + */ +public enum Icon { + + /** + * The icon used to mark a Stargate as hidden + */ + HIDDEN("⇒", "{icon_h}"), + + /** + * The icon used to mark a Stargate as not hidden + */ + NOT_HIDDEN("⇄", "{icon_nh}"), + + /** + * The icon used to mark a Stargate as always on/open + */ + ALWAYS_ON("⬛", "{icon_a}"), + + /** + * The icon used to mark a Stargate as not always on/open + */ + NOT_ALWAYS_ON("⬜", "{icon_na}"), + + /** + * The icon used to mark a Stargate as random + */ + RANDOM("↯", "{icon_r}"), + + /** + * The icon used to mark a Stargate as not random + */ + NOT_RANDOM("↠", "{icon_nr}"), + + /** + * The icon used as a rightwards arrow between two items + */ + ARROW_RIGHT("->", "{icon_arrow_right}"), + + /** + * The icon used to replace the space character for any names with spaces + */ + SPACE_REPLACEMENT("⚊", "{icon_space}"); + + private final String defaultIcon; + private final String placeholder; + + /** + * Instantiates a new icon + * + * @param defaultIcon

The default value used unless another is specified

+ */ + Icon(String defaultIcon, String placeholder) { + this.defaultIcon = defaultIcon; + this.placeholder = placeholder; + } + + /** + * Gets the default icon string used for this icon + * + * @return

The default string used for this icon

+ */ + public String getDefaultIconString() { + return this.defaultIcon; + } + + /** + * Gets the placeholder this icon should replace + * + * @return

The placeholder this icon should replace

+ */ + public String getPlaceholder() { + return this.placeholder; + } + +} diff --git a/src/main/resources/strings.yml b/src/main/resources/strings.yml index 68ce171..b174ec7 100644 --- a/src/main/resources/strings.yml +++ b/src/main/resources/strings.yml @@ -8,4 +8,15 @@ en: INVALID_NUMBER_GIVEN: "Invalid number given" CONFIG_OPTION_CURRENT_VALUE: "&aCurrent value: &6{value}" CONFIG_VALUES_HEADER: "&aStargate &6Config values:" - CONFIG_OPTION_DESCRIPTION: "&6{name}&f - &a{description}&8 (Default: &7{value}&8)" \ No newline at end of file + CONFIG_OPTION_DESCRIPTION: "&6{name}&r - &a{description}&8 (Default: &7{value}&8)" + COMMAND_PLAYER_ONLY: "This command can only be used by players" + COMMAND_DIAL_ARGUMENTS: "You need to provide a network name and a portal name to dial" + INVALID_NETWORK_GIVEN: "Invalid network specified in input" + INVALID_PORTAL_GIVEN: "Invalid portal specified in input" + PORTAL_NO_ACCESS: "You don't have access to the selected portal" + NO_PORTAL_IN_SIGHT: "You need to look at a portal to use this command" + DIAL_SUCCESSFUL: "Your Stargate has been prepared" + COMMAND_VISUALIZER_ARGUMENTS: "A network must be provided to visualize" + COMMAND_VISUALIZER_FORMAT: "Symbol explanation: \n&6{icon_h}&r = hidden, &6{icon_nh}&r = not hidden\n&6{icon_a}&r = always open, &6{icon_na}&r = not always open\n&6{icon_r}&r = random destination, &6{icon_nr}&r = non-random destination\n&6{icon_arrow_right}&r = fixed portal going to the specified portal\n|\nAll portals in network &a{network}&r:" + COMMAND_VISUALIZER_PORTAL_FORMAT: "&6{icons} &a{portal}&r{fixed}" + COMMAND_VISUALIZER_FIXED_FORMAT: " {icon_arrow_right} &a{portal}" \ No newline at end of file