Skip to content

Commit

Permalink
Configuration updates (GeyserMC#653)
Browse files Browse the repository at this point in the history
* Configuration updates

The main feature of this commit is switching Bukkit and BungeeCord to using Jackson configuration. This allows comments to load. Along with this, the Jackson configs have been consolidated into one abstract class, and a check is made to ensure auth-type cannot be set to Floodgate if Floodgate is not installed.

* Add deleted file; remove imports

* Re-add changing of Bukkit port

* Alphabetize import

* Alphabetize Bungee import

* Updates

* Swap values in GeyserJacksonConfiguration

* Add a null check for GeyserConnector in Bukkit's onDisable
  • Loading branch information
Camotoy authored Jun 10, 2020
1 parent 7231758 commit 34b367b
Show file tree
Hide file tree
Showing 18 changed files with 223 additions and 641 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,120 +25,29 @@

package org.geysermc.platform.bukkit;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Getter;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.plugin.Plugin;
import org.geysermc.connector.FloodgateKeyLoader;
import org.geysermc.connector.GeyserConfiguration;
import org.geysermc.connector.configuration.GeyserJacksonConfiguration;

import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;

public class GeyserBukkitConfiguration implements GeyserConfiguration {
@Getter
@JsonIgnoreProperties(ignoreUnknown = true)
public class GeyserBukkitConfiguration extends GeyserJacksonConfiguration {

private FileConfiguration config;
private File dataFolder;

private BukkitBedrockConfiguration bedrockConfig;
private BukkitRemoteConfiguration remoteConfig;
private BukkitMetricsInfo metricsInfo;

private Map<String, BukkitUserAuthenticationInfo> userAuthInfo = new HashMap<>();
@JsonProperty("floodgate-key-file")
private String floodgateKeyFile;

private Path floodgateKey;

public GeyserBukkitConfiguration(File dataFolder, FileConfiguration config) {
this.dataFolder = dataFolder;
this.config = config;

bedrockConfig = new BukkitBedrockConfiguration();
remoteConfig = new BukkitRemoteConfiguration();
metricsInfo = new BukkitMetricsInfo();

if (!config.contains("userAuths"))
return;

for (String key : config.getConfigurationSection("userAuths").getKeys(false)) {
userAuthInfo.put(key, new BukkitUserAuthenticationInfo(key));
}
}

public void loadFloodgate(GeyserBukkitPlugin plugin) {
Plugin floodgate = Bukkit.getPluginManager().getPlugin("floodgate-bukkit");
floodgateKey = FloodgateKeyLoader.getKey(plugin.getGeyserLogger(), this, Paths.get(dataFolder.toString(), config.getString("floodgate-key-file", "public-key.pem")), floodgate, floodgate != null ? floodgate.getDataFolder().toPath() : null);
}

@Override
public IBedrockConfiguration getBedrock() {
return bedrockConfig;
}

@Override
public IRemoteConfiguration getRemote() {
return remoteConfig;
}

@Override
public Map<String, BukkitUserAuthenticationInfo> getUserAuths() {
return userAuthInfo;
}

@Override
public boolean isCommandSuggestions() {
return config.getBoolean("command-suggestions", true);
}

@Override
public boolean isPassthroughMotd() {
return config.getBoolean("passthrough-motd", false);
}

@Override
public boolean isPassthroughPlayerCounts() {
return config.getBoolean("passthrough-player-counts", false);
}

@Override
public boolean isLegacyPingPassthrough() {
return config.getBoolean("legacy-ping-passthrough", false);
}

@Override
public int getPingPassthroughInterval() {
return config.getInt("ping-passthrough-interval", 3);
}

@Override
public int getMaxPlayers() {
return config.getInt("max-players", 10);
}

@Override
public boolean isDebugMode() {
return config.getBoolean("debug-mode", false);
}

@Override
public int getGeneralThreadPool() {
return config.getInt("general-thread-pool", 32);
}

@Override
public boolean isAllowThirdPartyCapes() {
return config.getBoolean("allow-third-party-capes", true);
}

@Override
public boolean isAllowThirdPartyEars() {
return config.getBoolean("allow-third-party-ears", false);
}

@Override
public String getDefaultLocale() {
return config.getString("default-locale", "en_us");
floodgateKey = FloodgateKeyLoader.getKey(plugin.getGeyserLogger(), this, Paths.get(plugin.getDataFolder().toString(), plugin.getConfig().getString("floodgate-key-file", "public-key.pem")), floodgate, floodgate != null ? floodgate.getDataFolder().toPath() : null);
}

@Override
Expand All @@ -150,92 +59,4 @@ public Path getFloodgateKeyFile() {
public boolean isCacheChunks() {
return true; // We override this as with Bukkit, we have direct access to the server implementation
}

@Override
public boolean isAboveBedrockNetherBuilding() {
return config.getBoolean("above-bedrock-nether-building", false);
}

@Override
public IMetricsInfo getMetrics() {
return metricsInfo;
}

public class BukkitBedrockConfiguration implements IBedrockConfiguration {

@Override
public String getAddress() {
return config.getString("bedrock.address", "0.0.0.0");
}

@Override
public int getPort() {
return config.getInt("bedrock.port", 25565);
}

@Override
public String getMotd1() {
return config.getString("bedrock.motd1", "GeyserMC");
}

@Override
public String getMotd2() {
return config.getString("bedrock.motd2", "GeyserMC");
}
}

public class BukkitRemoteConfiguration implements IRemoteConfiguration {

@Override
public String getAddress() {
return config.getString("remote.address", "127.0.0.1");
}

@Override
public int getPort() {
return config.getInt("remote.port", 25565);
}

@Override
public String getAuthType() {
return config.getString("remote.auth-type", "online");
}
}

public class BukkitUserAuthenticationInfo implements IUserAuthenticationInfo {

private String key;

public BukkitUserAuthenticationInfo(String key) {
this.key = key;
}

@Override
public String getEmail() {
return config.getString("userAuths." + key + ".email");
}

@Override
public String getPassword() {
return config.getString("userAuths." + key + ".password");
}
}

public class BukkitMetricsInfo implements IMetricsInfo {

@Override
public boolean isEnabled() {
return config.getBoolean("metrics.enabled", true);
}

@Override
public String getUniqueId() {
return config.getString("metrics.uuid", "generateduuid");
}
}

@Override
public int getConfigVersion() {
return config.getInt("config-version", 0);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,20 +28,24 @@
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
import org.geysermc.common.PlatformType;
import org.geysermc.connector.GeyserConfiguration;
import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.bootstrap.GeyserBootstrap;
import org.geysermc.connector.command.CommandManager;
import org.geysermc.connector.configuration.GeyserConfiguration;
import org.geysermc.connector.network.translators.world.WorldManager;
import org.geysermc.connector.ping.GeyserLegacyPingPassthrough;
import org.geysermc.connector.ping.IGeyserPingPassthrough;
import org.geysermc.connector.utils.FileUtils;
import org.geysermc.platform.bukkit.command.GeyserBukkitCommandExecutor;
import org.geysermc.platform.bukkit.command.GeyserBukkitCommandManager;
import org.geysermc.platform.bukkit.world.GeyserBukkitBlockPlaceListener;
import org.geysermc.platform.bukkit.world.GeyserBukkitWorldManager;
import us.myles.ViaVersion.api.Via;

import java.io.File;
import java.io.IOException;
import java.util.UUID;
import java.util.logging.Level;

public class GeyserBukkitPlugin extends JavaPlugin implements GeyserBootstrap {

Expand All @@ -56,26 +60,34 @@ public class GeyserBukkitPlugin extends JavaPlugin implements GeyserBootstrap {

@Override
public void onEnable() {
saveDefaultConfig();

this.geyserConfig = new GeyserBukkitConfiguration(getDataFolder(), getConfig());
if (geyserConfig.getMetrics().getUniqueId().equals("generateduuid")) {
getConfig().set("metrics.uuid", UUID.randomUUID().toString());
saveConfig();
// This is manually done instead of using Bukkit methods to save the config because otherwise comments get removed
try {
if (!getDataFolder().exists())
getDataFolder().mkdir();
File configFile = FileUtils.fileOrCopiedFromResource(new File(getDataFolder(), "config.yml"), "config.yml", (x) -> x.replaceAll("generateduuid", UUID.randomUUID().toString()));
this.geyserConfig = FileUtils.loadConfig(configFile, GeyserBukkitConfiguration.class);
} catch (IOException ex) {
getLogger().log(Level.WARNING, "Failed to read/create config.yml! Make sure it's up to date and/or readable+writable!", ex);
ex.printStackTrace();
}

// Don't change the ip if its listening on all interfaces
// By default this should be 127.0.0.1 but may need to be changed in some circumstances
if (!Bukkit.getIp().equals("0.0.0.0") && !Bukkit.getIp().equals("")) {
getConfig().set("remote.address", Bukkit.getIp());
geyserConfig.getRemote().setAddress(Bukkit.getIp());
}

getConfig().set("remote.port", Bukkit.getPort());
saveConfig();
geyserConfig.getRemote().setPort(Bukkit.getPort());

this.geyserLogger = new GeyserBukkitLogger(getLogger(), geyserConfig.isDebugMode());
GeyserConfiguration.checkGeyserConfiguration(geyserConfig, geyserLogger);

if (geyserConfig.getRemote().getAuthType().equals("floodgate") && Bukkit.getPluginManager().getPlugin("floodgate-bukkit") == null) {
geyserLogger.severe("Auth type set to Floodgate but Floodgate not found! Disabling...");
this.getPluginLoader().disablePlugin(this);
return;
}

geyserConfig.loadFloodgate(this);

this.connector = GeyserConnector.start(PlatformType.BUKKIT, this);
Expand Down Expand Up @@ -113,7 +125,8 @@ public void onEnable() {

@Override
public void onDisable() {
connector.shutdown();
if (connector != null)
connector.shutdown();
}

@Override
Expand Down
Loading

0 comments on commit 34b367b

Please sign in to comment.