From 70fd9867f54139dbace6ee3d99c92d68b83df456 Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Sat, 21 Dec 2019 16:18:34 -0600 Subject: [PATCH] Add Sponge platform bootstrap --- .../platform/bukkit/GeyserBukkitLogger.java | 8 +- bootstrap/pom.xml | 2 +- bootstrap/sponge/pom.xml | 84 +++++++++ .../sponge/GeyserSpongeConfiguration.java | 161 ++++++++++++++++++ .../platform/sponge/GeyserSpongeLogger.java | 54 ++++++ .../platform/sponge/GeyserSpongePlugin.java | 87 ++++++++++ .../geysermc/connector/utils/FileUtils.java | 9 +- 7 files changed, 396 insertions(+), 9 deletions(-) create mode 100644 bootstrap/sponge/pom.xml create mode 100644 bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongeConfiguration.java create mode 100644 bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongeLogger.java create mode 100644 bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongePlugin.java diff --git a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitLogger.java b/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitLogger.java index 95214972f..05fd2c6c8 100644 --- a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitLogger.java +++ b/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitLogger.java @@ -25,21 +25,19 @@ package org.geysermc.platform.bukkit; +import lombok.AllArgsConstructor; + import org.geysermc.common.logger.IGeyserLogger; import java.util.logging.Level; import java.util.logging.Logger; +@AllArgsConstructor public class GeyserBukkitLogger implements IGeyserLogger { private Logger logger; private boolean debugMode; - public GeyserBukkitLogger(Logger logger, boolean debugMode) { - this.logger = logger; - this.debugMode = debugMode; - } - @Override public void severe(String message) { logger.severe(message); diff --git a/bootstrap/pom.xml b/bootstrap/pom.xml index 7cc7e2ba6..b826f61ac 100644 --- a/bootstrap/pom.xml +++ b/bootstrap/pom.xml @@ -33,7 +33,7 @@ bukkit bungeecord - + sponge standalone diff --git a/bootstrap/sponge/pom.xml b/bootstrap/sponge/pom.xml new file mode 100644 index 000000000..0e8222730 --- /dev/null +++ b/bootstrap/sponge/pom.xml @@ -0,0 +1,84 @@ + + + 4.0.0 + + org.geysermc + bootstrap-parent + 1.0-SNAPSHOT + ../ + + bootstrap-sponge + + + org.geysermc + connector + 1.0-SNAPSHOT + compile + + + org.spongepowered + spongeapi + 7.1.0 + provided + + + + ${outputName}-Sponge + ../../target + + + src/main/resources/ + true + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.1 + + + package + + shade + + + + + com.fasterxml.jackson + org.geysermc.platform.sponge.shaded.jackson + + + io.netty + org.geysermc.platform.sponge.shaded.netty + + + true + + + + + + + *:* + + META-INF/* + + + + + + com.google.code.gson:* + org.yaml:* + com.nukkitx:fastutil-lite:* + org.slf4j:* + org.ow2.asm:* + + + + + + + \ No newline at end of file diff --git a/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongeConfiguration.java b/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongeConfiguration.java new file mode 100644 index 000000000..8ae4c31df --- /dev/null +++ b/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongeConfiguration.java @@ -0,0 +1,161 @@ +package org.geysermc.platform.sponge; + +import lombok.AllArgsConstructor; + +import ninja.leaping.configurate.ConfigurationNode; + +import org.geysermc.common.IGeyserConfiguration; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class GeyserSpongeConfiguration implements IGeyserConfiguration { + + private ConfigurationNode node; + + private SpongeBedrockConfiguration bedrockConfig; + private SpongeRemoteConfiguration remoteConfig; + private SpongeMetricsInfo metricsInfo; + + private Map userAuthInfo = new HashMap<>(); + + public GeyserSpongeConfiguration(ConfigurationNode node) { + this.node = node; + + this.bedrockConfig = new SpongeBedrockConfiguration(node.getNode("bedrock")); + this.remoteConfig = new SpongeRemoteConfiguration(node.getNode("remote")); + this.metricsInfo = new SpongeMetricsInfo(); + + if (node.getNode("userAuths").getValue() == null) + return; + + for (String key : (List) node.getNode("userAuths").getValue()) { + userAuthInfo.put(key, new SpongeUserAuthenticationInfo(key)); + } + } + + @Override + public SpongeBedrockConfiguration getBedrock() { + return bedrockConfig; + } + + @Override + public SpongeRemoteConfiguration getRemote() { + return remoteConfig; + } + + @Override + public Map getUserAuths() { + return userAuthInfo; + } + + @Override + public boolean isPingPassthrough() { + return node.getNode("ping-passthrough").getBoolean(false); + } + + @Override + public int getMaxPlayers() { + return node.getNode("max-players").getInt(100); + } + + @Override + public boolean isDebugMode() { + return node.getNode("debug-mode").getBoolean(false); + } + + @Override + public int getGeneralThreadPool() { + return node.getNode("genereal-thread-pool").getInt(32); + } + + @Override + public boolean isAllowThirdPartyCapes() { + return node.getNode("allow-third-party-capes").getBoolean(true); + } + + @Override + public SpongeMetricsInfo getMetrics() { + return metricsInfo; + } + + @AllArgsConstructor + public class SpongeBedrockConfiguration implements IBedrockConfiguration { + + private ConfigurationNode node; + + @Override + public String getAddress() { + return node.getNode("address").getString("0.0.0.0"); + } + + @Override + public int getPort() { + return node.getNode("port").getInt(19132); + } + + @Override + public String getMotd1() { + return node.getNode("motd1").getString("GeyserMC"); + } + + @Override + public String getMotd2() { + return node.getNode("motd2").getString("GeyserMC"); + } + } + + @AllArgsConstructor + public class SpongeRemoteConfiguration implements IRemoteConfiguration { + + private ConfigurationNode node; + + @Override + public String getAddress() { + return node.getNode("address").getString("127.0.0.1"); + } + + @Override + public int getPort() { + return node.getNode("port").getInt(25565); + } + + @Override + public String getAuthType() { + return node.getNode("auth-type").getString("online"); + } + } + + public class SpongeUserAuthenticationInfo implements IUserAuthenticationInfo { + + private String key; + + public SpongeUserAuthenticationInfo(String key) { + this.key = key; + } + + @Override + public String getEmail() { + return node.getNode("userAuths").getNode(key).getNode("email").getString(); + } + + @Override + public String getPassword() { + return node.getNode("userAuths").getNode(key).getNode("password").getString(); + } + } + + public class SpongeMetricsInfo implements IMetricsInfo { + + @Override + public boolean isEnabled() { + return node.getNode("metrics").getNode("enabled").getBoolean(true); + } + + @Override + public String getUniqueId() { + return node.getNode("metrics").getNode("uuid").getString("generateduuid"); + } + } +} diff --git a/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongeLogger.java b/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongeLogger.java new file mode 100644 index 000000000..b183d4586 --- /dev/null +++ b/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongeLogger.java @@ -0,0 +1,54 @@ +package org.geysermc.platform.sponge; + +import lombok.AllArgsConstructor; + +import org.geysermc.common.logger.IGeyserLogger; +import org.slf4j.Logger; + +@AllArgsConstructor +public class GeyserSpongeLogger implements IGeyserLogger { + + private Logger logger; + private boolean debugMode; + + @Override + public void severe(String message) { + logger.error(message); + } + + @Override + public void severe(String message, Throwable error) { + logger.error(message, error); + } + + @Override + public void error(String message) { + logger.error(message); + } + + @Override + public void error(String message, Throwable error) { + logger.error(message, error); + } + + @Override + public void warning(String message) { + logger.warn(message); + } + + @Override + public void info(String message) { + logger.info(message); + } + + @Override + public void debug(String message) { + if (debugMode) + info(message); + } + + @Override + public void setDebug(boolean debugMode) { + this.debugMode = debugMode; + } +} diff --git a/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongePlugin.java b/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongePlugin.java new file mode 100644 index 000000000..76a89cfb6 --- /dev/null +++ b/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongePlugin.java @@ -0,0 +1,87 @@ +package org.geysermc.platform.sponge; + +import com.google.inject.Inject; + +import ninja.leaping.configurate.loader.ConfigurationLoader; +import ninja.leaping.configurate.yaml.YAMLConfigurationLoader; + +import org.geysermc.common.PlatformType; +import org.geysermc.common.bootstrap.IGeyserBootstrap; +import org.geysermc.connector.GeyserConnector; +import org.geysermc.connector.utils.FileUtils; +import org.slf4j.Logger; +import org.spongepowered.api.config.ConfigDir; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.game.state.GameStartedServerEvent; +import org.spongepowered.api.event.game.state.GameStoppedEvent; +import org.spongepowered.api.plugin.Plugin; + +import java.io.File; +import java.io.IOException; +import java.util.UUID; + +@Plugin(id = "geyser", name = GeyserConnector.NAME + "-Sponge", version = GeyserConnector.VERSION, url = "https://geysermc.org", authors = "GeyserMC") +public class GeyserSpongePlugin implements IGeyserBootstrap { + + @Inject + private Logger logger; + + @Inject + @ConfigDir(sharedRoot = false) + private File configDir; + + private GeyserSpongeConfiguration geyserConfig; + private GeyserSpongeLogger geyserLogger; + + @Override + public void onEnable() { + if (!configDir.exists()) + configDir.mkdirs(); + + File configFile = null; + try { + configFile = FileUtils.fileOrCopiedFromResource(new File(configDir, "config.yml"), "config.yml", (file) -> file.replaceAll("generateduuid", UUID.randomUUID().toString())); + } catch (IOException ex) { + logger.warn("Failed to copy config.yml from jar path!"); + ex.printStackTrace(); + } + + ConfigurationLoader loader = YAMLConfigurationLoader.builder().setPath(configFile.toPath()).build(); + try { + this.geyserConfig = new GeyserSpongeConfiguration(loader.load()); + } catch (IOException ex) { + logger.warn("Failed to load config.yml!"); + ex.printStackTrace(); + return; + } + + this.geyserLogger = new GeyserSpongeLogger(logger, geyserConfig.isDebugMode()); + + GeyserConnector.start(PlatformType.SPONGE, this); + } + + @Override + public void onDisable() { + GeyserConnector.stop(); + } + + @Override + public GeyserSpongeConfiguration getGeyserConfig() { + return geyserConfig; + } + + @Override + public GeyserSpongeLogger getGeyserLogger() { + return geyserLogger; + } + + @Listener + public void onServerStart(GameStartedServerEvent event) { + onEnable(); + } + + @Listener + public void onServerStop(GameStoppedEvent event) { + onDisable(); + } +} diff --git a/connector/src/main/java/org/geysermc/connector/utils/FileUtils.java b/connector/src/main/java/org/geysermc/connector/utils/FileUtils.java index e28e3662a..ff3793f35 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/FileUtils.java +++ b/connector/src/main/java/org/geysermc/connector/utils/FileUtils.java @@ -2,19 +2,24 @@ package org.geysermc.connector.utils; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; + import org.geysermc.connector.GeyserConnector; import java.io.*; import java.util.function.Function; public class FileUtils { + public static T loadConfig(File src, Class valueType) throws IOException { ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory()); return objectMapper.readValue(src, valueType); } public static File fileOrCopiedFromResource(String name, Function s) throws IOException { - File file = new File(name); + return fileOrCopiedFromResource(new File(name), name, s); + } + + public static File fileOrCopiedFromResource(File file, String name, Function s) throws IOException { if (!file.exists()) { FileOutputStream fos = new FileOutputStream(file); InputStream input = GeyserConnector.class.getResourceAsStream("/" + name); // resources need leading "/" prefix @@ -34,6 +39,4 @@ public class FileUtils { return file; } - - }