From 590507029ea5db9f695d0b3d027ac7fd5a3496fe Mon Sep 17 00:00:00 2001 From: Sekwah Date: Sat, 23 Apr 2022 16:07:16 +0100 Subject: [PATCH] refactor: reorganise the package structure --- .../core/AdvancedPortalsCore.java | 3 + .../core/commands/CommandTemplate.java | 24 ++++ .../core/commands/SubCommand.java | 72 +++++------ .../connector/commands/CommandHandler.java | 14 +++ .../connector/commands/CommandRegister.java | 14 +++ .../containers}/CommandSenderContainer.java | 2 +- .../containers}/PlayerContainer.java | 2 +- .../containers}/ServerContainer.java | 2 +- .../connector/containers}/WorldContainer.java | 2 +- .../advancedportals/util/InfoLogger.java | 16 +++ .../com/sekwah/advancedportals/util/Lang.java | 112 ++++++++++++++++++ .../advancedportals/util/TagReader.java | 51 ++++++++ 12 files changed, 274 insertions(+), 40 deletions(-) create mode 100644 core/src/main/java/com/sekwah/advancedportals/core/commands/CommandTemplate.java create mode 100644 core/src/main/java/com/sekwah/advancedportals/core/connector/commands/CommandHandler.java create mode 100644 core/src/main/java/com/sekwah/advancedportals/core/connector/commands/CommandRegister.java rename core/src/main/java/com/sekwah/advancedportals/{connector/container => core/connector/containers}/CommandSenderContainer.java (81%) rename core/src/main/java/com/sekwah/advancedportals/{connector/container => core/connector/containers}/PlayerContainer.java (94%) rename core/src/main/java/com/sekwah/advancedportals/{connector/container => core/connector/containers}/ServerContainer.java (56%) rename core/src/main/java/com/sekwah/advancedportals/{connector/container => core/connector/containers}/WorldContainer.java (83%) create mode 100644 core/src/main/java/com/sekwah/advancedportals/util/InfoLogger.java create mode 100644 core/src/main/java/com/sekwah/advancedportals/util/Lang.java create mode 100644 core/src/main/java/com/sekwah/advancedportals/util/TagReader.java diff --git a/core/src/main/java/com/sekwah/advancedportals/core/AdvancedPortalsCore.java b/core/src/main/java/com/sekwah/advancedportals/core/AdvancedPortalsCore.java index 4b292378..390c28bc 100644 --- a/core/src/main/java/com/sekwah/advancedportals/core/AdvancedPortalsCore.java +++ b/core/src/main/java/com/sekwah/advancedportals/core/AdvancedPortalsCore.java @@ -6,6 +6,9 @@ public class AdvancedPortalsCore { private Injector injector; + /** + * For some platforms we could do this on construction but this just allows for a bit more control + */ public void onEnable() { AdvancedPortalsModule module = new AdvancedPortalsModule(this); injector = module.getInjector(); diff --git a/core/src/main/java/com/sekwah/advancedportals/core/commands/CommandTemplate.java b/core/src/main/java/com/sekwah/advancedportals/core/commands/CommandTemplate.java new file mode 100644 index 00000000..a2e3d8fb --- /dev/null +++ b/core/src/main/java/com/sekwah/advancedportals/core/commands/CommandTemplate.java @@ -0,0 +1,24 @@ +package com.sekwah.advancedportals.core.commands; + +import com.sekwah.advancedportals.core.connector.containers.CommandSenderContainer; + +import java.util.List; + +/** + * Already know spigot's auto complete possibilities + * + * Sponge https://docs.spongepowered.org/stable/en/plugin/commands/arguments.html#custom-command-elements + */ +public interface CommandTemplate { + + void onCommand(CommandSenderContainer sender, String commandExecuted, String[] args); + + /** + * Fired when someone asks for a tab complete action. + * @param sender whoever triggered the command e.g. command block, server or player + * @param args arguments for the command + * @return a lot of strings that are possible completions + */ + List onTabComplete(CommandSenderContainer sender, String[] args); + +} diff --git a/core/src/main/java/com/sekwah/advancedportals/core/commands/SubCommand.java b/core/src/main/java/com/sekwah/advancedportals/core/commands/SubCommand.java index 44385fc1..9dc95e8e 100644 --- a/core/src/main/java/com/sekwah/advancedportals/core/commands/SubCommand.java +++ b/core/src/main/java/com/sekwah/advancedportals/core/commands/SubCommand.java @@ -1,36 +1,36 @@ -package com.sekwah.advancedportals.core.commands; - -import com.sekwah.advancedportals.connector.container.CommandSenderContainer; - -import java.util.List; - -public interface SubCommand { - - /** - * @param sender - * @param args arguments including the subcommand that has been specified. - * @return if the command has worked (if false it will just display a message from the command suggesting to check help) - */ - void onCommand(CommandSenderContainer sender, String[] args); - - boolean hasPermission(CommandSenderContainer sender); - - /** - * - * - * @param sender - * @param args arguments including the subcommand that has been specified. - * @return tab completion for the subcommand - */ - List onTabComplete(CommandSenderContainer sender, String[] args); - - /** - * @return the string to show next to the tag on the help menu. - */ - String getBasicHelpText(); - - /** - * @return the string to show if help then the tag is listed. - */ - String getDetailedHelpText(); -} +package com.sekwah.advancedportals.core.commands; + +import com.sekwah.advancedportals.core.connector.containers.CommandSenderContainer; + +import java.util.List; + +public interface SubCommand { + + /** + * @param sender + * @param args arguments including the subcommand that has been specified. + * @return if the command has worked (if false it will just display a message from the command suggesting to check help) + */ + void onCommand(CommandSenderContainer sender, String[] args); + + boolean hasPermission(CommandSenderContainer sender); + + /** + * + * + * @param sender + * @param args arguments including the subcommand that has been specified. + * @return tab completion for the subcommand + */ + List onTabComplete(CommandSenderContainer sender, String[] args); + + /** + * @return the string to show next to the tag on the help menu. + */ + String getBasicHelpText(); + + /** + * @return the string to show if help then the tag is listed. + */ + String getDetailedHelpText(); +} diff --git a/core/src/main/java/com/sekwah/advancedportals/core/connector/commands/CommandHandler.java b/core/src/main/java/com/sekwah/advancedportals/core/connector/commands/CommandHandler.java new file mode 100644 index 00000000..67672aac --- /dev/null +++ b/core/src/main/java/com/sekwah/advancedportals/core/connector/commands/CommandHandler.java @@ -0,0 +1,14 @@ +package com.sekwah.advancedportals.core.connector.commands; + + +import com.sekwah.advancedportals.core.commands.CommandTemplate; + +public abstract class CommandHandler { + + + private final CommandTemplate commandExecutor; + + public CommandHandler(CommandTemplate commandExecutor) { + this.commandExecutor = commandExecutor; + } +} diff --git a/core/src/main/java/com/sekwah/advancedportals/core/connector/commands/CommandRegister.java b/core/src/main/java/com/sekwah/advancedportals/core/connector/commands/CommandRegister.java new file mode 100644 index 00000000..c5753e44 --- /dev/null +++ b/core/src/main/java/com/sekwah/advancedportals/core/connector/commands/CommandRegister.java @@ -0,0 +1,14 @@ +package com.sekwah.advancedportals.core.connector.commands; + +import com.sekwah.advancedportals.core.commands.CommandTemplate; + +public interface CommandRegister { + + /** + * Registers the command to the appropriate system + * @param commandName + * @param commandExecutor + */ + void registerCommand(String commandName, CommandTemplate commandExecutor); + +} diff --git a/core/src/main/java/com/sekwah/advancedportals/connector/container/CommandSenderContainer.java b/core/src/main/java/com/sekwah/advancedportals/core/connector/containers/CommandSenderContainer.java similarity index 81% rename from core/src/main/java/com/sekwah/advancedportals/connector/container/CommandSenderContainer.java rename to core/src/main/java/com/sekwah/advancedportals/core/connector/containers/CommandSenderContainer.java index c3489844..68fa5d0a 100644 --- a/core/src/main/java/com/sekwah/advancedportals/connector/container/CommandSenderContainer.java +++ b/core/src/main/java/com/sekwah/advancedportals/core/connector/containers/CommandSenderContainer.java @@ -1,4 +1,4 @@ -package com.sekwah.advancedportals.connector.container; +package com.sekwah.advancedportals.core.connector.containers; public interface CommandSenderContainer { diff --git a/core/src/main/java/com/sekwah/advancedportals/connector/container/PlayerContainer.java b/core/src/main/java/com/sekwah/advancedportals/core/connector/containers/PlayerContainer.java similarity index 94% rename from core/src/main/java/com/sekwah/advancedportals/connector/container/PlayerContainer.java rename to core/src/main/java/com/sekwah/advancedportals/core/connector/containers/PlayerContainer.java index a49df872..58507fbb 100644 --- a/core/src/main/java/com/sekwah/advancedportals/connector/container/PlayerContainer.java +++ b/core/src/main/java/com/sekwah/advancedportals/core/connector/containers/PlayerContainer.java @@ -1,4 +1,4 @@ -package com.sekwah.advancedportals.connector.container; +package com.sekwah.advancedportals.core.connector.containers; import com.sekwah.advancedportals.core.data.BlockLocation; import com.sekwah.advancedportals.core.data.PlayerLocation; diff --git a/core/src/main/java/com/sekwah/advancedportals/connector/container/ServerContainer.java b/core/src/main/java/com/sekwah/advancedportals/core/connector/containers/ServerContainer.java similarity index 56% rename from core/src/main/java/com/sekwah/advancedportals/connector/container/ServerContainer.java rename to core/src/main/java/com/sekwah/advancedportals/core/connector/containers/ServerContainer.java index 2842bbde..793a3bb1 100644 --- a/core/src/main/java/com/sekwah/advancedportals/connector/container/ServerContainer.java +++ b/core/src/main/java/com/sekwah/advancedportals/core/connector/containers/ServerContainer.java @@ -1,4 +1,4 @@ -package com.sekwah.advancedportals.connector.container; +package com.sekwah.advancedportals.core.connector.containers; public interface ServerContainer { diff --git a/core/src/main/java/com/sekwah/advancedportals/connector/container/WorldContainer.java b/core/src/main/java/com/sekwah/advancedportals/core/connector/containers/WorldContainer.java similarity index 83% rename from core/src/main/java/com/sekwah/advancedportals/connector/container/WorldContainer.java rename to core/src/main/java/com/sekwah/advancedportals/core/connector/containers/WorldContainer.java index 32079523..ebfaca09 100644 --- a/core/src/main/java/com/sekwah/advancedportals/connector/container/WorldContainer.java +++ b/core/src/main/java/com/sekwah/advancedportals/core/connector/containers/WorldContainer.java @@ -1,4 +1,4 @@ -package com.sekwah.advancedportals.connector.container; +package com.sekwah.advancedportals.core.connector.containers; import com.sekwah.advancedportals.core.data.BlockLocation; diff --git a/core/src/main/java/com/sekwah/advancedportals/util/InfoLogger.java b/core/src/main/java/com/sekwah/advancedportals/util/InfoLogger.java new file mode 100644 index 00000000..8ba2a76d --- /dev/null +++ b/core/src/main/java/com/sekwah/advancedportals/util/InfoLogger.java @@ -0,0 +1,16 @@ +package com.sekwah.advancedportals.util; + +public abstract class InfoLogger { + + /** + * Problematic messages + * @param s warning message + */ + public abstract void logWarning(String s); + + /** + * General information logging + * @param s info message + */ + public abstract void log(String s); +} diff --git a/core/src/main/java/com/sekwah/advancedportals/util/Lang.java b/core/src/main/java/com/sekwah/advancedportals/util/Lang.java new file mode 100644 index 00000000..67e903f1 --- /dev/null +++ b/core/src/main/java/com/sekwah/advancedportals/util/Lang.java @@ -0,0 +1,112 @@ +package com.sekwah.advancedportals.util; + +import com.sekwah.advancedportals.core.AdvancedPortalsCore; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.Scanner; + +/** + * @author sekwah41 + *

+ * The language translation file for the game. Will always load english first + * so that if the translations are missing any then they are still readable and can then be translated. + * (Its better than a raw translate string) + *

+ * TODO add a loaddefault where it only loads from the plugins version of the data rather than paying attention to any + * possible changed versions in the lang folder. + */ +public class Lang { + + private static final Lang instance = new Lang(); + private final HashMap languageMap = new HashMap<>(); + //private final String DEFAULT_LANG = "en_GB"; + + /*public Lang() { + injectTranslations(this, DEFAULT_LANG); + }*/ + + public static void loadLanguage(String fileName) { + instance.injectTranslations(instance, fileName); + } + + public static String translate(String s) { + if (instance.languageMap.containsKey(s)) { + return instance.languageMap.get(s); + } else { + return s; + } + } + + public static String translateInsertVariables(String s, Object... args) { + String translation = instance.translate(s); + for (int i = 1; i <= args.length; i++) { + translation = translation.replaceAll("%" + i + "\\$s", args[i-1].toString()); + } + return translation; + } + + public static String translateInsertVariablesColor(String s, Object... args) { + String translation = instance.translateColor(s); + for (int i = 1; i <= args.length; i++) { + translation = translation.replaceAll("%" + i + "\\$s", args[i-1].toString()); + } + return translation; + } + + public static String translateColor(String s) { + String translation = instance.translate(s); + translation = translation.replaceAll("\\\\u00A7", "\u00A7"); + return translation; + } + + private void injectTranslations(Lang lang, String fileName) { + try { + //URL url = lang.getClass().getClassLoader().getResource("lang/" + fileName + ".lang"); + //System.out.println(url); + //Map newLangMap = lang.parseLang(url.openStream()); + InputStream stream = AdvancedPortalsCore.getInstance().getDataStorage().loadResource("lang/" + fileName + ".lang"); + if (stream != null) { + Map newLangMap = lang.parseLang(stream); + if (newLangMap != null) { + lang.languageMap.putAll(newLangMap); + } + } + } catch (NullPointerException e) { + e.printStackTrace(); + AdvancedPortalsCore.getInstance().getInfoLogger().logWarning("Could not load " + fileName + ".lang The file does" + + "not exist or there has been an error reading the file. Canceled loading language file."); + } + } + + private Map parseLang(InputStream inputStream) { + Scanner scanner = new Scanner(inputStream, "UTF-8"); + String line = getNextLine(scanner); + HashMap newMap = new HashMap<>(); + while (scanner != null && line != null) { + //System.out.println(line); + if (!line.startsWith("#") && line.indexOf('=') > -1) { + int split = line.indexOf('='); + String key = line.substring(0, split); + String value = line.substring(split + 1, line.length()); + newMap.put(key, value); + } + line = getNextLine(scanner); + } + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return newMap; + } + + private String getNextLine(Scanner scanner) { + if (scanner.hasNextLine()) { + return scanner.nextLine(); + } + return null; + } +} diff --git a/core/src/main/java/com/sekwah/advancedportals/util/TagReader.java b/core/src/main/java/com/sekwah/advancedportals/util/TagReader.java new file mode 100644 index 00000000..406b9954 --- /dev/null +++ b/core/src/main/java/com/sekwah/advancedportals/util/TagReader.java @@ -0,0 +1,51 @@ +package com.sekwah.advancedportals.util; + +import com.sekwah.advancedportals.core.data.DataTag; + +import java.util.ArrayList; + +public class TagReader { + + public static ArrayList getTagsFromArgs(String[] args) { + ArrayList tags = new ArrayList<>(); + boolean partingValueWithSpaces = false; + String argBeingParsed = ""; + String currentParsedValue = ""; + for (int i = 1; i < args.length; i++) { + if(partingValueWithSpaces) { + if(args[i].charAt(args[i].length() - 1) == '"') { + args[i] = args[i].substring(0, args[i].length() - 1); + partingValueWithSpaces = false; + tags.add(new DataTag(argBeingParsed.toLowerCase(), currentParsedValue)); + } + else { + currentParsedValue += " " + args[i]; + } + } + else { + String detectedTag = TagReader.getTag(args[i].toLowerCase()); + if(detectedTag != null) { + String arg = args[i].substring(detectedTag.length() + 1); + if(arg.length() > 0 && arg.charAt(0) == '"') { + argBeingParsed = detectedTag; + currentParsedValue = arg; + } + else { + tags.add(new DataTag(detectedTag.toLowerCase(), arg)); + } + } + } + } + return tags; + } + + + public static String getTag(String arg) { + int splitLoc = arg.indexOf(":"); + if(splitLoc != -1) { + return arg.substring(0,splitLoc); + } + return null; + } + +}