New config
This commit is contained in:
parent
41f8bc18a3
commit
301164cb5b
|
|
@ -18,10 +18,11 @@ import java.util.Objects;
|
||||||
|
|
||||||
public class AmbassadorConfig {
|
public class AmbassadorConfig {
|
||||||
|
|
||||||
|
private static final int CONFIG_VERSION = 1;
|
||||||
private final ProxyServer server;
|
private final ProxyServer server;
|
||||||
private final Logger logger;
|
private final Logger logger;
|
||||||
private Differentiators settings;
|
private Differentiators differentiatorsSettings;
|
||||||
|
private ReSync reSyncSettings;
|
||||||
|
|
||||||
|
|
||||||
private AmbassadorConfig(ProxyServer server,Logger logger) {
|
private AmbassadorConfig(ProxyServer server,Logger logger) {
|
||||||
|
|
@ -32,17 +33,28 @@ public class AmbassadorConfig {
|
||||||
|
|
||||||
|
|
||||||
public RegisteredServer getServer(int protocolVersion) {
|
public RegisteredServer getServer(int protocolVersion) {
|
||||||
return settings.differentiators.get(protocolVersion).handshakeServer;
|
return differentiatorsSettings.differentiators.get(protocolVersion).handshakeServer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean getForced (int protocolVersion) {
|
public boolean getForced (int protocolVersion) {
|
||||||
return settings.differentiators.get(protocolVersion).forced;
|
return differentiatorsSettings.differentiators.get(protocolVersion).forced;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean shouldHandle(int protocolVersion) {
|
public boolean shouldHandle(int protocolVersion) {
|
||||||
return settings.differentiators.containsKey(protocolVersion);
|
return differentiatorsSettings.differentiators.containsKey(protocolVersion);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getReSyncTimeout() {
|
||||||
|
return reSyncSettings.reSyncTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
public reSyncOption reSyncOptionForge() {
|
||||||
|
return reSyncSettings.reSyncForgeForge;
|
||||||
|
}
|
||||||
|
|
||||||
|
public reSyncOption reSyncOptionVanilla() {
|
||||||
|
return reSyncSettings.reSyncForgeVanilla;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public static AmbassadorConfig readOrCreateConfig(Path dataDirectory,ProxyServer server, Logger logger) {
|
public static AmbassadorConfig readOrCreateConfig(Path dataDirectory,ProxyServer server, Logger logger) {
|
||||||
|
|
@ -68,10 +80,15 @@ public class AmbassadorConfig {
|
||||||
.build();
|
.build();
|
||||||
config.load();
|
config.load();
|
||||||
|
|
||||||
CommentedConfig settingsConfig = config.get("Differentiators");
|
if (config.getOrElse("config-version",0) != CONFIG_VERSION) {
|
||||||
|
throw new Exception("Incompatible config-version detected! Please delete 'ambassador.toml' and reload.");
|
||||||
|
}
|
||||||
|
CommentedConfig differentiatorsSettingsConfig = config.get("Differentiators");
|
||||||
|
CommentedConfig reSyncSettingsConfig = config.get("ReSync");
|
||||||
|
|
||||||
|
|
||||||
ambassadorConfig.settings = ambassadorConfig.new Differentiators(settingsConfig);
|
ambassadorConfig.differentiatorsSettings = ambassadorConfig.new Differentiators(differentiatorsSettingsConfig);
|
||||||
|
ambassadorConfig.reSyncSettings = ambassadorConfig.new ReSync(reSyncSettingsConfig);
|
||||||
|
|
||||||
|
|
||||||
config.save();
|
config.save();
|
||||||
|
|
@ -83,6 +100,28 @@ public class AmbassadorConfig {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class ReSync {
|
||||||
|
private int reSyncTimeout = 30;
|
||||||
|
private reSyncOption reSyncForgeForge = reSyncOption.ALWAYS;
|
||||||
|
private reSyncOption reSyncForgeVanilla = reSyncOption.NEVER;
|
||||||
|
|
||||||
|
private ReSync(CommentedConfig config) {
|
||||||
|
if (config != null) {
|
||||||
|
reSyncTimeout = config.getOrElse("resync-timeout",reSyncTimeout);
|
||||||
|
reSyncForgeForge = reSyncOption.valueOf(
|
||||||
|
config.getOrElse("resync-forge-to-forge",reSyncForgeForge.name()).toUpperCase());
|
||||||
|
}
|
||||||
|
reSyncForgeVanilla = reSyncOption.valueOf(
|
||||||
|
config.getOrElse("unsync-forge-to-vanilla",reSyncForgeVanilla.name()).toUpperCase());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum reSyncOption {
|
||||||
|
NEVER,
|
||||||
|
ASK,
|
||||||
|
ALWAYS
|
||||||
|
}
|
||||||
|
|
||||||
private class Differentiators {
|
private class Differentiators {
|
||||||
private Map<Integer,DifferentiatorSettings> differentiators = ImmutableMap.of(
|
private Map<Integer,DifferentiatorSettings> differentiators = ImmutableMap.of(
|
||||||
758, new DifferentiatorSettings(),
|
758, new DifferentiatorSettings(),
|
||||||
|
|
@ -113,7 +152,7 @@ public class AmbassadorConfig {
|
||||||
|
|
||||||
private DifferentiatorSettings(CommentedConfig config) throws Exception {
|
private DifferentiatorSettings(CommentedConfig config) throws Exception {
|
||||||
if (config != null) {
|
if (config != null) {
|
||||||
String serverName = config.getOrElse("forge-server", "");
|
String serverName = config.getOrElse("default-forge-server", "");
|
||||||
if (!Objects.equals(serverName, ""))
|
if (!Objects.equals(serverName, ""))
|
||||||
handshakeServer = server.getServer(serverName)
|
handshakeServer = server.getServer(serverName)
|
||||||
.orElseThrow(() -> new Exception(serverName + "is not a registered server!"));
|
.orElseThrow(() -> new Exception(serverName + "is not a registered server!"));
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import com.velocitypowered.api.event.Continuation;
|
||||||
import com.velocitypowered.api.event.PostOrder;
|
import com.velocitypowered.api.event.PostOrder;
|
||||||
import com.velocitypowered.api.event.Subscribe;
|
import com.velocitypowered.api.event.Subscribe;
|
||||||
import com.velocitypowered.api.event.player.ServerPreConnectEvent;
|
import com.velocitypowered.api.event.player.ServerPreConnectEvent;
|
||||||
|
import com.velocitypowered.api.proxy.Player;
|
||||||
import com.velocitypowered.api.util.GameProfile;
|
import com.velocitypowered.api.util.GameProfile;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
@ -13,17 +14,16 @@ import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.format.NamedTextColor;
|
import net.kyori.adventure.text.format.NamedTextColor;
|
||||||
import org.adde0109.ambassador.Ambassador;
|
import org.adde0109.ambassador.Ambassador;
|
||||||
|
|
||||||
|
import org.adde0109.ambassador.AmbassadorConfig;
|
||||||
import org.apache.commons.collections4.map.PassiveExpiringMap;
|
import org.apache.commons.collections4.map.PassiveExpiringMap;
|
||||||
|
|
||||||
public class ForgeServerSwitchHandler {
|
public class ForgeServerSwitchHandler {
|
||||||
|
|
||||||
private static final int RESYNC_EXPIRY_TIME = 20;
|
|
||||||
private final Ambassador ambassador;
|
private final Ambassador ambassador;
|
||||||
public final PassiveExpiringMap<String,ForgeServerConnection> reSyncMap;
|
public final PassiveExpiringMap<String,ForgeServerConnection> reSyncMap;
|
||||||
|
|
||||||
public ForgeServerSwitchHandler(Ambassador ambassador) {
|
public ForgeServerSwitchHandler(Ambassador ambassador) {
|
||||||
this.ambassador = ambassador;
|
this.ambassador = ambassador;
|
||||||
this.reSyncMap = new PassiveExpiringMap<>(RESYNC_EXPIRY_TIME,TimeUnit.SECONDS);
|
this.reSyncMap = new PassiveExpiringMap<>(ambassador.config.getReSyncTimeout(),TimeUnit.SECONDS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -55,11 +55,11 @@ public class ForgeServerSwitchHandler {
|
||||||
properties.add(new GameProfile.Property("extraData", "\1FML2\1",""));
|
properties.add(new GameProfile.Property("extraData", "\1FML2\1",""));
|
||||||
event.getPlayer().setGameProfileProperties(properties);
|
event.getPlayer().setGameProfileProperties(properties);
|
||||||
|
|
||||||
if (!msg.equals(forgeConnection.get().getTransmittedHandshake().get())) {
|
if (ambassador.config.reSyncOptionForge() != AmbassadorConfig.reSyncOption.NEVER) {
|
||||||
event.setResult(ServerPreConnectEvent.ServerResult.denied());
|
if (forgeConnection.get().getTransmittedHandshake().isEmpty() || !msg.equals(forgeConnection.get().getTransmittedHandshake().get())) {
|
||||||
ambassador.logger.info("Kicking {} because of re-sync needed", event.getPlayer());
|
event.setResult(ServerPreConnectEvent.ServerResult.denied());
|
||||||
event.getPlayer().disconnect(Component.text("Please reconnect"));
|
reSync(event.getPlayer(),forgeServerConnection);
|
||||||
reSyncMap.put(event.getPlayer().getUsername(),forgeServerConnection);
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
continuation.resume();
|
continuation.resume();
|
||||||
|
|
@ -74,4 +74,9 @@ public class ForgeServerSwitchHandler {
|
||||||
continuation.resume();
|
continuation.resume();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
private void reSync(Player player, ForgeServerConnection forgeServerConnection) {
|
||||||
|
ambassador.logger.info("Kicking {} because of re-sync needed", player);
|
||||||
|
player.disconnect(Component.text("Please reconnect"));
|
||||||
|
reSyncMap.put(player.getUsername(),forgeServerConnection);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,39 @@
|
||||||
#Maybe you want to have one 1.16.5 modpack-server and one 1.18.2 modpack-server behind Velocity, in order for Ambassador to tell the
|
config-version = 1
|
||||||
#diffrence between modpacks on the connecting client, the plugin looks at the client's protocol version.
|
# The player can only be synced to ONE forge server at a time.
|
||||||
|
# Resync will always happen if the player isn't synced to any server and is switching to a forge server.
|
||||||
|
[ReSync]
|
||||||
|
# In seconds. How much time the player has to reconnect before the resync cancels.
|
||||||
|
resync-timeout = 30
|
||||||
|
|
||||||
#You may add more diffrentiators, just make sure they have diffrent protocol versions.
|
# Possible values: "Always", "Never".
|
||||||
|
# Always: Always kicks the player while switching servers. The safest.
|
||||||
|
# Never: Switches server without kicking/resyncing the player. Can cause client crashes depending on the mods.
|
||||||
|
|
||||||
|
# When the player is connecting to a forge server while being synced to another.
|
||||||
|
# Default: "always"
|
||||||
|
resync-forge-to-forge = "always"
|
||||||
|
# When the player is connecting to a vanilla server and is synced to a forge server.
|
||||||
|
# Default "never". "always" not recommended for servers with vanilla hubs/lobbies.
|
||||||
|
unsync-forge-to-vanilla = "never"
|
||||||
|
|
||||||
|
# Maybe you want to have one 1.16.5 modpack-server and one 1.18.2 modpack-server behind Velocity, in order for Ambassador to tell the
|
||||||
|
# diffrence between modpacks on the connecting client, the plugin looks at the client's protocol version.
|
||||||
|
|
||||||
|
# You may add more diffrentiators, just make sure they have diffrent protocol versions.
|
||||||
[Differentiators]
|
[Differentiators]
|
||||||
|
|
||||||
#Protocol version - 1.18.2
|
# Protocol version - 1.18.2
|
||||||
[Differentiators.758]
|
[Differentiators.758]
|
||||||
#The name of the forge server that forge players should be able to connect to.
|
# The server that players will initially sync to when connecting to the proxy.
|
||||||
#This server must have Ambassador-forge installed.
|
# When left empty; Players will be able to join but will need to resync when joining connecting to a forge server.
|
||||||
#The name should be the same as specified in the "velocity.toml" config, e.g. "lobby".
|
# The name should be the same as specified in the "velocity.toml" config, e.g. "lobby".
|
||||||
forge-server = ""
|
default-forge-server = ""
|
||||||
|
|
||||||
#Some modpacks are not compatible with vanilla servers.
|
# Some modpacks are not compatible with vanilla servers.
|
||||||
#To make sure they don't get connected to one upon login (like a vanilla lobby), change this to true.
|
# To make sure they don't get connected to one upon login (like a vanilla lobby), change this to true.
|
||||||
forced = false
|
forced = false
|
||||||
|
|
||||||
#Protocol version - 1.16.5
|
# Protocol version - 1.16.5
|
||||||
[Differentiators.754]
|
[Differentiators.754]
|
||||||
forge-server = ""
|
default-forge-server = ""
|
||||||
forced = false
|
forced = false
|
||||||
Loading…
Reference in New Issue
Block a user