Skip to content

Commit 49bd64a

Browse files
committed
Use optconfig 2.0
1 parent af45d96 commit 49bd64a

10 files changed

Lines changed: 146 additions & 139 deletions

build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@ dependencies {
106106
includeInJar "dev.kastle.webrtc:webrtc-java:1.0.3:$it"
107107
}
108108
includeInJar "gs.mclo:api:6.2.1"
109-
includeInJar "net.lenni0451:optconfig:1.1.1"
109+
includeInJar "net.lenni0451.optconfig:core:2.0.0-20260502.183532-3"
110+
includeInJar "net.lenni0451.optconfig:cli:2.0.0-20260502.183532-3"
110111

111112
includeInJarJ8(compileOnly("xyz.wagyourtail.jvmdowngrader:jvmdowngrader:1.3.6"))
112113
includeInJarJ8 "xyz.wagyourtail.jvmdowngrader:jvmdowngrader-java-api:1.3.6:downgraded-8"

src/main/java/net/raphimc/viaproxy/ViaProxy.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import net.raphimc.viaproxy.plugins.events.ProxyStopEvent;
4545
import net.raphimc.viaproxy.plugins.events.ViaProxyLoadedEvent;
4646
import net.raphimc.viaproxy.protocoltranslator.ProtocolTranslator;
47+
import net.raphimc.viaproxy.protocoltranslator.viaproxy.ViaProxyCLIConfig;
4748
import net.raphimc.viaproxy.protocoltranslator.viaproxy.ViaProxyConfig;
4849
import net.raphimc.viaproxy.proxy.client2proxy.Client2ProxyChannelInitializer;
4950
import net.raphimc.viaproxy.proxy.client2proxy.Client2ProxyHandler;
@@ -232,7 +233,11 @@ public static void injectedMain(final String injectionMethod, final String[] arg
232233
viaProxyConfigFile = new File(ViaProxy.getCwd(), "viaproxy.yml");
233234
}
234235
final boolean firstStart = !viaProxyConfigFile.exists();
235-
CONFIG = ViaProxyConfig.create(viaProxyConfigFile);
236+
if (!useUI && useCLI) {
237+
CONFIG = ViaProxyCLIConfig.create(viaProxyConfigFile);
238+
} else {
239+
CONFIG = ViaProxyConfig.create(viaProxyConfigFile);
240+
}
236241

