From 04b601f6116c345405f9c2ba4e59b659f3e17908 Mon Sep 17 00:00:00 2001 From: Yavanni Date: Sat, 20 Jul 2024 12:12:01 -0400 Subject: [PATCH 1/2] 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()); } From c5118c76f3bd7f040210038aacf1e3fd71379616 Mon Sep 17 00:00:00 2001 From: 3arthqu4ke <56741599+3arthqu4ke@users.noreply.github.com> Date: Sat, 27 Jul 2024 11:48:46 +0200 Subject: [PATCH 2/2] [1.11] Revert setting config properties --- .../java/me/earth/headlessmc/api/config/Config.java | 5 ----- .../java/me/earth/headlessmc/config/ConfigImpl.java | 5 ----- .../headlessmc/launcher/LauncherProperties.java | 7 ++++++- .../headlessmc/launcher/auth/AccountManager.java | 10 +++++++--- .../headlessmc/launcher/command/LaunchCommand.java | 1 - .../launcher/command/forge/ForgeInstaller.java | 1 - .../launcher/files/SystemPropertiesConfig.java | 4 ---- .../headlessmc/launcher/launch/InMemoryLauncher.java | 1 - .../headlessmc/launcher/launch/LaunchOptions.java | 12 +++++------- .../headlessmc/launcher/launch/ProcessFactory.java | 12 ++++-------- 10 files changed, 22 insertions(+), 36 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 011cc8c3..3be1bbc9 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,9 +18,4 @@ 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 5523e667..8da9e6c8 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,9 +34,4 @@ 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 2e8e351c..64f0d673 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 @@ -49,10 +49,15 @@ public interface LauncherProperties extends HmcProperties { Property PROFILE_PROPERTIES = string("hmc.profileproperties"); Property FABRIC_URL = string("hmc.fabric.url"); + Property RE_THROW_LAUNCH_EXCEPTIONS = bool("hmc.rethrow.launch.exceptions"); + 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"); + Property OFFLINE_TOKEN = string("hmc.offline.token"); + Property OFFLINE_REFRESH_TOKEN = string("hmc.offline.refresh.token"); + Property OFFLINE_XUID = string("hmc.offline.xuid"); + Property OFFLINE_CLIENT_ID = string("hmc.offline.client.id"); // TODO: also check hashes for the libraries? Property ASSETS_DELAY = number("hmc.assets.delay"); 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 d50be6f5..8829c9b0 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,9 +44,13 @@ public Account login(Config config) throws AuthException { } if (offlineChecker.isOffline()) { - val username = config.get(LauncherProperties.OFFLINE_USERNAME, "Offline"); - val uuid = config.get(LauncherProperties.OFFLINE_UUID, OFFLINE_UUID); - return new Account(username, uuid, "", "", "", ""); + return new Account( + config.get(LauncherProperties.OFFLINE_USERNAME, "Offline"), + config.get(LauncherProperties.OFFLINE_UUID, OFFLINE_UUID), + config.get(LauncherProperties.OFFLINE_TOKEN, ""), + config.get(LauncherProperties.OFFLINE_REFRESH_TOKEN, ""), + config.get(LauncherProperties.OFFLINE_XUID, ""), + config.get(LauncherProperties.OFFLINE_CLIENT_ID, "")); } 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 b9d26c98..5b874211 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,7 +39,6 @@ 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/command/forge/ForgeInstaller.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/forge/ForgeInstaller.java index 20f3bfd3..9b74227e 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/forge/ForgeInstaller.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/forge/ForgeInstaller.java @@ -4,7 +4,6 @@ import lombok.RequiredArgsConstructor; import lombok.val; import lombok.var; -import me.earth.headlessmc.api.command.CommandException; import me.earth.headlessmc.launcher.Launcher; import me.earth.headlessmc.launcher.files.FileManager; import me.earth.headlessmc.launcher.instrumentation.ResourceExtractor; 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 5046db99..8cee23fe 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,8 +16,4 @@ 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/InMemoryLauncher.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/InMemoryLauncher.java index 3507b920..444a575a 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/InMemoryLauncher.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/InMemoryLauncher.java @@ -3,7 +3,6 @@ import lombok.CustomLog; import lombok.RequiredArgsConstructor; import me.earth.headlessmc.api.config.HasConfig; -import me.earth.headlessmc.launcher.Main; import me.earth.headlessmc.launcher.auth.AuthException; import me.earth.headlessmc.launcher.files.FileManager; import me.earth.headlessmc.launcher.os.OS; 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 21cfd711..c9d594fc 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,7 +33,6 @@ 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() { @@ -41,7 +40,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()) { @@ -58,24 +57,23 @@ public LaunchOptionsBuilder parseFlags( .paulscode(flag(ctx, "-paulscode", INVERT_PAULS_FLAG, args)) .noOut(quit || CommandUtil.hasFlag("-noout", args)) .parseJvmArgs(args) - .noIn(quit) - .username(CommandUtil.getOption("-username", args)); + .noIn(quit); } 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 5dd8bbc3..9f915ec6 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,7 +19,10 @@ import java.io.File; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import java.util.zip.ZipFile; @CustomLog @@ -37,14 +40,7 @@ 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()); }