Add categories for servers (Official, Geyser and Custom)

This commit is contained in:
rtm516 2021-01-17 17:04:11 +00:00
parent 11bd70bdc9
commit 4dc100a25f
No known key found for this signature in database
GPG key ID: 331715B8B007C67A
16 changed files with 181 additions and 62 deletions

View file

@ -26,10 +26,11 @@
package org.geysermc.connect; package org.geysermc.connect;
import com.nukkitx.protocol.bedrock.*; import com.nukkitx.protocol.bedrock.*;
import com.nukkitx.protocol.bedrock.v408.Bedrock_v408;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.geysermc.connect.storage.DisabledStorageManager; import org.geysermc.connect.storage.DisabledStorageManager;
import org.geysermc.connect.utils.Server;
import org.geysermc.connect.utils.ServerCategory;
import org.geysermc.connector.network.BedrockProtocol; import org.geysermc.connector.network.BedrockProtocol;
import org.geysermc.connector.utils.FileUtils; import org.geysermc.connector.utils.FileUtils;
import org.geysermc.connect.proxy.GeyserProxyBootstrap; import org.geysermc.connect.proxy.GeyserProxyBootstrap;
@ -40,12 +41,10 @@ import org.geysermc.connect.utils.Player;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.util.HashMap; import java.util.*;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import java.util.stream.Collectors;
public class MasterServer { public class MasterServer {
@ -191,4 +190,8 @@ public class MasterServer {
geyserProxy = null; geyserProxy = null;
} }
} }
public List<Server> getServers(ServerCategory serverCategory) {
return getGeyserConnectConfig().getServers().stream().filter(server -> server.getCategory() == serverCategory).collect(Collectors.toList());
}
} }

View file

