diff --git a/src/main/java/net/raphimc/viaproxy/cli/options/Options.java b/src/main/java/net/raphimc/viaproxy/cli/options/Options.java index dddf21c..c1e8715 100644 --- a/src/main/java/net/raphimc/viaproxy/cli/options/Options.java +++ b/src/main/java/net/raphimc/viaproxy/cli/options/Options.java @@ -21,6 +21,8 @@ import joptsimple.OptionParser; import joptsimple.OptionSet; import joptsimple.OptionSpec; import net.raphimc.viaprotocolhack.util.VersionEnum; +import net.raphimc.viaproxy.plugins.PluginManager; +import net.raphimc.viaproxy.plugins.events.GetDefaultPortEvent; import net.raphimc.viaproxy.saves.impl.accounts.Account; import net.raphimc.viaproxy.util.logging.Logger; @@ -62,7 +64,7 @@ public class Options { final OptionSpec nettyThreads = parser.acceptsAll(asList("netty_threads", "t"), "The amount of netty threads to use").withRequiredArg().ofType(Integer.class).defaultsTo(NETTY_THREADS); final OptionSpec compressionThreshold = parser.acceptsAll(asList("compression_threshold", "ct", "c"), "The threshold for packet compression").withRequiredArg().ofType(Integer.class).defaultsTo(COMPRESSION_THRESHOLD); final OptionSpec connectAddress = parser.acceptsAll(asList("connect_address", "target_ip", "ca", "a"), "The address of the target server").withRequiredArg().ofType(String.class).required(); - final OptionSpec connectPort = parser.acceptsAll(asList("connect_port", "target_port", "cp", "p"), "The port of the target server").withRequiredArg().ofType(Integer.class).defaultsTo(CONNECT_PORT); + final OptionSpec connectPort = parser.acceptsAll(asList("connect_port", "target_port", "cp", "p"), "The port of the target server").withRequiredArg().ofType(Integer.class); final OptionSpec version = parser.acceptsAll(asList("version", "v"), "The version of the target server").withRequiredArg().withValuesConvertedBy(new VersionEnumConverter()).required(); final OptionSpec openAuthModAuth = parser.acceptsAll(asList("openauthmod_auth", "oam_auth"), "Enable OpenAuthMod authentication"); final OptionSpec localSocketAuth = parser.accepts("local_socket_auth", "Enable authentication over a local socket"); @@ -82,8 +84,12 @@ public class Options { ONLINE_MODE = options.has(onlineMode); NETTY_THREADS = options.valueOf(nettyThreads); CONNECT_ADDRESS = options.valueOf(connectAddress); - CONNECT_PORT = options.valueOf(connectPort); PROTOCOL_VERSION = options.valueOf(version); + if (options.has(connectPort)) { + CONNECT_PORT = options.valueOf(connectPort); + } else { + CONNECT_PORT = PluginManager.EVENT_MANAGER.call(new GetDefaultPortEvent(PROTOCOL_VERSION, 25565)).getDefaultPort(); + } COMPRESSION_THRESHOLD = options.valueOf(compressionThreshold); OPENAUTHMOD_AUTH = options.has(openAuthModAuth); LOCAL_SOCKET_AUTH = options.has(localSocketAuth); diff --git a/src/main/java/net/raphimc/viaproxy/plugins/events/GetDefaultPortEvent.java b/src/main/java/net/raphimc/viaproxy/plugins/events/GetDefaultPortEvent.java new file mode 100644 index 0000000..f84d6ac --- /dev/null +++ b/src/main/java/net/raphimc/viaproxy/plugins/events/GetDefaultPortEvent.java @@ -0,0 +1,44 @@ +/* + * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy + * Copyright (C) 2023 RK_01/RaphiMC and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package net.raphimc.viaproxy.plugins.events; + +import net.raphimc.viaprotocolhack.util.VersionEnum; + +public class GetDefaultPortEvent { + + private final VersionEnum serverVersion; + private int defaultPort; + + public GetDefaultPortEvent(final VersionEnum serverVersion, final int defaultPort) { + this.serverVersion = serverVersion; + this.defaultPort = defaultPort; + } + + public VersionEnum getServerVersion() { + return this.serverVersion; + } + + public int getDefaultPort() { + return this.defaultPort; + } + + public void setDefaultPort(final int defaultPort) { + this.defaultPort = defaultPort; + } + +} diff --git a/src/main/java/net/raphimc/viaproxy/plugins/events/ResolveSrvEvent.java b/src/main/java/net/raphimc/viaproxy/plugins/events/ResolveSrvEvent.java new file mode 100644 index 0000000..6b76aa5 --- /dev/null +++ b/src/main/java/net/raphimc/viaproxy/plugins/events/ResolveSrvEvent.java @@ -0,0 +1,55 @@ +/* + * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy + * Copyright (C) 2023 RK_01/RaphiMC and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package net.raphimc.viaproxy.plugins.events; + +import net.raphimc.viaprotocolhack.util.VersionEnum; +import net.raphimc.viaproxy.plugins.events.types.EventCancellable; + +public class ResolveSrvEvent extends EventCancellable { + + private final VersionEnum serverVersion; + private String host; + private int port; + + public ResolveSrvEvent(final VersionEnum serverVersion, final String host, final int port) { + this.serverVersion = serverVersion; + this.host = host; + this.port = port; + } + + public VersionEnum getServerVersion() { + return this.serverVersion; + } + + public String getHost() { + return host; + } + + public void setHost(final String host) { + this.host = host; + } + + public int getPort() { + return port; + } + + public void setPort(final int port) { + this.port = port; + } + +} diff --git a/src/main/java/net/raphimc/viaproxy/proxy/client2proxy/Client2ProxyHandler.java b/src/main/java/net/raphimc/viaproxy/proxy/client2proxy/Client2ProxyHandler.java index ac57b9b..d562ceb 100644 --- a/src/main/java/net/raphimc/viaproxy/proxy/client2proxy/Client2ProxyHandler.java +++ b/src/main/java/net/raphimc/viaproxy/proxy/client2proxy/Client2ProxyHandler.java @@ -42,6 +42,7 @@ import net.raphimc.viaproxy.cli.options.Options; import net.raphimc.viaproxy.plugins.PluginManager; import net.raphimc.viaproxy.plugins.events.PreConnectEvent; import net.raphimc.viaproxy.plugins.events.Proxy2ServerHandlerCreationEvent; +import net.raphimc.viaproxy.plugins.events.ResolveSrvEvent; import net.raphimc.viaproxy.proxy.LoginState; import net.raphimc.viaproxy.proxy.ProxyConnection; import net.raphimc.viaproxy.proxy.external_interface.AuthLibServices; @@ -202,8 +203,12 @@ public class Client2ProxyHandler extends SimpleChannelInboundHandler { } } + final ResolveSrvEvent resolveSrvEvent = PluginManager.EVENT_MANAGER.call(new ResolveSrvEvent(serverVersion, connectIP, connectPort)); + connectIP = resolveSrvEvent.getHost(); + connectPort = resolveSrvEvent.getPort(); + final ServerAddress serverAddress; - if (serverVersion.isOlderThan(VersionEnum.r1_3_1tor1_3_2)) { + if (resolveSrvEvent.isCancelled() || serverVersion.isOlderThan(VersionEnum.r1_3_1tor1_3_2)) { serverAddress = new ServerAddress(connectIP, connectPort); } else { serverAddress = ServerAddress.fromSRV(connectIP + ":" + connectPort); diff --git a/src/main/java/net/raphimc/viaproxy/ui/impl/GeneralTab.java b/src/main/java/net/raphimc/viaproxy/ui/impl/GeneralTab.java index fe778c1..aa62b4c 100644 --- a/src/main/java/net/raphimc/viaproxy/ui/impl/GeneralTab.java +++ b/src/main/java/net/raphimc/viaproxy/ui/impl/GeneralTab.java @@ -21,6 +21,8 @@ import com.google.common.net.HostAndPort; import net.raphimc.viaprotocolhack.util.VersionEnum; import net.raphimc.viaproxy.ViaProxy; import net.raphimc.viaproxy.cli.options.Options; +import net.raphimc.viaproxy.plugins.PluginManager; +import net.raphimc.viaproxy.plugins.events.GetDefaultPortEvent; import net.raphimc.viaproxy.saves.impl.UISave; import net.raphimc.viaproxy.ui.AUITab; import net.raphimc.viaproxy.ui.ViaProxyUI; @@ -206,8 +208,8 @@ public class GeneralTab extends AUITab { Options.BIND_PORT = bindPort; Options.ONLINE_MODE = proxyOnlineMode; Options.CONNECT_ADDRESS = hostAndPort.getHost(); - Options.CONNECT_PORT = hostAndPort.getPortOrDefault(25565); Options.PROTOCOL_VERSION = serverVersion; + Options.CONNECT_PORT = hostAndPort.getPortOrDefault(PluginManager.EVENT_MANAGER.call(new GetDefaultPortEvent(serverVersion, 25565)).getDefaultPort()); Options.BETACRAFT_AUTH = betaCraftAuth; if (authMethod != 1) {