From 04b601f6116c345405f9c2ba4e59b659f3e17908 Mon Sep 17 00:00:00 2001 From: Yavanni Date: Sat, 20 Jul 2024 12:12:01 -0400 Subject: [PATCH] feat: offline user name config --- .../java/me/earth/headlessmc/api/config/Config.java | 5 +++++ .../java/me/earth/headlessmc/config/ConfigImpl.java | 5 +++++ .../headlessmc/launcher/LauncherProperties.java | 2 ++ .../headlessmc/launcher/auth/AccountManager.java | 4 +++- .../headlessmc/launcher/command/LaunchCommand.java | 1 + .../launcher/files/SystemPropertiesConfig.java | 4 ++++ .../headlessmc/launcher/launch/LaunchOptions.java | 12 +++++++----- .../headlessmc/launcher/launch/ProcessFactory.java | 12 ++++++++---- 8 files changed, 35 insertions(+), 10 deletions(-) diff --git a/headlessmc-api/src/main/java/me/earth/headlessmc/api/config/Config.java b/headlessmc-api/src/main/java/me/earth/headlessmc/api/config/Config.java index 3be1bbc9..011cc8c3 100644 --- a/headlessmc-api/src/main/java/me/earth/headlessmc/api/config/Config.java +++ b/headlessmc-api/src/main/java/me/earth/headlessmc/api/config/Config.java @@ -18,4 +18,9 @@ default T get(Property property, T defaultValue) { return getValue(property, () -> defaultValue); } + // Implement a setter function for config properties, this allows for overwriting + // the values of them from the cli which enables per invocation configuration. + T setValue(Property property, Supplier value); + + default T set(Property property, T value) { return setValue(property, () -> value); } } diff --git a/headlessmc-commons/src/main/java/me/earth/headlessmc/config/ConfigImpl.java b/headlessmc-commons/src/main/java/me/earth/headlessmc/config/ConfigImpl.java index 8da9e6c8..5523e667 100644 --- a/headlessmc-commons/src/main/java/me/earth/headlessmc/config/ConfigImpl.java +++ b/headlessmc-commons/src/main/java/me/earth/headlessmc/config/ConfigImpl.java @@ -34,4 +34,9 @@ public T getValue(Property property, Supplier defaultValue) { return result == null ? defaultValue.get() : result; } + @Override + public T setValue(Property property, Supplier value) { + return (T)properties.setProperty(property.getName(), value.get().toString()); + } + } diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/LauncherProperties.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/LauncherProperties.java index 246e709c..2e8e351c 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/LauncherProperties.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/LauncherProperties.java @@ -50,6 +50,8 @@ public interface LauncherProperties extends HmcProperties { Property FABRIC_URL = string("hmc.fabric.url"); Property OFFLINE = bool("hmc.offline"); + Property OFFLINE_USERNAME = string("hmc.offline.username"); + Property OFFLINE_UUID = string("hmc.offline.uuid"); Property RE_THROW_LAUNCH_EXCEPTIONS = bool("hmc.rethrow.launch.exceptions"); // TODO: also check hashes for the libraries? diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/auth/AccountManager.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/auth/AccountManager.java index 4c116916..d50be6f5 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/auth/AccountManager.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/auth/AccountManager.java @@ -44,7 +44,9 @@ public Account login(Config config) throws AuthException { } if (offlineChecker.isOffline()) { - return new Account("Offline", OFFLINE_UUID, "", "", "", ""); + val username = config.get(LauncherProperties.OFFLINE_USERNAME, "Offline"); + val uuid = config.get(LauncherProperties.OFFLINE_UUID, OFFLINE_UUID); + return new Account(username, uuid, "", "", "", ""); } log.warning("No valid account found!"); diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/LaunchCommand.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/LaunchCommand.java index 5b874211..b9d26c98 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/LaunchCommand.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/LaunchCommand.java @@ -39,6 +39,7 @@ public LaunchCommand(Launcher launcher) { // TODO: is this really necessary? args.put("-noout", "Doesn't print Minecrafts output to the console."); args.put("-quit", "Quit HeadlessMc after launching the game."); + args.put("-username", "Set the username in offline mode"); args.put("--jvm", "Jvm args to use."); } diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/files/SystemPropertiesConfig.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/files/SystemPropertiesConfig.java index 8cee23fe..5046db99 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/files/SystemPropertiesConfig.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/files/SystemPropertiesConfig.java @@ -16,4 +16,8 @@ public T getValue(Property property, Supplier defaultValue) { return result == null ? defaultValue.get() : result; } + @Override + public T setValue(Property property, Supplier value) { + return property.parse(System.setProperty(property.getName(), value.get().toString())); + } } diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/LaunchOptions.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/LaunchOptions.java index c9d594fc..21cfd711 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/LaunchOptions.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/LaunchOptions.java @@ -33,6 +33,7 @@ public class LaunchOptions { private final boolean noOut; private final boolean noIn; private final boolean inMemory; + private final String username; public static class LaunchOptionsBuilder { private LaunchOptionsBuilder() { @@ -40,7 +41,7 @@ private LaunchOptionsBuilder() { } public LaunchOptionsBuilder parseFlags( - Launcher ctx, boolean quit, String... args) { + Launcher ctx, boolean quit, String... args) { boolean lwjgl = flag(ctx, "-lwjgl", INVERT_LWJGL_FLAG, args); // if offline only allow launching with the lwjgl flag! if (!lwjgl && launcher.getAccountManager().getOfflineChecker().isOffline()) { @@ -57,23 +58,24 @@ public LaunchOptionsBuilder parseFlags( .paulscode(flag(ctx, "-paulscode", INVERT_PAULS_FLAG, args)) .noOut(quit || CommandUtil.hasFlag("-noout", args)) .parseJvmArgs(args) - .noIn(quit); + .noIn(quit) + .username(CommandUtil.getOption("-username", args)); } public LaunchOptionsBuilder parseJvmArgs(String... args) { String jvmArgs = CommandUtil.getOption("--jvm", args); if (jvmArgs != null) { this.additionalJvmArgs = new ArrayList<>( - Arrays.asList(CommandUtil.split(jvmArgs))); + Arrays.asList(CommandUtil.split(jvmArgs))); } return this; } private boolean flag( - HasConfig ctx, String flg, Property inv, String... args) { + HasConfig ctx, String flg, Property inv, String... args) { return CommandUtil.hasFlag(flg, args) - ^ ctx.getConfig().get(inv, false); + ^ ctx.getConfig().get(inv, false); } } diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/ProcessFactory.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/ProcessFactory.java index 9f915ec6..5dd8bbc3 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/ProcessFactory.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/ProcessFactory.java @@ -19,10 +19,7 @@ import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.zip.ZipFile; @CustomLog @@ -40,7 +37,14 @@ public Process run(LaunchOptions options) public Process run(LaunchOptions options, Instrumentation instrumentation) throws IOException, LaunchException, AuthException { + val launcher = options.getLauncher(); + + if (options.getUsername() != null) { + launcher.getConfig().set(LauncherProperties.OFFLINE_USERNAME, options.getUsername()); + launcher.getConfig().set(LauncherProperties.OFFLINE_UUID, UUID.randomUUID().toString()); + } + if (launcher.getAccountManager().getLastAccount() == null) { launcher.getAccountManager().login(launcher.getConfig()); }