@ -64,7 +64,7 @@ public class PacketHandler implements BedrockPacketHandler {
private Player player; private Player player;
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);; private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
public PacketHandler(BedrockServerSession session, MasterServer masterServer) { public PacketHandler(BedrockServerSession session, MasterServer masterServer) {
this.session = session; this.session = session;
@ -213,7 +213,7 @@ public class PacketHandler implements BedrockPacketHandler {
if (!message.trim().isEmpty()) { if (!message.trim().isEmpty()) {
player.sendWindow(FormID.WELCOME, UIHandler.getMessageWindow(message)); player.sendWindow(FormID.WELCOME, UIHandler.getMessageWindow(message));
} else { } else {
player.sendWindow(FormID.MAIN, UIHandler.getServerList(player.getServers())); player.sendWindow(FormID.MAIN, UIHandler.getMainMenu());
} }
return false; return false;
@ -237,10 +237,14 @@ public class PacketHandler implements BedrockPacketHandler {
// Send the response to the correct response function // Send the response to the correct response function
switch (id) { switch (id) {
case WELCOME: case WELCOME:
player.sendWindow(FormID.MAIN, UIHandler.getServerList(player.getServers())); player.sendWindow(FormID.MAIN, UIHandler.getMainMenu());
break; break;
case MAIN: case MAIN:
UIHandler.handleMainMenuResponse(player, (SimpleFormResponse) window.getResponse());
break;
case LIST_SERVERS:
UIHandler.handleServerListResponse(player, (SimpleFormResponse) window.getResponse()); UIHandler.handleServerListResponse(player, (SimpleFormResponse) window.getResponse());
break; break;

View file

@ -73,7 +73,7 @@ public class ProxyConnectorServerEventHandler extends ConnectorServerEventHandle
if (shutdownTime != -1) { if (shutdownTime != -1) {
MasterServer.getInstance().getGeneralThreadPool().schedule(() -> { MasterServer.getInstance().getGeneralThreadPool().schedule(() -> {
if (System.currentTimeMillis() - MasterServer.getInstance().getLastDisconnectTime() > shutdownTime * 1000 if (System.currentTimeMillis() - MasterServer.getInstance().getLastDisconnectTime() > shutdownTime * 1000L
&& connector != null && connector != null
&& connector.getPlayers().size() <= 0) { && connector.getPlayers().size() <= 0) {
MasterServer.getInstance().shutdownGeyserProxy(); MasterServer.getInstance().shutdownGeyserProxy();

View file

@ -52,9 +52,9 @@ public class AbstractStorageManager {
MYSQL("mysql", MySQLStorageManager.class); MYSQL("mysql", MySQLStorageManager.class);
@JsonValue @JsonValue
private String name; private final String name;
private Class<? extends AbstractStorageManager> storageManager; private final Class<? extends AbstractStorageManager> storageManager;
StorageType(String name, Class<? extends AbstractStorageManager> storageManager) { StorageType(String name, Class<? extends AbstractStorageManager> storageManager) {
this.name = name; this.name = name;

View file

@ -52,7 +52,7 @@ public class JsonStorageManager extends AbstractStorageManager {
public void saveServers(Player player) { public void saveServers(Player player) {
try { try {
mapper.writeValue(dataFolder.resolve(player.getXuid() + ".json").toFile(), player.getServers()); mapper.writeValue(dataFolder.resolve(player.getXuid() + ".json").toFile(), player.getServers());
} catch (IOException e) { } } catch (IOException ignored) { }
} }
@Override @Override
@ -62,7 +62,7 @@ public class JsonStorageManager extends AbstractStorageManager {
try { try {
List<Server> loadedServers = mapper.readValue(dataFolder.resolve(player.getXuid() + ".json").toFile(), new TypeReference<List<Server>>(){}); List<Server> loadedServers = mapper.readValue(dataFolder.resolve(player.getXuid() + ".json").toFile(), new TypeReference<List<Server>>(){});
servers.addAll(loadedServers); servers.addAll(loadedServers);
} catch (IOException e) { } } catch (IOException ignored) { }
return servers; return servers;
} }

View file

@ -62,7 +62,7 @@ public class MySQLStorageManager extends AbstractStorageManager {
public void closeStorage() { public void closeStorage() {
try { try {
connection.close(); connection.close();
} catch (SQLException e) { } } catch (SQLException ignored) { }
} }
@Override @Override
@ -71,7 +71,7 @@ public class MySQLStorageManager extends AbstractStorageManager {
Statement updatePlayersServers = connection.createStatement(); Statement updatePlayersServers = connection.createStatement();
updatePlayersServers.executeUpdate("REPLACE INTO players(xuid, servers) VALUES('" + player.getXuid() + "', '" + mapper.writeValueAsString(player.getServers()) + "');"); updatePlayersServers.executeUpdate("REPLACE INTO players(xuid, servers) VALUES('" + player.getXuid() + "', '" + mapper.writeValueAsString(player.getServers()) + "');");
updatePlayersServers.close(); updatePlayersServers.close();
} catch (IOException | SQLException e) { } } catch (IOException | SQLException ignored) { }
} }
@Override @Override
@ -88,7 +88,7 @@ public class MySQLStorageManager extends AbstractStorageManager {
} }
getPlayersServers.close(); getPlayersServers.close();
} catch (IOException | SQLException e) { } } catch (IOException | SQLException ignored) { }
return servers; return servers;
} }

View file

@ -31,7 +31,6 @@ import org.geysermc.connect.MasterServer;
import org.geysermc.connect.utils.Player; import org.geysermc.connect.utils.Player;
import org.geysermc.connect.utils.Server; import org.geysermc.connect.utils.Server;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.sql.*; import java.sql.*;
import java.util.ArrayList; import java.util.ArrayList;
@ -61,7 +60,7 @@ public class SQLiteStorageManager extends AbstractStorageManager {
public void closeStorage() { public void closeStorage() {
try { try {
connection.close(); connection.close();
} catch (SQLException e) { } } catch (SQLException ignored) { }
} }
@Override @Override
@ -70,7 +69,7 @@ public class SQLiteStorageManager extends AbstractStorageManager {
Statement updatePlayersServers = connection.createStatement(); Statement updatePlayersServers = connection.createStatement();
updatePlayersServers.executeUpdate("INSERT OR REPLACE INTO players(xuid, servers) VALUES('" + player.getXuid() + "', '" + mapper.writeValueAsString(player.getServers()) + "');"); updatePlayersServers.executeUpdate("INSERT OR REPLACE INTO players(xuid, servers) VALUES('" + player.getXuid() + "', '" + mapper.writeValueAsString(player.getServers()) + "');");
updatePlayersServers.close(); updatePlayersServers.close();
} catch (IOException | SQLException e) { } } catch (IOException | SQLException ignored) { }
} }
@Override @Override
@ -87,7 +86,7 @@ public class SQLiteStorageManager extends AbstractStorageManager {
} }
getPlayersServers.close(); getPlayersServers.close();
} catch (IOException | SQLException e) { } } catch (IOException | SQLException ignored) { }
return servers; return servers;
} }

View file

@ -33,6 +33,7 @@ public enum FormID {
WELCOME, WELCOME,
MAIN, MAIN,
DIRECT_CONNECT(true), DIRECT_CONNECT(true),
LIST_SERVERS(true),
EDIT_SERVERS(true), EDIT_SERVERS(true),
SERVER_OPTIONS(true), SERVER_OPTIONS(true),
ADD_SERVER(true), ADD_SERVER(true),
@ -41,7 +42,7 @@ public enum FormID {
CONNECTING, CONNECTING,
ERROR; ERROR;
private boolean handlesNull; private final boolean handlesNull;
private static final FormID[] VALUES = values(); private static final FormID[] VALUES = values();

View file

@ -39,39 +39,53 @@ import org.geysermc.common.window.response.SimpleFormResponse;
import org.geysermc.connect.MasterServer; import org.geysermc.connect.MasterServer;
import org.geysermc.connect.utils.Player; import org.geysermc.connect.utils.Player;
import org.geysermc.connect.utils.Server; import org.geysermc.connect.utils.Server;
import org.geysermc.connect.utils.ServerCategory;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class UIHandler { public class UIHandler {
public static FormWindow getMainMenu() {
SimpleFormWindow window = new SimpleFormWindow("Main Menu", "");
window.getButtons().add(new FormButton("Official Servers"));
window.getButtons().add(new FormButton("Geyser Servers"));
// Add a buttons for custom servers
if (MasterServer.getInstance().getGeyserConnectConfig().getCustomServers().isEnabled()) {
window.getButtons().add(new FormButton("Custom Servers"));
window.getButtons().add(new FormButton("Direct connect"));
}
window.getButtons().add(new FormButton("Disconnect"));
return window;
}
/** /**
* Create a list of servers for the client based on the passed servers list * Create a list of servers for the client based on the passed servers list
* *
* @param servers A list of {@link Server} objects * @param servers A list of {@link Server} objects
* @param category The category of the current list
* @return A {@link SimpleFormWindow} object * @return A {@link SimpleFormWindow} object
*/ */
public static FormWindow getServerList(List<Server> servers) { public static FormWindow getServerList(List<Server> servers, ServerCategory category) {
SimpleFormWindow window = new SimpleFormWindow("Servers", ""); SimpleFormWindow window = new SimpleFormWindow(category.getTitle() + " Servers", "");
// Add a button for each global server // Add a button for each global server
for (Server server : MasterServer.getInstance().getGeyserConnectConfig().getServers()) { for (Server server : servers) {
// These images would be better if there was a default to fall back on // These images would be better if there was a default to fall back on
// But that would require a web api as bedrock doesn't support doing that // But that would require a web api as bedrock doesn't support doing that
window.getButtons().add(new FormButton(server.toString(), server.getFormImage())); window.getButtons().add(new FormButton(server.toString(), server.getFormImage()));
} }
// Add a button for each personal server // Add a button for editing
if (MasterServer.getInstance().getGeyserConnectConfig().getCustomServers().isEnabled()) { if (category == ServerCategory.CUSTOM) {
for (Server server : servers) {
window.getButtons().add(new FormButton(server.toString(), server.getFormImage()));
}
window.getButtons().add(new FormButton("Edit servers")); window.getButtons().add(new FormButton("Edit servers"));
window.getButtons().add(new FormButton("Direct connect"));
} }
window.getButtons().add(new FormButton("Disconnect")); window.getButtons().add(new FormButton("Back"));
return window; return window;
} }
@ -183,10 +197,44 @@ public class UIHandler {
} }
public static FormWindow getMessageWindow(String message) { public static FormWindow getMessageWindow(String message) {
CustomFormWindow window = new CustomFormBuilder("Notice") return new CustomFormBuilder("Notice")
.addComponent(new LabelComponent(message)) .addComponent(new LabelComponent(message))
.build(); .build();
return window; }
public static void handleMainMenuResponse(Player player, SimpleFormResponse data) {
switch (data.getClickedButtonId()) {
case 0:
player.setServerCategory(ServerCategory.OFFICIAL);
break;
case 1:
player.setServerCategory(ServerCategory.GEYSER);
break;
default:
if (MasterServer.getInstance().getGeyserConnectConfig().getCustomServers().isEnabled()) {
switch (data.getClickedButtonId()) {
case 2:
player.setServerCategory(ServerCategory.CUSTOM);
break;
case 3:
player.sendWindow(FormID.DIRECT_CONNECT, getDirectConnect());
return;
default:
player.getSession().disconnect("disconnectionScreen.disconnected");
break;
}
} else {
player.getSession().disconnect("disconnectionScreen.disconnected");
return;
}
break;
}
player.sendWindow(FormID.LIST_SERVERS, getServerList(player.getCurrentServers(), player.getServerCategory()));
} }
/** /**
@ -196,22 +244,28 @@ public class UIHandler {
* @param data The form response data * @param data The form response data
*/ */
public static void handleServerListResponse(Player player, SimpleFormResponse data) { public static void handleServerListResponse(Player player, SimpleFormResponse data) {
List<Server> servers = new ArrayList<>(MasterServer.getInstance().getGeyserConnectConfig().getServers()); List<Server> servers = player.getCurrentServers();
servers.addAll(player.getServers());
// Cant be done in a switch as we need to calculate the last 2 buttons if (player.getServerCategory() == ServerCategory.CUSTOM) {
if (data == null || data.getClickedButtonId() == servers.size() + 1) {
player.sendWindow(FormID.MAIN, UIHandler.getMainMenu());
} else if (data.getClickedButtonId() == servers.size()) {
player.sendWindow(FormID.EDIT_SERVERS, getEditServerList(player.getCurrentServers()));
} else {
// Get the server
Server server = servers.get(data.getClickedButtonId());
if ((!MasterServer.getInstance().getGeyserConnectConfig().getCustomServers().isEnabled() && data.getClickedButtonId() == servers.size()) || data.getClickedButtonId() == servers.size() + 2) { player.sendToServer(server);
player.getSession().disconnect("disconnectionScreen.disconnected"); }
} else if (data.getClickedButtonId() == servers.size()) {
player.sendWindow(FormID.EDIT_SERVERS, getEditServerList(player.getServers()));
} else if (data.getClickedButtonId() == servers.size() + 1) {
player.sendWindow(FormID.DIRECT_CONNECT, getDirectConnect());
} else { } else {
// Get the server if (data == null || data.getClickedButtonId() == servers.size()) {
Server server = servers.get(data.getClickedButtonId()); player.sendWindow(FormID.MAIN, UIHandler.getMainMenu());
} else {
// Get the server
Server server = servers.get(data.getClickedButtonId());
player.sendToServer(server); player.sendToServer(server);
}
} }
} }
@ -224,7 +278,7 @@ public class UIHandler {
public static void handleDirectConnectResponse(Player player, CustomFormResponse data) { public static void handleDirectConnectResponse(Player player, CustomFormResponse data) {
// Take them back to the main menu if they close the direct connect window // Take them back to the main menu if they close the direct connect window
if (data == null) { if (data == null) {
player.sendWindow(FormID.MAIN, getServerList(player.getServers())); player.sendWindow(FormID.MAIN, getMainMenu());
return; return;
} }
@ -236,7 +290,7 @@ public class UIHandler {
// Make sure we got an address // Make sure we got an address
if (address == null || "".equals(address)) { if (address == null || "".equals(address)) {
player.sendWindow(FormID.MAIN, getServerList(player.getServers())); player.sendWindow(FormID.MAIN, getMainMenu());
return; return;
} }
@ -259,17 +313,18 @@ public class UIHandler {
* @param data The form response data * @param data The form response data
*/ */
public static void handleEditServerListResponse(Player player, SimpleFormResponse data) { public static void handleEditServerListResponse(Player player, SimpleFormResponse data) {
List<Server> servers = player.getCurrentServers();
// Take them back to the main menu if they close the edit server list window // Take them back to the main menu if they close the edit server list window
if (data == null) { if (data == null) {
player.sendWindow(FormID.MAIN, getServerList(player.getServers())); player.sendWindow(FormID.LIST_SERVERS, getServerList(servers, player.getServerCategory()));
return; return;
} }
List<Server> servers = player.getServers();
if (data.getClickedButtonId() == servers.size()) { if (data.getClickedButtonId() == servers.size()) {
player.sendWindow(FormID.ADD_SERVER, getAddServer()); player.sendWindow(FormID.ADD_SERVER, getAddServer());
} else if (data.getClickedButtonId() == servers.size() + 1) { } else if (data.getClickedButtonId() == servers.size() + 1) {
player.sendWindow(FormID.MAIN, getServerList(player.getServers())); player.sendWindow(FormID.LIST_SERVERS, getServerList(servers, player.getServerCategory()));
} else { } else {
Server server = player.getServers().get(data.getClickedButtonId()); Server server = player.getServers().get(data.getClickedButtonId());
player.sendWindow(FormID.SERVER_OPTIONS, getServerOptions(server)); player.sendWindow(FormID.SERVER_OPTIONS, getServerOptions(server));

View file

@ -35,7 +35,7 @@ import org.geysermc.connector.common.ChatColor;
@Log4j2 @Log4j2
public class Logger extends SimpleTerminalConsole implements GeyserLogger { public class Logger extends SimpleTerminalConsole implements GeyserLogger {
private boolean colored = true; private final boolean colored = true;
@Override @Override
protected boolean isRunning() { protected boolean isRunning() {

View file

@ -26,11 +26,9 @@
package org.geysermc.connect.utils; package org.geysermc.connect.utils;
import com.nukkitx.nbt.*; import com.nukkitx.nbt.*;
import org.geysermc.connector.utils.FileUtils;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;

View file

@ -51,11 +51,11 @@ import java.util.UUID;
@Getter @Getter
public class Player { public class Player {
private String xuid; private final String xuid;
private UUID identity; private final UUID identity;
private String displayName; private final String displayName;
private BedrockServerSession session; private final BedrockServerSession session;
private final List<Server> servers = new ArrayList<>(); private final List<Server> servers = new ArrayList<>();
private final Long2ObjectMap<ModalFormRequestPacket> forms = new Long2ObjectOpenHashMap<>(); private final Long2ObjectMap<ModalFormRequestPacket> forms = new Long2ObjectOpenHashMap<>();
@ -69,6 +69,9 @@ public class Player {
@Setter @Setter
private BedrockClientData clientData; private BedrockClientData clientData;
@Setter
private ServerCategory serverCategory;
public Player(JsonNode extraData, BedrockServerSession session) { public Player(JsonNode extraData, BedrockServerSession session) {
this.xuid = extraData.get("XUID").asText(); this.xuid = extraData.get("XUID").asText();
this.identity = UUID.fromString(extraData.get("identity").asText()); this.identity = UUID.fromString(extraData.get("identity").asText());
@ -222,7 +225,7 @@ public class Player {
public void sendToServer(Server server) { public void sendToServer(Server server) {
// Tell the user we are connecting them // Tell the user we are connecting them
// this wont show up in alot of cases as the client connects quite quickly // This wont show up in a lot of cases as the client connects quite quickly
sendWindow(FormID.CONNECTING, UIHandler.getWaitingScreen(server)); sendWindow(FormID.CONNECTING, UIHandler.getWaitingScreen(server));
if (!server.isBedrock()) { if (!server.isBedrock()) {
@ -234,4 +237,12 @@ public class Player {
setCurrentServer(server); setCurrentServer(server);
connectToProxy(); connectToProxy();
} }
public List<Server> getCurrentServers() {
if (serverCategory == ServerCategory.CUSTOM) {
return servers;
}
return MasterServer.getInstance().getServers(serverCategory);
}
} }

View file

@ -42,6 +42,7 @@ public class Server {
private boolean bedrock = false; private boolean bedrock = false;
private String name = null; private String name = null;
private String imageUrl = null; private String imageUrl = null;
private ServerCategory category = null;
public Server(String address) { public Server(String address) {
this(address, -1); this(address, -1);
@ -63,6 +64,10 @@ public class Server {
this(address, port, online, bedrock, name, null); this(address, port, online, bedrock, name, null);
} }
public Server(String address, int port, boolean online, boolean bedrock, String name, String imageUrl) {
this(address, port, online, bedrock, name, imageUrl, ServerCategory.CUSTOM);
}
private int defaultPort() { return bedrock ? 19132 : 25565; } private int defaultPort() { return bedrock ? 19132 : 25565; }
public int getPort() { return port < 0 ? defaultPort() : port; } public int getPort() { return port < 0 ? defaultPort() : port; }

View file

@ -0,0 +1,41 @@
/*
* Copyright (c) 2019-2021 GeyserMC. http://geysermc.org
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @author GeyserMC
* @link https://github.com/GeyserMC/GeyserConnect
*/
package org.geysermc.connect.utils;
import lombok.Getter;
@Getter
public enum ServerCategory {
OFFICIAL("Official"),
GEYSER("Geyser"),
CUSTOM("Custom");
private final String title;
ServerCategory(String title) {
this.title = title;
}
}

View file

@ -42,7 +42,7 @@ public class WebUtils extends org.geysermc.connector.utils.WebUtils {
* @return Body contents or error message if the request fails * @return Body contents or error message if the request fails
*/ */
public static String getBody(String reqURL) { public static String getBody(String reqURL) {
URL url = null; URL url;
try { try {
url = new URL(reqURL); url = new URL(reqURL);
HttpURLConnection con = (HttpURLConnection) url.openConnection(); HttpURLConnection con = (HttpURLConnection) url.openConnection();
@ -60,7 +60,7 @@ public class WebUtils extends org.geysermc.connector.utils.WebUtils {
* *
* @param con The connection to get the string from * @param con The connection to get the string from
* @return The body of the returned page * @return The body of the returned page
* @throws IOException * @throws IOException If the request fails
*/ */
private static String connectionToString(HttpURLConnection con) throws IOException { private static String connectionToString(HttpURLConnection con) throws IOException {
// Send the request (we dont use this but its required for getErrorStream() to work) // Send the request (we dont use this but its required for getErrorStream() to work)
@ -74,7 +74,7 @@ public class WebUtils extends org.geysermc.connector.utils.WebUtils {
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream)); BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
String inputLine; String inputLine;
StringBuffer content = new StringBuffer(); StringBuilder content = new StringBuilder();
while ((inputLine = in.readLine()) != null) { while ((inputLine = in.readLine()) != null) {
content.append(inputLine); content.append(inputLine);

View file

@ -49,9 +49,11 @@ servers:
bedrock: true bedrock: true
name: Official Geyser Test Server name: Official Geyser Test Server
imageUrl: https://geysermc.org/android-chrome-192x192.png imageUrl: https://geysermc.org/android-chrome-192x192.png
category: OFFICIAL
- address: "play.cubecraft.net" - address: "play.cubecraft.net"
- address: "127.0.0.1" - address: "127.0.0.1"
port: 25565 port: 25565
category: GEYSER
custom-servers: custom-servers:
# Should custom servers be enabled for users # Should custom servers be enabled for users