237242
if (useUI) {
238243
progressConsumer.accept("Loading GUI");
@@ -256,7 +261,7 @@ public static void injectedMain(final String injectionMethod, final String[] arg
256261
final String[] cliArgs = new String[args.length - 1];
257262
System.arraycopy(args, 1, cliArgs, 0, cliArgs.length);
258263
try {
259-
CONFIG.loadFromArguments(cliArgs);
264+
((ViaProxyCLIConfig) CONFIG).loadFromArguments(cliArgs);
260265
} catch (Throwable e) {
261266
throw new RuntimeException("Failed to load CLI arguments", e);
262267
}

src/main/java/net/raphimc/viaproxy/cli/HelpRequestedException.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,5 @@
1717
*/
1818
package net.raphimc.viaproxy.cli;
1919

20-
public class HelpRequestedException extends RuntimeException {
20+
public class HelpRequestedException extends Exception {
2121
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
/*
2+
* This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
3+
* Copyright (C) 2021-2026 RK_01/RaphiMC and contributors
4+
*
5+
* This program is free software: you can redistribute it and/or modify
6+
* it under the terms of the GNU General Public License as published by
7+
* the Free Software Foundation, either version 3 of the License, or
8+
* (at your option) any later version.
9+
*
10+
* This program is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
* GNU General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU General Public License
16+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
17+
*/
18+
package net.raphimc.viaproxy.protocoltranslator.viaproxy;
19+
20+
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
21+
import net.lenni0451.optconfig.CLIConfigLoader;
22+
import net.lenni0451.optconfig.ConfigContext;
23+
import net.lenni0451.optconfig.ConfigLoader;
24+
import net.lenni0451.optconfig.annotations.CheckSuperclasses;
25+
import net.lenni0451.optconfig.annotations.OptConfig;
26+
import net.lenni0451.optconfig.annotations.Option;
27+
import net.lenni0451.optconfig.cli.HelpOptions;
28+
import net.lenni0451.optconfig.cli.UnknownOption;
29+
import net.lenni0451.optconfig.exceptions.CLIIncompatibleOptionException;
30+
import net.lenni0451.optconfig.exceptions.CLIParserException;
31+
import net.lenni0451.optconfig.provider.ConfigProvider;
32+
import net.raphimc.viaproxy.cli.HelpRequestedException;
33+
import net.raphimc.viaproxy.util.logging.Logger;
34+
35+
import java.io.File;
36+
import java.util.List;
37+
38+
@OptConfig
39+
@CheckSuperclasses
40+
public class ViaProxyCLIConfig extends ViaProxyConfig {
41+
42+
private ConfigContext<ViaProxyCLIConfig> configContext;
43+
44+
@Option("help")
45+
private boolean help = false;
46+
@Option("list-versions")
47+
private boolean listVersions = false;
48+
49+
public static ViaProxyCLIConfig create(final File configFile) {
50+
final ConfigLoader<ViaProxyCLIConfig> configLoader = new ConfigLoader<>(ViaProxyCLIConfig.class);
51+
configLoader.getConfigOptions().setResetInvalidOptions(true).setRewriteConfig(true).setCommentSpacing(1);
52+
try {
53+
return configLoader.load(ConfigProvider.file(configFile)).getConfigInstance();
54+
} catch (Throwable e) {
55+
throw new RuntimeException("Failed to load config", e);
56+
}
57+
}
58+
59+
public void loadFromArguments(final String[] args) {
60+
CLIConfigLoader<ViaProxyCLIConfig> cliConfigLoader = new CLIConfigLoader<>(this.configContext);
61+
try {
62+
// ViaProxy.EVENT_MANAGER.call(new PreOptionsParseEvent(optionParser));
63+
64+
List<UnknownOption> unknownOptions = cliConfigLoader.loadCLIOptions(args, true);
65+
if (this.help) {
66+
throw new HelpRequestedException();
67+
} else if (this.listVersions) {
68+
Logger.LOGGER.info("=== Supported Server Versions ===");
69+
for (ProtocolVersion version : ProtocolVersion.getProtocols()) {
70+
Logger.LOGGER.info(version.getName());
71+
}
72+
Logger.LOGGER.info("===================================");
73+
System.exit(0);
74+
}
75+
76+
// if (options.has("minecraft-account-index")) {
77+
// this.setAuthMethod(AuthMethod.ACCOUNT);
78+
// }
79+
80+
// ViaProxy.EVENT_MANAGER.call(new PostOptionsParseEvent(options));
81+
return;
82+
} catch (CLIParserException e) {
83+
Logger.LOGGER.fatal("Error parsing CLI options: {}", e.getMessage());
84+
} catch (CLIIncompatibleOptionException e) {
85+
Logger.LOGGER.fatal("Config option incompatible with CLI, please contact the developer and provide the following error", e);
86+
System.exit(1);
87+
} catch (HelpRequestedException ignored) {
88+
}
89+
90+
String help = cliConfigLoader.buildCLIHelp(HelpOptions.DEFAULT/*.withShowDepends(false).withShowDescription(false).withSort(true).withShowBooleanType(false).withQuoteStrings(true)*/);
91+
Logger.SYSOUT.println(help);
92+
Logger.LOGGER.info("For a more detailed description of the options, please refer to the viaproxy.yml file.");
93+
System.exit(1);
94+
}
95+
96+
}

src/main/java/net/raphimc/viaproxy/protocoltranslator/viaproxy/ViaProxyConfig.java

Lines changed: 0 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,11 @@
1818
package net.raphimc.viaproxy.protocoltranslator.viaproxy;
1919

2020
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
21-
import joptsimple.OptionException;
22-
import joptsimple.OptionParser;
23-
import joptsimple.OptionSet;
24-
import joptsimple.OptionSpec;
2521
import net.lenni0451.optconfig.ConfigContext;
2622
import net.lenni0451.optconfig.ConfigLoader;
2723
import net.lenni0451.optconfig.annotations.*;
28-
import net.lenni0451.optconfig.index.ClassIndexer;
29-
import net.lenni0451.optconfig.index.ConfigType;
30-
import net.lenni0451.optconfig.index.types.ConfigOption;
31-
import net.lenni0451.optconfig.index.types.SectionIndex;
3224
import net.lenni0451.optconfig.migrate.ConfigMigrator;
3325
import net.lenni0451.optconfig.provider.ConfigProvider;
34-
import net.raphimc.viaproxy.ViaProxy;
35-
import net.raphimc.viaproxy.cli.BetterHelpFormatter;
36-
import net.raphimc.viaproxy.cli.HelpRequestedException;
37-
import net.raphimc.viaproxy.plugins.events.PostOptionsParseEvent;
38-
import net.raphimc.viaproxy.plugins.events.PreOptionsParseEvent;
3926
import net.raphimc.viaproxy.protocoltranslator.ProtocolTranslator;
4027
import net.raphimc.viaproxy.saves.impl.accounts.Account;
4128
import net.raphimc.viaproxy.util.AddressUtil;
@@ -46,7 +33,6 @@
4633
import java.net.SocketAddress;
4734
import java.util.HashMap;
4835
import java.util.Map;
49-
import java.util.Stack;
5036

5137
@OptConfig(header = "ViaProxy configuration file", version = 2)
5238
@Migrator(from = 1, to = 2, migrator = ViaProxyConfig.Migrator1To2.class)
@@ -76,76 +62,6 @@ public static ViaProxyConfig create(final File configFile) {
7662
}
7763
}
7864

79-
@SuppressWarnings("UnstableApiUsage")
80-
public void loadFromArguments(final String[] args) throws Exception {
81-
final OptionParser optionParser = new OptionParser();
82-
final OptionSpec<Void> optionHelp = optionParser.accepts("help").forHelp();
83-
final OptionSpec<Void> optionListVersions = optionParser.accepts("list-versions", "Lists all supported server/target versions").forHelp();
84-
85-
final Map<OptionSpec<Object>, ConfigOption> optionMap = new HashMap<>();
86-
final Stack<SectionIndex> stack = new Stack<>();
87-
final ConfigLoader<ViaProxyConfig> configLoader = new ConfigLoader<>(ViaProxyConfig.class);
88-
stack.push(ClassIndexer.indexClass(ConfigType.INSTANCED, ViaProxyConfig.class, configLoader.getConfigOptions().getClassAccessFactory()));
89-
while (!stack.isEmpty()) {
90-
final SectionIndex index = stack.pop();
91-
stack.addAll(index.getSubSections().values());
92-
93-
for (ConfigOption option : index.getOptions()) {
94-
if (index.getSubSections().containsKey(option)) continue;
95-
96-
Object defaultValue = option.getFieldAccess().getValue(this);
97-
if (option.getTypeSerializer() != null) {
98-
defaultValue = option.createTypeSerializer(configLoader, ViaProxyConfig.class, this).serialize(defaultValue);
99-
}
100-
final OptionSpec<Object> cliOption = optionParser.accepts(option.getName()).withRequiredArg().ofType((Class<Object>) defaultValue.getClass()).defaultsTo(defaultValue);
101-
optionMap.put(cliOption, option);
102-
}
103-
}
104-
105-
try {
106-
ViaProxy.EVENT_MANAGER.call(new PreOptionsParseEvent(optionParser));
107-
final OptionSet options = optionParser.parse(args);
108-
if (options.has(optionHelp)) {
109-
throw new HelpRequestedException();
110-
} else if (options.has(optionListVersions)) {
111-
Logger.LOGGER.info("=== Supported Server Versions ===");
112-
for (ProtocolVersion version : ProtocolVersion.getProtocols()) {
113-
Logger.LOGGER.info(version.getName());
114-
}
115-
Logger.LOGGER.info("===================================");
116-
System.exit(0);
117-
}
118-
119-
if (options.has("minecraft-account-index")) {
120-
this.getBackend().setAuthMethod(AuthMethod.ACCOUNT);
121-
}
122-
for (Map.Entry<OptionSpec<Object>, ConfigOption> entry : optionMap.entrySet()) {
123-
final ConfigOption option = entry.getValue();
124-
if (options.has(entry.getKey())) {
125-
Object value = options.valueOf(entry.getKey());
126-
if (option.getTypeSerializer() != null) {
127-
value = option.createTypeSerializer(configLoader, ViaProxyConfig.class, this).deserialize((Class<Object>) option.getFieldAccess().getType(), value);
128-
}
129-
if (option.getValidator() != null) {
130-
value = option.getValidator().invoke(this, value);
131-
}
132-
option.getFieldAccess().setValue(this, value);
133-
}
134-
}
135-
136-
ViaProxy.EVENT_MANAGER.call(new PostOptionsParseEvent(options));
137-
return;
138-
} catch (OptionException e) {
139-
Logger.LOGGER.fatal("Error parsing CLI options: " + e.getMessage());
140-
} catch (HelpRequestedException ignored) {
141-
}
142-
143-
optionParser.formatHelpWith(new BetterHelpFormatter());
144-
optionParser.printHelpOn(Logger.SYSOUT);
145-
Logger.LOGGER.info("For a more detailed description of the options, please refer to the viaproxy.yml file.");
146-
System.exit(1);
147-
}
148-
14965
public void save() {
15066
try {
15167
this.configContext.save();

src/main/java/net/raphimc/viaproxy/util/config/AccountTypeSerializer.java

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,33 +18,32 @@
1818
package net.raphimc.viaproxy.util.config;
1919

2020
import net.lenni0451.optconfig.serializer.ConfigTypeSerializer;
21+
import net.lenni0451.optconfig.serializer.info.DeserializerInfo;
22+
import net.lenni0451.optconfig.serializer.info.SerializerInfo;
2123
import net.raphimc.viaproxy.ViaProxy;
2224
import net.raphimc.viaproxy.protocoltranslator.viaproxy.ViaProxyConfig;
2325
import net.raphimc.viaproxy.saves.impl.accounts.Account;
2426

2527
import java.util.List;
2628

27-
public class AccountTypeSerializer extends ConfigTypeSerializer<ViaProxyConfig, Account> {
28-
29-
public AccountTypeSerializer(final ViaProxyConfig config) {
30-
super(config);
31-
}
29+
public class AccountTypeSerializer implements ConfigTypeSerializer<Account> {
3230

3331
@Override
34-
public Account deserialize(final Class<Account> typeClass, final Object serializedObject) {
32+
public Account deserialize(final DeserializerInfo<Account> info) {
3533
final List<Account> accounts = ViaProxy.getSaveManager().accountsSave.getAccounts();
36-
final int accountIndex = (int) serializedObject;
37-
if (this.config.getAuthMethod() == ViaProxyConfig.AuthMethod.ACCOUNT && accountIndex >= 0 && accountIndex < accounts.size()) {
34+
final int accountIndex = (int) info.value();
35+
final ViaProxyConfig config = (ViaProxyConfig) info.configInstance();
36+
if (config.getBackend().getAuthMethod() == ViaProxyConfig.AuthMethod.ACCOUNT && accountIndex >= 0 && accountIndex < accounts.size()) {
3837
return accounts.get(accountIndex);
3938
} else {
4039
return null;
4140
}
4241
}
4342

4443
@Override
45-
public Object serialize(final Account object) {
46-
if (object != null) {
47-
return ViaProxy.getSaveManager().accountsSave.getAccounts().indexOf(object);
44+
public Object serialize(final SerializerInfo<Account> info) {
45+
if (info.value() != null) {
46+
return ViaProxy.getSaveManager().accountsSave.getAccounts().indexOf(info.value());
4847
} else {
4948
return 0;
5049
}

src/main/java/net/raphimc/viaproxy/util/config/BackendAddressTypeSerializer.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,25 +18,24 @@
1818
package net.raphimc.viaproxy.util.config;
1919

2020
import net.lenni0451.optconfig.serializer.ConfigTypeSerializer;
21+
import net.lenni0451.optconfig.serializer.info.DeserializerInfo;
22+
import net.lenni0451.optconfig.serializer.info.SerializerInfo;
2123
import net.raphimc.viaproxy.protocoltranslator.viaproxy.ViaProxyConfig;
2224
import net.raphimc.viaproxy.util.AddressUtil;
2325

2426
import java.net.SocketAddress;
2527

26-
public class BackendAddressTypeSerializer extends ConfigTypeSerializer<ViaProxyConfig, SocketAddress> {
27-
28-
public BackendAddressTypeSerializer(final ViaProxyConfig config) {
29-
super(config);
30-
}
28+
public class BackendAddressTypeSerializer implements ConfigTypeSerializer<SocketAddress> {
3129

3230
@Override
33-
public SocketAddress deserialize(final Class<SocketAddress> typeClass, final Object serializedObject) {
34-
return AddressUtil.parse((String) serializedObject, this.config.getTargetVersion());
31+
public SocketAddress deserialize(final DeserializerInfo<SocketAddress> info) {
32+
final ViaProxyConfig config = (ViaProxyConfig) info.configInstance();
33+
return AddressUtil.parse((String) info.value(), config.getBackend().getVersion());
3534
}
3635

3736
@Override
38-
public Object serialize(final SocketAddress object) {
39-
return AddressUtil.toString(object);
37+
public Object serialize(final SerializerInfo<SocketAddress> info) {
38+
return AddressUtil.toString(info.value());
4039
}
4140

4241
}

src/main/java/net/raphimc/viaproxy/util/config/ProtocolVersionTypeSerializer.java

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,19 @@
1919

2020
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
2121
import net.lenni0451.optconfig.serializer.ConfigTypeSerializer;
22-
import net.raphimc.viaproxy.protocoltranslator.viaproxy.ViaProxyConfig;
22+
import net.lenni0451.optconfig.serializer.info.DeserializerInfo;
23+
import net.lenni0451.optconfig.serializer.info.SerializerInfo;
2324

24-
public class ProtocolVersionTypeSerializer extends ConfigTypeSerializer<ViaProxyConfig, ProtocolVersion> {
25-
26-
public ProtocolVersionTypeSerializer(final ViaProxyConfig config) {
27-
super(config);
28-
}
25+
public class ProtocolVersionTypeSerializer implements ConfigTypeSerializer<ProtocolVersion> {
2926

3027
@Override
31-
public ProtocolVersion deserialize(final Class<ProtocolVersion> typeClass, final Object serializedObject) {
32-
return ProtocolVersion.getClosest((String) serializedObject);
28+
public ProtocolVersion deserialize(final DeserializerInfo<ProtocolVersion> info) {
29+
return ProtocolVersion.getClosest((String) info.value());
3330
}
3431

3532
@Override
36-
public Object serialize(final ProtocolVersion object) {
37-
return object.getName();
33+
public Object serialize(final SerializerInfo<ProtocolVersion> info) {
34+
return info.value().getName();
3835
}
3936

4037
}

0 commit comments

Comments
 (0)