summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew <pugmatt@gmail.com>2022-01-24 00:38:08 -0500
committerMatthew <pugmatt@gmail.com>2022-01-24 00:38:08 -0500
commite6cdc3a462dfc56c31861f13597aa2b7f5acf576 (patch)
tree7790ab05faa0f3dde2e7cf8a0973ca51a5668fb7
parent30412eae8439e5ddf0c6d74202fb447570c91d3a (diff)
downloadBedrockConnect-e6cdc3a462dfc56c31861f13597aa2b7f5acf576.tar.gz
BedrockConnect-e6cdc3a462dfc56c31861f13597aa2b7f5acf576.tar.bz2
BedrockConnect-e6cdc3a462dfc56c31861f13597aa2b7f5acf576.zip
Add way to configure the serverlist language/wording
-rw-r--r--serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BedrockConnect.java10
-rw-r--r--serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/Server.java7
-rw-r--r--serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/config/Language.java68
-rw-r--r--serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/gui/UIForms.java28
-rw-r--r--serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/listeners/PacketHandler.java40
-rw-r--r--serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/sql/Data.java4
-rw-r--r--serverlist-server/src/main/resources/language.json44
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