diff options
| author | Matthew <pugmatt@gmail.com> | 2022-01-24 00:38:08 -0500 |
|---|---|---|
| committer | Matthew <pugmatt@gmail.com> | 2022-01-24 00:38:08 -0500 |
| commit | e6cdc3a462dfc56c31861f13597aa2b7f5acf576 (patch) | |
| tree | 7790ab05faa0f3dde2e7cf8a0973ca51a5668fb7 | |
| parent | 30412eae8439e5ddf0c6d74202fb447570c91d3a (diff) | |
| download | BedrockConnect-e6cdc3a462dfc56c31861f13597aa2b7f5acf576.tar.gz BedrockConnect-e6cdc3a462dfc56c31861f13597aa2b7f5acf576.tar.bz2 BedrockConnect-e6cdc3a462dfc56c31861f13597aa2b7f5acf576.zip | |
Add way to configure the serverlist language/wording
7 files changed, 162 insertions, 39 deletions
diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BedrockConnect.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BedrockConnect.java index 86ac199..364453a 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BedrockConnect.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BedrockConnect.java @@ -1,5 +1,6 @@ package main.com.pyratron.pugmatt.bedrockconnect; +import main.com.pyratron.pugmatt.bedrockconnect.config.Language; import main.com.pyratron.pugmatt.bedrockconnect.sql.Data; import main.com.pyratron.pugmatt.bedrockconnect.sql.MySQL; import main.com.pyratron.pugmatt.bedrockconnect.utils.PaletteManager; @@ -37,6 +38,8 @@ public class BedrockConnect { public static HashMap<String, String> featuredServerIps; + public static Language language; + public static void main(String[] args) { System.out.println("-= BedrockConnect =-"); paletteManager = new PaletteManager(); @@ -50,6 +53,8 @@ public class BedrockConnect { String serverLimit = "100"; + String languageFile = null; + for(String str : args) { if(str.startsWith("mysql_host=")) hostname = getArgValue(str, "mysql_host"); @@ -136,6 +141,9 @@ public class BedrockConnect { e.printStackTrace(); } } + if (str.startsWith("language=")) { + languageFile = getArgValue(str, "whitelist"); + } } if(!noDB) @@ -152,6 +160,8 @@ public class BedrockConnect { System.out.printf("There are %d whitelisted players\n", Whitelist.getWhitelist().size()); } + language = new Language(languageFile); + if(!fetchFeaturedIps) { try { featuredServerIps = new HashMap<>(); diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/Server.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/Server.java index 6812a61..07b5cb8 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/Server.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/Server.java @@ -4,7 +4,6 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLMapper; import com.nukkitx.protocol.bedrock.*; -import com.nukkitx.protocol.bedrock.v428.Bedrock_v428; import main.com.pyratron.pugmatt.bedrockconnect.listeners.PacketHandler; import main.com.pyratron.pugmatt.bedrockconnect.utils.BedrockProtocol; @@ -55,8 +54,8 @@ public class Server { server = new BedrockServer(bindAddress); pong = new BedrockPong(); pong.setEdition("MCPE"); - pong.setMotd("Join To Open Server List"); - pong.setSubMotd("BedrockConnect Server List"); + pong.setMotd(BedrockConnect.language.getWording("serverInfo", "motd")); + pong.setSubMotd(BedrockConnect.language.getWording("serverInfo", "subMotd")); pong.setPlayerCount(0); pong.setMaximumPlayerCount(20); pong.setGameType("Survival"); @@ -88,7 +87,7 @@ public class Server { public void run() { for (int i = 0; i < players.size(); i++) { if (players.get(i) != null && !players.get(i).isActive()) - players.get(i).disconnect("Kicked for inactivity", current); + players.get(i).disconnect(BedrockConnect.language.getWording("disconnect", "inactivity"), current); } } }; diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/config/Language.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/config/Language.java new file mode 100644 index 0000000..24e5beb --- /dev/null +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/config/Language.java @@ -0,0 +1,68 @@ +package main.com.pyratron.pugmatt.bedrockconnect.config; + +import com.fasterxml.jackson.databind.ObjectMapper; +import main.com.pyratron.pugmatt.bedrockconnect.BedrockConnect; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; + +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +public class Language { + public final String DEFAULT_PATH = "language.json"; + + private HashMap<String, HashMap> elements; + + public Language(String languageFile) { + elements = new HashMap<>(); + + try { + // Load default language elements + JSONObject defaultLang = loadDefault(); + + for (Object wording : defaultLang.keySet()) { + elements.put((String) wording, (HashMap) defaultLang.get(wording)); + } + + // If a custom language file is defined, overwrite any default wording elements with the ones that exist in this file + if(languageFile != null) { + JSONObject customLang = loadCustom(languageFile); + + for (Object wording : customLang.keySet()) { + if(!elements.containsKey(wording)) continue; + HashMap set = elements.get(wording); + HashMap newSet = (HashMap) customLang.get(wording); + + for (Object el : newSet.keySet()) { + set.put(el, newSet.get(el)); + } + + elements.put((String) wording, set); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private JSONObject loadDefault() throws IOException { + InputStream stream = BedrockConnect.class.getClassLoader().getResourceAsStream(DEFAULT_PATH); + + ObjectMapper mapper = new ObjectMapper(); + Map<String,Object> langMap = mapper.readValue(stream, Map.class); + + return new JSONObject(langMap); + } + + private JSONObject loadCustom(String file) throws IOException, ParseException { + return (JSONObject) new JSONParser().parse(new FileReader(file)); + } + + public String getWording(String rootKey, String key) { + return elements.containsKey(rootKey) && elements.get(rootKey).containsKey(key) ? elements.get(rootKey).get(key).toString() : "N/A"; + } +} diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/gui/UIForms.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/gui/UIForms.java index 60ef2e2..30927d8 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/gui/UIForms.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/gui/UIForms.java @@ -22,10 +22,12 @@ public class UIForms { public static JsonArray mainMenuButtons = new JsonArray(); public static JsonArray featuredServerButtons = new JsonArray(); + public static final int DEFAULT_PORT = 19132; + static { - mainMenuButtons.add(UIComponents.createButton("Connect to a Server")); - mainMenuButtons.add(UIComponents.createButton("Remove a Server")); - mainMenuButtons.add(UIComponents.createButton("Exit Server List")); + mainMenuButtons.add(UIComponents.createButton(BedrockConnect.language.getWording("main", "connectBtn"))); + mainMenuButtons.add(UIComponents.createButton(BedrockConnect.language.getWording("main", "removeBtn"))); + mainMenuButtons.add(UIComponents.createButton(BedrockConnect.language.getWording("main", "exitBtn"))); featuredServerButtons.add(UIComponents.createButton("The Hive", "https://forum.playhive.com/uploads/default/original/1X/0d05e3240037f7592a0f16b11b57c08eba76f19c.png", "url")); featuredServerButtons.add(UIComponents.createButton("Mineplex", "https://www.mineplex.com/assets/www-mp/img/footer/footer_smalllogo.png", "url")); @@ -41,7 +43,7 @@ public class UIForms { ModalFormRequestPacket mf = new ModalFormRequestPacket(); mf.setFormId(UIForms.MAIN); - JsonObject out = UIComponents.createForm("form", "Server List"); + JsonObject out = UIComponents.createForm("form", BedrockConnect.language.getWording("main", "heading")); out.addProperty("content", ""); JsonArray buttons = new JsonArray(); @@ -50,7 +52,7 @@ public class UIForms { if(BedrockConnect.userServers) buttons.addAll(mainMenuButtons); else - buttons.add(UIComponents.createButton("Exit Server List")); + buttons.add(UIComponents.createButton(BedrockConnect.language.getWording("main", "exitBtn"))); for(int i=0;i<servers.size();i++) { buttons.add(UIComponents.createButton(UIComponents.getServerDisplayName(servers.get(i)), "https://i.imgur.com/3BmFZRE.png", "url")); @@ -118,14 +120,14 @@ public class UIForms { currentForm = DIRECT_CONNECT; ModalFormRequestPacket mf = new ModalFormRequestPacket(); mf.setFormId(UIForms.DIRECT_CONNECT); - JsonObject out = UIComponents.createForm("custom_form", "Connect to a Server"); + JsonObject out = UIComponents.createForm("custom_form", BedrockConnect.language.getWording("connect", "heading")); JsonArray inputs = new JsonArray(); - inputs.add(UIComponents.createInput("Server Address", "Please enter IP or Address")); - inputs.add(UIComponents.createInput("Server Port", "Please enter Port", "19132")); - inputs.add(UIComponents.createInput("(Optional) Display Name on Server List", "", "")); - inputs.add(UIComponents.createToggle("Add to server list")); + inputs.add(UIComponents.createInput(BedrockConnect.language.getWording("connect", "addressTitle"), BedrockConnect.language.getWording("connect", "addressPlaceholder"))); + inputs.add(UIComponents.createInput(BedrockConnect.language.getWording("connect", "portTitle"), BedrockConnect.language.getWording("connect", "portPlaceholder"), Integer.toString(DEFAULT_PORT))); + inputs.add(UIComponents.createInput(BedrockConnect.language.getWording("connect", "displayNameTitle"), "", "")); + inputs.add(UIComponents.createToggle(BedrockConnect.language.getWording("connect", "addToggle"))); out.add("content", inputs); mf.setFormData(out.toString()); @@ -137,7 +139,7 @@ public class UIForms { currentForm = REMOVE_SERVER; ModalFormRequestPacket mf = new ModalFormRequestPacket(); mf.setFormId(UIForms.REMOVE_SERVER); - JsonObject out = UIComponents.createForm("custom_form", "Remove Server"); + JsonObject out = UIComponents.createForm("custom_form", BedrockConnect.language.getWording("remove", "heading")); JsonArray inputs = new JsonArray(); @@ -145,7 +147,7 @@ public class UIForms { for(int i = 0; i < servers.size(); i++) { displayServers.add(UIComponents.getServerDisplayName(servers.get(i))); } - inputs.add(UIComponents.createDropdown(displayServers,"Servers", "0")); + inputs.add(UIComponents.createDropdown(displayServers,BedrockConnect.language.getWording("remove", "serverDropdown"), "0")); out.add("content", inputs); mf.setFormData(out.toString()); @@ -159,7 +161,7 @@ public class UIForms { mf.setFormId(UIForms.ERROR); JsonObject form = new JsonObject(); form.addProperty("type", "custom_form"); - form.addProperty("title", "Error"); + form.addProperty("title", BedrockConnect.language.getWording("error", "heading")); JsonArray content = new JsonArray(); content.add(UIComponents.createLabel(text)); form.add("content", content); diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/listeners/PacketHandler.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/listeners/PacketHandler.java index 115465a..a02f62c 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/listeners/PacketHandler.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/listeners/PacketHandler.java @@ -135,7 +135,7 @@ public class PacketHandler implements BedrockPacketHandler { player.setCurrentForm(UIForms.REMOVE_SERVER); break; case EXIT: - player.disconnect("Exiting Server List", server); + player.disconnect(BedrockConnect.language.getWording("disconnect", "exit"), server); break; case USER_SERVER: String address = server.getPlayer(uuid).getServerList().get(serverIndex); @@ -144,13 +144,9 @@ public class PacketHandler implements BedrockPacketHandler { String ip = address.split(":")[0]; String port = address.split(":")[1]; - try { - transfer(ip, Integer.parseInt(port)); - } catch (Exception e) { - session.sendPacketImmediately(UIForms.createError("Error connecting to server. Invalid address.")); - } + transfer(ip, Integer.parseInt(port)); } else { - session.sendPacketImmediately(UIForms.createError("Invalid server address")); + session.sendPacketImmediately(UIForms.createError(BedrockConnect.language.getWording("error", "invalidUserServer"))); } break; case CUSTOM_SERVER: @@ -202,23 +198,23 @@ public class PacketHandler implements BedrockPacketHandler { data.set(1, data.get(1).replaceAll("\\s","")); if(data.get(0).length() >= 253) - session.sendPacketImmediately(UIForms.createError("Address is too large. (Must be 253 characters or less)")); + session.sendPacketImmediately(UIForms.createError(BedrockConnect.language.getWording("error", "addressLarge"))); else if(data.get(1).length() >= 10) - session.sendPacketImmediately(UIForms.createError("Port is too large. (Must be less than 10 characters)")); + session.sendPacketImmediately(UIForms.createError(BedrockConnect.language.getWording("error", "portLarge"))); else if(data.get(2).length() >= 36) - session.sendPacketImmediately(UIForms.createError("Display name is too large. (Must be 36 characters or less)")); + session.sendPacketImmediately(UIForms.createError(BedrockConnect.language.getWording("error", "nameLarge"))); else if (!data.get(0).matches("^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$") && !data.get(0).matches("^((?!-)[A-Za-z0-9-]{1,63}(?<!-)\\.)+[A-Za-z]{2,64}$")) - session.sendPacketImmediately(UIForms.createError("Enter a valid address. (E.g. play.example.net, 172.16.254.1)")); + session.sendPacketImmediately(UIForms.createError(BedrockConnect.language.getWording("error", "invalidAddress"))); else if (!data.get(1).matches("[0-9]+")) - session.sendPacketImmediately(UIForms.createError("Enter a valid port that contains only numbers")); + session.sendPacketImmediately(UIForms.createError(BedrockConnect.language.getWording("error", "invalidPort"))); else if (!data.get(2).isEmpty() && !data.get(2).matches("^[a-zA-Z0-9]+( +[a-zA-Z0-9]+)*$")) - session.sendPacketImmediately(UIForms.createError("Display name can only contain letters, numbers, and spaces between characters")); + session.sendPacketImmediately(UIForms.createError(BedrockConnect.language.getWording("error", "invalidName"))); else { boolean addServer = Boolean.parseBoolean(data.get(3)); if (addServer) { List<String> serverList = player.getServerList(); if (serverList.size() >= player.getServerLimit()) - session.sendPacketImmediately(UIForms.createError("You have hit your serverlist limit of " + player.getServerLimit() + " servers. Remove some to add more.")); + session.sendPacketImmediately(UIForms.createError(BedrockConnect.language.getWording("error", "serverLimit").replace("%MAX_SERVERS%", Integer.toString(player.getServerLimit())))); else { String server; // If display name is included from form input, add as parameter @@ -240,7 +236,7 @@ public class PacketHandler implements BedrockPacketHandler { } } } catch(Exception e) { - session.sendPacketImmediately(UIForms.createError("Please enter a valid IP/Address and port that contains only numbers.")); + session.sendPacketImmediately(UIForms.createError(BedrockConnect.language.getWording("error", "invalidServerConnect"))); } break; case UIForms.REMOVE_SERVER: @@ -262,7 +258,7 @@ public class PacketHandler implements BedrockPacketHandler { session.sendPacketImmediately(UIForms.createMain(serverList, session)); } } catch(Exception e) { - session.sendPacketImmediately(UIForms.createError("Invalid server to remove")); + session.sendPacketImmediately(UIForms.createError(BedrockConnect.language.getWording("error", "invalidServerRemove"))); } break; case UIForms.ERROR: @@ -294,10 +290,14 @@ public class PacketHandler implements BedrockPacketHandler { } public void transfer(String ip, int port) { - TransferPacket tp = new TransferPacket(); - tp.setAddress(ip); - tp.setPort(port); - session.sendPacketImmediately(tp); + try { + TransferPacket tp = new TransferPacket(); + tp.setAddress(ip); + tp.setPort(port); + session.sendPacketImmediately(tp); + } catch (Exception e) { + session.sendPacketImmediately(UIForms.createError(BedrockConnect.language.getWording("error", "transferError"))); + } } @Override diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/sql/Data.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/sql/Data.java index a232e84..7abe8f1 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/sql/Data.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/sql/Data.java @@ -105,7 +105,7 @@ public class Data { } } catch (Exception e) { errorAlert(e); - session.disconnect("We had some trouble receiving your player data. Please report this to the BedrockConnect GitHub if the issue continues."); + session.disconnect(BedrockConnect.language.getWording("disconnect", "dataError")); } }).start(); } else { @@ -167,7 +167,7 @@ public class Data { catch (Exception e) { errorAlert(e); - session.disconnect("We had some trouble receiving your player data. Please report this to the BedrockConnect GitHub if the issue continues."); + session.disconnect(BedrockConnect.language.getWording("disconnect", "dataError")); } }).start(); } diff --git a/serverlist-server/src/main/resources/language.json b/serverlist-server/src/main/resources/language.json new file mode 100644 index 0000000..7494dae --- /dev/null +++ b/serverlist-server/src/main/resources/language.json @@ -0,0 +1,44 @@ +{ + "serverInfo": { + "motd": "Join To Open Server List", + "subMotd": "BedrockConnect Server List" + }, + "main": { + "heading": "ServerList", + "connectBtn" : "Connect to a Server", + "removeBtn": "Remove a Server", + "exitBtn": "Exit Server List" + }, + "connect": { + "heading": "Connect to a Server", + "addressTitle": "Server Address", + "addressPlaceholder": "Please enter IP or Address", + "portTitle": "Server Port", + "portPlaceholder": "Please enter Port", + "displayNameTitle": "(Optional) Display Name on Server List", + "addToggle": "Add to server list" + }, + "remove": { + "heading": "Remove Server", + "serverDropdown": "Servers" + }, + "error": { + "heading": "Error", + "addressLarge": "Address is too large. (Must be 253 characters or less)", + "portLarge": "Port is too large. (Must be less than 10 characters)", + "nameLarge": "Display name is too large. (Must be 36 characters or less)", + "invalidAddress": "Enter a valid address. (E.g. play.example.net, 172.16.254.1)", + "invalidPort": "Enter a valid port that contains only numbers", + "invalidName": "Display name can only contain letters, numbers, and spaces between characters", + "serverLimit": "You have hit your serverlist limit of %MAX_SERVERS% servers. Remove some to add more.", + "invalidUserServer": "Invalid server address", + "invalidServerConnect": "Please enter a valid IP/Address and port that contains only numbers.", + "invalidServerRemove": "Invalid server to remove", + "transferError": "Error connecting to server. Invalid address." + }, + "disconnect": { + "inactivity": "Kicked for inactivity", + "exit": "Exiting Server List", + "dataError": "We had some trouble receiving your player data. Please report this to the BedrockConnect GitHub if the issue continues." + } +}
\ No newline at end of file |
