From 8a1f66270de29841b3d9f33927f7c3aaa7f99bcd Mon Sep 17 00:00:00 2001 From: AiAe Date: Thu, 4 Jun 2026 23:29:53 +0300 Subject: [PATCH 01/13] QoL folder path fixes --- Configuration/Config.cs | 18 +-- Program.cs | 262 +++++++++++++++++++++++++++++++++------- 2 files changed, 230 insertions(+), 50 deletions(-) diff --git a/Configuration/Config.cs b/Configuration/Config.cs index 77b445b..83e18b0 100644 --- a/Configuration/Config.cs +++ b/Configuration/Config.cs @@ -4,6 +4,8 @@ namespace Quaver.Steam.Deploy.Configuration { public class Config { + private static string ConfigPath { get; set; } + /// /// Steam Username /// @@ -37,7 +39,7 @@ public class Config /// /// Quaver API JWT /// - public string QuaverAPIJWT { get; set; } = ""; + public string QuaverApijwt { get; set; } = ""; /// /// Whether or not the script will deploy the builds to Steam @@ -52,29 +54,29 @@ public class Config /// /// The path of the config file. /// - public static string Path => $"{Directory.GetCurrentDirectory()}/config.json"; + public static string Path => ConfigPath ?? System.IO.Path.Combine(Directory.GetCurrentDirectory(), "config.json"); /// /// Deserializes the config into an object. /// /// - public static Config Deserialize() + public static Config Deserialize(string path = null) { - const string path = "./config.json"; + ConfigPath = path ?? Path; // If the file doesn't exist, then we'll want to create the file, then throw a FileNotFoundException - if (!File.Exists(path)) + if (!File.Exists(ConfigPath)) { var config = new Config(); config.Save(); - throw new FileNotFoundException("config.json file was not found. A template has been created for you."); + throw new FileNotFoundException($"config.json file was not found at {ConfigPath}. A template has been created for you."); } Config parsedConfig; // Deserialize it if it already exists. - using (var fileStream = File.OpenRead(path)) + using (var fileStream = File.OpenRead(ConfigPath)) { parsedConfig = JsonSerializer.Deserialize(fileStream); } @@ -101,4 +103,4 @@ private void Save() } } } -} \ No newline at end of file +} diff --git a/Program.cs b/Program.cs index a58d13d..ded8fe1 100644 --- a/Program.cs +++ b/Program.cs @@ -6,6 +6,7 @@ using Quaver.Steam.Deploy.Configuration; using System.Linq; using System.Net.Http; +using System.Runtime.InteropServices; using System.Security.Cryptography; using System.Xml.Linq; @@ -13,13 +14,15 @@ namespace Quaver.Steam.Deploy { internal static class Program { - private static readonly string CurrentDirectory = Directory.GetCurrentDirectory(); + private static readonly string CurrentDirectory = AppContext.BaseDirectory; - private static string CompiledBuildPath => CurrentDirectory + "\\build"; + private static string CompiledBuildPath => Path.Combine(CurrentDirectory, "build"); - private static string SourceCodePath => CurrentDirectory + "\\quaver"; + private static string SourceCodePath => Path.Combine(CurrentDirectory, "quaver"); - private static string SteamCMDPath => CurrentDirectory + "\\steamcmd"; + private static string ClientProjectPath => Path.Combine(SourceCodePath, "Quaver", "Quaver.csproj"); + + private static string SteamCmdPath => Path.Combine(CurrentDirectory, "steamcmd"); private static string Version { get; set; } @@ -34,7 +37,7 @@ internal static class Program "win-x64", "linux-x64", "osx-x64", - "osx-arm", + "osx-arm64", }; /// @@ -42,7 +45,8 @@ internal static class Program /// static void Main(string[] args) { - Configuration = Config.Deserialize(); + Directory.SetCurrentDirectory(CurrentDirectory); + Configuration = Config.Deserialize(Path.Combine(CurrentDirectory, "config.json")); SetupSteamCMD(); CleanUp(); GameVersion(); @@ -66,8 +70,9 @@ private static void CleanUp() // Delete builds DeleteAndCreate(CompiledBuildPath); // Delete app_build.vdf - if (Directory.Exists($"{CurrentDirectory}\\Scripts\\app_build.vdf")) - Directory.Delete($"{CurrentDirectory}\\Scripts\\app_build.vdf"); + var appBuildPath = Path.Combine(CurrentDirectory, "Scripts", "app_build.vdf"); + if (File.Exists(appBuildPath)) + File.Delete(appBuildPath); } private static void DeleteAndCreate(string path) @@ -119,16 +124,30 @@ private static void BuildProject() { // Update project version // Temporary fix until we ship Monogame dll instead submodule - UpdateProjectVersion($"{SourceCodePath}\\Quaver\\Quaver.csproj", Version); + UpdateProjectVersion(ClientProjectPath, Version); foreach (var platform in Platforms) { Console.WriteLine($"Starting compiling {platform}!"); - var dir = $"{CompiledBuildPath}\\content-{platform}"; + var dir = Path.Combine(CompiledBuildPath, $"content-{platform}"); - RunCommand("dotnet", - $"publish {SourceCodePath} -f {Configuration.NetFramework} -r {platform} -c {Configuration.NetConfiguration} -o {dir} --self-contained", - false); + var succeeded = RunCommand("dotnet", new[] + { + "publish", + ClientProjectPath, + "-f", + Configuration.NetFramework, + "-r", + platform, + "-c", + Configuration.NetConfiguration, + "-o", + dir, + "--self-contained" + }, true); + + if (!succeeded) + throw new InvalidOperationException($"Failed to compile {platform}. See the dotnet publish output above."); } Console.WriteLine("Successfully finished compiling for all platforms!"); @@ -144,19 +163,19 @@ private static void ObfuscateClient() Console.WriteLine("Starting obfuscating client"); // Run .NET Reactor for win-x64 - var contentPath = $"{CompiledBuildPath}\\content-win-x64"; + var contentPath = Path.Combine(CompiledBuildPath, "content-win-x64"); var commandline = - $"-licensed -file {contentPath}\\Quaver.dll -files {contentPath}\\Quaver.Server.Client.dll -antitamp 1 -anti_debug 1 -hide_calls 1 -hide_calls_internals 1 -control_flow 1 -flow_level 9 -resourceencryption 1 -antistrong 1 -virtualization 1 -necrobit 1 -mapping_file 1"; + $"-licensed -file {Path.Combine(contentPath, "Quaver.dll")} -files {Path.Combine(contentPath, "Quaver.Server.Client.dll")} -antitamp 1 -anti_debug 1 -hide_calls 1 -hide_calls_internals 1 -control_flow 1 -flow_level 9 -resourceencryption 1 -antistrong 1 -virtualization 1 -necrobit 1 -mapping_file 1"; RunCommand(Configuration.NetReactor, commandline); - var quaverServerClient = $"{contentPath}\\Quaver.Server.Client_Secure\\Quaver.Server.Client.dll"; + var quaverServerClient = Path.Combine(contentPath, "Quaver.Server.Client_Secure", "Quaver.Server.Client.dll"); foreach (var platform in Platforms) { - var path = $"{CompiledBuildPath}\\content-{platform}"; - File.Copy(quaverServerClient, $"{path}\\Quaver.Server.Client.dll", true); + var path = Path.Combine(CompiledBuildPath, $"content-{platform}"); + File.Copy(quaverServerClient, Path.Combine(path, "Quaver.Server.Client.dll"), true); } Console.WriteLine("Finished obfuscating"); @@ -169,9 +188,9 @@ private static void HashProject() var gameBuild = new GameBuild { Name = Version, - QuaverSharedMd5 = GetHash($"{CompiledBuildPath}\\content-{platform}\\Quaver.Shared.dll"), - QuaverApiMd5 = GetHash($"{CompiledBuildPath}\\content-{platform}\\Quaver.API.dll"), - QuaverServerClientMd5 = GetHash($"{CompiledBuildPath}\\content-{platform}\\Quaver.Server.Client.dll") + QuaverSharedMd5 = GetHash(Path.Combine(CompiledBuildPath, $"content-{platform}", "Quaver.Shared.dll")), + QuaverApiMd5 = GetHash(Path.Combine(CompiledBuildPath, $"content-{platform}", "Quaver.API.dll")), + QuaverServerClientMd5 = GetHash(Path.Combine(CompiledBuildPath, $"content-{platform}", "Quaver.Server.Client.dll")) }; GameBuilds.Add(gameBuild); } @@ -189,10 +208,16 @@ private static void SubmitHashes() { Console.WriteLine("Submitting hashes"); + if(!Configuration.DeployToSteam) + { + Console.WriteLine("Deploying to Steam is disabled in the config file. Skipping..."); + return; + } + foreach (var gameBuild in GameBuilds) { Console.WriteLine(gameBuild); - gameBuild.SendBuild(Configuration.QuaverAPIJWT); + gameBuild.SendBuild(Configuration.QuaverApijwt); } } @@ -205,40 +230,71 @@ private static void Deploy() } // Create app_build.vdf - var appBuildTemplate = File.ReadAllText($"{CurrentDirectory}\\Scripts\\app_build.template.vdf"); + var scriptsPath = Path.Combine(CurrentDirectory, "Scripts"); + var appBuildPath = Path.Combine(scriptsPath, "app_build.vdf"); + var appBuildTemplate = File.ReadAllText(Path.Combine(scriptsPath, "app_build.template.vdf")); var appBuild = appBuildTemplate.Replace("{build_desc}", $"{Version}"); - File.Create($"{CurrentDirectory}\\Scripts\\app_build.vdf").Dispose(); - File.WriteAllText($"{CurrentDirectory}\\Scripts\\app_build.vdf", appBuild); + File.Create(appBuildPath).Dispose(); + File.WriteAllText(appBuildPath, appBuild); Console.Write("Enter Steam Two Factor Authentication Code: "); var code = Console.ReadLine(); // Delete the reactor folders - string contentPath = $"{CompiledBuildPath}\\content-win-x64"; + string contentPath = Path.Combine(CompiledBuildPath, "content-win-x64"); - if (Directory.Exists($"{contentPath}\\Quaver_Secure")) + if (Directory.Exists(Path.Combine(contentPath, "Quaver_Secure"))) { - Directory.Delete($"{contentPath}\\Quaver_Secure", true); + Directory.Delete(Path.Combine(contentPath, "Quaver_Secure"), true); } - if (Directory.Exists($"{contentPath}\\Quaver.Server.Client_Secure")) + if (Directory.Exists(Path.Combine(contentPath, "Quaver.Server.Client_Secure"))) { - Directory.Delete($"{contentPath}\\Quaver.Server.Client_Secure", true); + Directory.Delete(Path.Combine(contentPath, "Quaver.Server.Client_Secure"), true); } Console.WriteLine("Deploying to Steam..."); // Deploy to Steam - RunCommand(SteamCMDPath + "\\steamcmd.exe", $"+login {Configuration.SteamUsername} \"{Configuration.SteamPassword}\" {code} +run_app_build_http {CurrentDirectory}/Scripts/app_build.vdf +quit", true); + RunCommand(Path.Combine(SteamCmdPath, GetSteamCmdExecutableName()), new[] + { + "+login", + Configuration.SteamUsername, + Configuration.SteamPassword, + code, + "+run_app_build_http", + appBuildPath, + "+quit" + }, true); Console.WriteLine("Finished deploying!"); } + private static string GetSteamCmdExecutableName() + { + return RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "steamcmd.exe" : "steamcmd.sh"; + } + private static bool RunCommand(string command, string args, bool showOutput = true) { var processStartInfo = new ProcessStartInfo(command, args) { - WorkingDirectory = Environment.CurrentDirectory, + WorkingDirectory = CurrentDirectory, + CreateNoWindow = true, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + WindowStyle = ProcessWindowStyle.Hidden + }; + + return RunProcess(processStartInfo, showOutput); + } + + private static bool RunCommand(string command, IEnumerable args, bool showOutput = true) + { + var processStartInfo = new ProcessStartInfo(command) + { + WorkingDirectory = CurrentDirectory, CreateNoWindow = true, RedirectStandardOutput = true, RedirectStandardError = true, @@ -246,6 +302,14 @@ private static bool RunCommand(string command, string args, bool showOutput = tr WindowStyle = ProcessWindowStyle.Hidden }; + foreach (var arg in args) + processStartInfo.ArgumentList.Add(arg); + + return RunProcess(processStartInfo, showOutput); + } + + private static bool RunProcess(ProcessStartInfo processStartInfo, bool showOutput) + { var process = Process.Start(processStartInfo); if (process == null) @@ -269,18 +333,132 @@ private static bool RunCommand(string command, string args, bool showOutput = tr private static void RunCommandInNewTerminal(string command) { - var processStartInfo = new ProcessStartInfo + ProcessStartInfo processStartInfo; + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { - FileName = "cmd.exe", - Arguments = $"/K {command}", - UseShellExecute = true, - CreateNoWindow = false - }; + processStartInfo = new ProcessStartInfo + { + FileName = "cmd.exe", + WorkingDirectory = CurrentDirectory, + UseShellExecute = true, + CreateNoWindow = false + }; + processStartInfo.ArgumentList.Add("/K"); + processStartInfo.ArgumentList.Add(command); + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + processStartInfo = new ProcessStartInfo + { + FileName = "osascript", + WorkingDirectory = CurrentDirectory, + UseShellExecute = false, + CreateNoWindow = false + }; + processStartInfo.ArgumentList.Add("-e"); + processStartInfo.ArgumentList.Add($"tell application \"Terminal\" to do script \"{EscapeAppleScriptString(GetUnixTerminalCommand(command))}\""); + } + else + { + processStartInfo = CreateLinuxTerminalStartInfo(command); + } using var process = new Process(); process.StartInfo = processStartInfo; process.Start(); } + + private static ProcessStartInfo CreateLinuxTerminalStartInfo(string command) + { + string[] terminalCommands = + { + "x-terminal-emulator", + "gnome-terminal", + "konsole", + "xfce4-terminal", + "xterm" + }; + + foreach (var terminalCommand in terminalCommands) + { + if (!CommandExists(terminalCommand)) + continue; + + var processStartInfo = new ProcessStartInfo + { + FileName = terminalCommand, + WorkingDirectory = CurrentDirectory, + UseShellExecute = false, + CreateNoWindow = false + }; + + var terminalCommandLine = $"{GetUnixTerminalCommand(command)}; exec bash"; + + switch (terminalCommand) + { + case "gnome-terminal": + processStartInfo.ArgumentList.Add("--"); + processStartInfo.ArgumentList.Add("bash"); + processStartInfo.ArgumentList.Add("-lc"); + processStartInfo.ArgumentList.Add(terminalCommandLine); + break; + case "konsole": + case "xfce4-terminal": + processStartInfo.ArgumentList.Add("-e"); + processStartInfo.ArgumentList.Add("bash"); + processStartInfo.ArgumentList.Add("-lc"); + processStartInfo.ArgumentList.Add(terminalCommandLine); + break; + case "xterm": + case "x-terminal-emulator": + processStartInfo.ArgumentList.Add("-e"); + processStartInfo.ArgumentList.Add("bash"); + processStartInfo.ArgumentList.Add("-lc"); + processStartInfo.ArgumentList.Add(terminalCommandLine); + break; + } + + return processStartInfo; + } + + throw new PlatformNotSupportedException("Could not find a supported terminal emulator. Install x-terminal-emulator, gnome-terminal, konsole, xfce4-terminal, or xterm."); + } + + private static bool CommandExists(string command) + { + var processStartInfo = new ProcessStartInfo + { + FileName = "which", + UseShellExecute = false, + CreateNoWindow = true, + RedirectStandardOutput = true, + RedirectStandardError = true + }; + processStartInfo.ArgumentList.Add(command); + + using var process = Process.Start(processStartInfo); + if (process == null) + return false; + + process.WaitForExit(); + return process.ExitCode == 0; + } + + private static string EscapeAppleScriptString(string value) + { + return value.Replace("\\", "\\\\").Replace("\"", "\\\""); + } + + private static string GetUnixTerminalCommand(string command) + { + return $"cd {QuoteUnixShellArgument(CurrentDirectory)}; {command}"; + } + + private static string QuoteUnixShellArgument(string value) + { + return $"'{value.Replace("'", "'\\''")}'"; + } private static void UpdateProjectVersion(string projectFilePath, string newVersion) { @@ -328,14 +506,14 @@ private static void SetupSteamCMD() var steamCMDUrl = "https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip"; var steamCMDName = "steamcmd.zip"; - if (!Directory.Exists(SteamCMDPath)) + if (!Directory.Exists(SteamCmdPath)) { Console.WriteLine("Downloading SteamCMD..."); DownloadFile(steamCMDUrl, steamCMDName); - ZipFile.ExtractToDirectory($"./{steamCMDName}", SteamCMDPath); + ZipFile.ExtractToDirectory($"./{steamCMDName}", SteamCmdPath); Console.WriteLine("Installing SteamCMD..."); - RunCommand($"{SteamCMDPath}\\steamcmd.exe", $"+quit", false); + RunCommand(Path.Combine(SteamCmdPath, GetSteamCmdExecutableName()), "+quit", false); } if (File.Exists($"./{steamCMDName}")) @@ -355,4 +533,4 @@ static void DownloadFile(string url, string fileName) stream.CopyTo(fileStream); } } -} \ No newline at end of file +} From 7ad57d09d328043b6e9e97749d0f1773dcd167af Mon Sep 17 00:00:00 2001 From: AiAe Date: Fri, 5 Jun 2026 22:05:56 +0300 Subject: [PATCH 02/13] Test 1 --- Configuration/Config.cs | 5 + MacAppPackager.cs | 281 ++++++++++++++++++++++++++++ Program.cs | 19 +- Scripts/app_build_macos_private.vdf | 13 ++ Scripts/depot_build_980612.vdf | 2 +- 5 files changed, 310 insertions(+), 10 deletions(-) create mode 100644 MacAppPackager.cs create mode 100644 Scripts/app_build_macos_private.vdf diff --git a/Configuration/Config.cs b/Configuration/Config.cs index 83e18b0..8da8260 100644 --- a/Configuration/Config.cs +++ b/Configuration/Config.cs @@ -50,6 +50,11 @@ public class Config /// Run .NET Reactor /// public bool RunReactor { get; set; } + + /// + /// Optional path to a macOS app icon file (.icns, .png, or .ico). + /// + public string MacAppIconPath { get; set; } = ""; /// /// The path of the config file. diff --git a/MacAppPackager.cs b/MacAppPackager.cs new file mode 100644 index 0000000..192a9ba --- /dev/null +++ b/MacAppPackager.cs @@ -0,0 +1,281 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Xml.Linq; +using Quaver.Steam.Deploy.Configuration; + +namespace Quaver.Steam.Deploy; + +internal static class MacAppPackager +{ + private const string AppName = "Quaver.app"; + + private const string BundleIdentifier = "com.quavergame.Quaver"; + + internal static void Package(string currentDirectory, string compiledBuildPath, string sourceCodePath, string version, Config configuration) + { + Console.WriteLine("Creating macOS app bundle..."); + + var macAppBuildPath = Path.Combine(compiledBuildPath, "content-osx"); + DeleteAndCreate(macAppBuildPath); + + var appPath = Path.Combine(macAppBuildPath, AppName); + var contentsPath = Path.Combine(appPath, "Contents"); + var macOsPath = Path.Combine(contentsPath, "MacOS"); + var resourcesPath = Path.Combine(contentsPath, "Resources"); + var x64PayloadPath = Path.Combine(resourcesPath, "osx-x64"); + var arm64PayloadPath = Path.Combine(resourcesPath, "osx-arm64"); + + Directory.CreateDirectory(macOsPath); + Directory.CreateDirectory(resourcesPath); + + CopyDirectory(Path.Combine(compiledBuildPath, "content-osx-x64"), x64PayloadPath); + CopyDirectory(Path.Combine(compiledBuildPath, "content-osx-arm64"), arm64PayloadPath); + + var iconFileName = CopyAppIcon(resourcesPath, currentDirectory, sourceCodePath, configuration); + + var launcherPath = Path.Combine(macOsPath, "Quaver"); + File.WriteAllText(launcherPath, CreateLauncherScript()); + + var compatibilityLauncherPath = Path.Combine(macAppBuildPath, "Quaver"); + File.WriteAllText(compatibilityLauncherPath, CreateCompatibilityLauncherScript()); + + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + RunCommand("chmod", new[] { "+x", launcherPath }, currentDirectory); + RunCommand("chmod", new[] { "+x", compatibilityLauncherPath }, currentDirectory); + } + + File.WriteAllText(Path.Combine(contentsPath, "Info.plist"), CreateInfoPlist(version, iconFileName)); + + Console.WriteLine($"Created macOS app bundle at {appPath}"); + } + + private static string CreateLauncherScript() + { + return """ + #!/bin/sh + set -e + + SCRIPT_DIR="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)" + CONTENTS_DIR="$(dirname "$SCRIPT_DIR")" + APP_DIR="$(dirname "$CONTENTS_DIR")" + INSTALL_DIR="$(dirname "$APP_DIR")" + + cd "$INSTALL_DIR" + export QUAVER_INSTALL_DIR="$INSTALL_DIR" + + if [ "$(sysctl -n hw.optional.arm64 2>/dev/null || echo 0)" = "1" ]; then + PAYLOAD_DIR="$CONTENTS_DIR/Resources/osx-arm64" + else + PAYLOAD_DIR="$CONTENTS_DIR/Resources/osx-x64" + fi + + exec "$PAYLOAD_DIR/Quaver" "$@" + """; + } + + private static string CreateCompatibilityLauncherScript() + { + return """ + #!/bin/sh + set -e + + INSTALL_DIR="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)" + cd "$INSTALL_DIR" + export QUAVER_INSTALL_DIR="$INSTALL_DIR" + + exec "$INSTALL_DIR/Quaver.app/Contents/MacOS/Quaver" "$@" + """; + } + + private static string CreateInfoPlist(string version, string iconFileName) + { + var plist = new XDocument( + new XDeclaration("1.0", "UTF-8", null), + new XDocumentType("plist", "-//Apple//DTD PLIST 1.0//EN", "http://www.apple.com/DTDs/PropertyList-1.0.dtd", null), + new XElement("plist", + new XAttribute("version", "1.0"), + new XElement("dict", + PlistKeyValue("CFBundleDevelopmentRegion", "en"), + PlistKeyValue("CFBundleDisplayName", "Quaver"), + PlistKeyValue("CFBundleExecutable", "Quaver"), + PlistKeyValue("CFBundleIdentifier", BundleIdentifier), + PlistKeyValue("CFBundleName", "Quaver"), + PlistKeyValue("CFBundlePackageType", "APPL"), + PlistKeyValue("CFBundleShortVersionString", version), + PlistKeyValue("CFBundleVersion", version), + PlistKeyValue("LSMinimumSystemVersion", "10.15"), + PlistKeyValue("NSHighResolutionCapable", true), + CreateUrlTypes(), + CreateDocumentTypes() + ) + ) + ); + + if (!string.IsNullOrEmpty(iconFileName)) + plist.Root?.Element("dict")?.AddFirst(PlistKeyValue("CFBundleIconFile", iconFileName)); + + return plist.ToString(); + } + + private static object[] PlistKeyValue(string key, string value) + { + return new object[] { new XElement("key", key), new XElement("string", value) }; + } + + private static object[] PlistKeyValue(string key, bool value) + { + return new object[] { new XElement("key", key), new XElement(value ? "true" : "false") }; + } + + private static object[] CreateDocumentTypes() + { + return new object[] + { + new XElement("key", "CFBundleDocumentTypes"), + new XElement("array", + CreateDocumentType("Quaver Package", "qp", "com.quavergame.package"), + CreateDocumentType("Quaver Skin", "qs", "com.quavergame.skin")) + }; + } + + private static object[] CreateUrlTypes() + { + return new object[] + { + new XElement("key", "CFBundleURLTypes"), + new XElement("array", + new XElement("dict", + PlistKeyValue("CFBundleURLName", "Quaver URL"), + new XElement("key", "CFBundleURLSchemes"), + new XElement("array", new XElement("string", "quaver")))) + }; + } + + private static XElement CreateDocumentType(string name, string extension, string uti) + { + return new XElement("dict", + PlistKeyValue("CFBundleTypeName", name), + new XElement("key", "CFBundleTypeExtensions"), + new XElement("array", new XElement("string", extension)), + PlistKeyValue("CFBundleTypeRole", "Viewer"), + new XElement("key", "LSItemContentTypes"), + new XElement("array", new XElement("string", uti))); + } + + private static string CopyAppIcon(string resourcesPath, string currentDirectory, string sourceCodePath, Config configuration) + { + var iconPath = ResolveAppIconPath(currentDirectory, sourceCodePath, configuration); + + if (string.IsNullOrEmpty(iconPath)) + { + Console.WriteLine("No macOS app icon was found. Set MacAppIconPath in config.json to include one."); + return ""; + } + + var extension = Path.GetExtension(iconPath).ToLowerInvariant(); + var iconFileName = extension == ".icns" ? "Quaver.icns" : $"QuaverIcon{extension}"; + File.Copy(iconPath, Path.Combine(resourcesPath, iconFileName), true); + + return iconFileName; + } + + private static string ResolveAppIconPath(string currentDirectory, string sourceCodePath, Config configuration) + { + if (!string.IsNullOrWhiteSpace(configuration.MacAppIconPath)) + { + var configuredPath = Path.IsPathRooted(configuration.MacAppIconPath) + ? configuration.MacAppIconPath + : Path.Combine(currentDirectory, configuration.MacAppIconPath); + + if (File.Exists(configuredPath)) + return configuredPath; + + Console.WriteLine($"Configured macOS app icon was not found: {configuredPath}"); + } + + var searchRoots = new[] + { + sourceCodePath, + Path.Combine(sourceCodePath, "Quaver"), + Path.Combine(sourceCodePath, "Quaver", "Assets"), + Path.Combine(sourceCodePath, "Quaver", "Resources") + }; + + var extensions = new[] { ".icns", ".png", ".ico" }; + + foreach (var root in searchRoots.Where(Directory.Exists)) + { + var icon = Directory.EnumerateFiles(root, "*", SearchOption.AllDirectories) + .Where(path => extensions.Contains(Path.GetExtension(path).ToLowerInvariant())) + .OrderByDescending(path => Path.GetExtension(path).Equals(".icns", StringComparison.OrdinalIgnoreCase)) + .ThenBy(path => Path.GetFileName(path).Contains("icon", StringComparison.OrdinalIgnoreCase) ? 0 : 1) + .FirstOrDefault(); + + if (icon != null) + return icon; + } + + return ""; + } + + private static void CopyDirectory(string sourceDirectory, string destinationDirectory) + { + if (!Directory.Exists(sourceDirectory)) + throw new DirectoryNotFoundException($"Could not find directory to copy: {sourceDirectory}"); + + Directory.CreateDirectory(destinationDirectory); + + foreach (var directory in Directory.GetDirectories(sourceDirectory, "*", SearchOption.AllDirectories)) + { + var relativePath = Path.GetRelativePath(sourceDirectory, directory); + Directory.CreateDirectory(Path.Combine(destinationDirectory, relativePath)); + } + + foreach (var file in Directory.GetFiles(sourceDirectory, "*", SearchOption.AllDirectories)) + { + var relativePath = Path.GetRelativePath(sourceDirectory, file); + File.Copy(file, Path.Combine(destinationDirectory, relativePath), true); + } + } + + private static void DeleteAndCreate(string path) + { + if (Directory.Exists(path)) + Directory.Delete(path, true); + + Directory.CreateDirectory(path); + } + + private static void RunCommand(string command, string[] args, string workingDirectory) + { + var processStartInfo = new ProcessStartInfo(command) + { + WorkingDirectory = workingDirectory, + CreateNoWindow = true, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + WindowStyle = ProcessWindowStyle.Hidden + }; + + foreach (var arg in args) + processStartInfo.ArgumentList.Add(arg); + + using var process = Process.Start(processStartInfo); + + if (process == null) + throw new InvalidOperationException($"Failed to start command: {command}"); + + var output = process.StandardOutput.ReadToEnd(); + output += process.StandardError.ReadToEnd(); + + process.WaitForExit(); + + if (process.ExitCode != 0) + throw new InvalidOperationException($"{command} failed with exit code {process.ExitCode}: {output}"); + } +} diff --git a/Program.cs b/Program.cs index ded8fe1..ee3d94f 100644 --- a/Program.cs +++ b/Program.cs @@ -47,16 +47,17 @@ static void Main(string[] args) { Directory.SetCurrentDirectory(CurrentDirectory); Configuration = Config.Deserialize(Path.Combine(CurrentDirectory, "config.json")); - SetupSteamCMD(); - CleanUp(); - GameVersion(); - Branch(); - CloneProject(); + //SetupSteamCMD(); + //CleanUp(); + //GameVersion(); + //Branch(); + //CloneProject(); BuildProject(); - ObfuscateClient(); - HashProject(); - SubmitHashes(); - Deploy(); + //ObfuscateClient(); + MacAppPackager.Package(CurrentDirectory, CompiledBuildPath, SourceCodePath, Version, Configuration); + //HashProject(); + //SubmitHashes(); + //Deploy(); // Avoid closing console Console.WriteLine("Press any key to close"); diff --git a/Scripts/app_build_macos_private.vdf b/Scripts/app_build_macos_private.vdf new file mode 100644 index 0000000..97d7d79 --- /dev/null +++ b/Scripts/app_build_macos_private.vdf @@ -0,0 +1,13 @@ +"AppBuild" +{ + "AppID" "980610" + "Desc" "macOS app test" + "BuildOutput" "./build_output" + "ContentRoot" "./" + "Preview" "0" + "SetLive" "macos-private" + "Depots" + { + "980612" "./depot_build_980612.vdf" + } +} diff --git a/Scripts/depot_build_980612.vdf b/Scripts/depot_build_980612.vdf index 950140b..d9b7023 100644 --- a/Scripts/depot_build_980612.vdf +++ b/Scripts/depot_build_980612.vdf @@ -1,7 +1,7 @@ "DepotBuildConfig" { "DepotID" "980612" - "ContentRoot" "..\\build\\content-osx-x64" + "ContentRoot" "..\\build\\content-osx" "FileMapping" { "LocalPath" "*" From 650003b26f5305882b77a7a8a9512b8321a5fbac Mon Sep 17 00:00:00 2001 From: AiAe Date: Fri, 5 Jun 2026 22:49:38 +0300 Subject: [PATCH 03/13] Test 2 working? --- MacAppPackager.cs | 137 ++++++++++++++++++++++++++++++++++++++-------- Program.cs | 4 +- 2 files changed, 117 insertions(+), 24 deletions(-) diff --git a/MacAppPackager.cs b/MacAppPackager.cs index 192a9ba..4e232c5 100644 --- a/MacAppPackager.cs +++ b/MacAppPackager.cs @@ -16,41 +16,44 @@ internal static class MacAppPackager internal static void Package(string currentDirectory, string compiledBuildPath, string sourceCodePath, string version, Config configuration) { - Console.WriteLine("Creating macOS app bundle..."); + Console.WriteLine("Creating universal macOS build..."); + + if (!RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + throw new PlatformNotSupportedException("Universal macOS packaging requires lipo and must be run on macOS."); var macAppBuildPath = Path.Combine(compiledBuildPath, "content-osx"); DeleteAndCreate(macAppBuildPath); + var x64BuildPath = Path.Combine(compiledBuildPath, "content-osx-x64"); + var arm64BuildPath = Path.Combine(compiledBuildPath, "content-osx-arm64"); + + CopyDirectory(arm64BuildPath, macAppBuildPath); + CreateUniversalMachOBinaries(x64BuildPath, arm64BuildPath, macAppBuildPath, currentDirectory); + + var executablePath = Path.Combine(macAppBuildPath, "Quaver"); + var executableBinaryPath = Path.Combine(macAppBuildPath, "Quaver.bin"); + File.Move(executablePath, executableBinaryPath, true); + File.WriteAllText(executablePath, CreateRootLauncherScript()); + var appPath = Path.Combine(macAppBuildPath, AppName); var contentsPath = Path.Combine(appPath, "Contents"); var macOsPath = Path.Combine(contentsPath, "MacOS"); var resourcesPath = Path.Combine(contentsPath, "Resources"); - var x64PayloadPath = Path.Combine(resourcesPath, "osx-x64"); - var arm64PayloadPath = Path.Combine(resourcesPath, "osx-arm64"); Directory.CreateDirectory(macOsPath); Directory.CreateDirectory(resourcesPath); - CopyDirectory(Path.Combine(compiledBuildPath, "content-osx-x64"), x64PayloadPath); - CopyDirectory(Path.Combine(compiledBuildPath, "content-osx-arm64"), arm64PayloadPath); - var iconFileName = CopyAppIcon(resourcesPath, currentDirectory, sourceCodePath, configuration); var launcherPath = Path.Combine(macOsPath, "Quaver"); File.WriteAllText(launcherPath, CreateLauncherScript()); - - var compatibilityLauncherPath = Path.Combine(macAppBuildPath, "Quaver"); - File.WriteAllText(compatibilityLauncherPath, CreateCompatibilityLauncherScript()); - - if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - RunCommand("chmod", new[] { "+x", launcherPath }, currentDirectory); - RunCommand("chmod", new[] { "+x", compatibilityLauncherPath }, currentDirectory); - } + RunCommand("chmod", new[] { "+x", launcherPath }, currentDirectory); + RunCommand("chmod", new[] { "+x", executablePath }, currentDirectory); + RunCommand("chmod", new[] { "+x", executableBinaryPath }, currentDirectory); File.WriteAllText(Path.Combine(contentsPath, "Info.plist"), CreateInfoPlist(version, iconFileName)); - Console.WriteLine($"Created macOS app bundle at {appPath}"); + Console.WriteLine($"Created universal macOS build at {macAppBuildPath}"); } private static string CreateLauncherScript() @@ -68,16 +71,14 @@ private static string CreateLauncherScript() export QUAVER_INSTALL_DIR="$INSTALL_DIR" if [ "$(sysctl -n hw.optional.arm64 2>/dev/null || echo 0)" = "1" ]; then - PAYLOAD_DIR="$CONTENTS_DIR/Resources/osx-arm64" - else - PAYLOAD_DIR="$CONTENTS_DIR/Resources/osx-x64" + exec /usr/bin/arch -arm64 "$INSTALL_DIR/Quaver.bin" "$@" fi - exec "$PAYLOAD_DIR/Quaver" "$@" + exec "$INSTALL_DIR/Quaver.bin" "$@" """; } - private static string CreateCompatibilityLauncherScript() + private static string CreateRootLauncherScript() { return """ #!/bin/sh @@ -87,7 +88,11 @@ private static string CreateCompatibilityLauncherScript() cd "$INSTALL_DIR" export QUAVER_INSTALL_DIR="$INSTALL_DIR" - exec "$INSTALL_DIR/Quaver.app/Contents/MacOS/Quaver" "$@" + if [ "$(sysctl -n hw.optional.arm64 2>/dev/null || echo 0)" = "1" ]; then + exec /usr/bin/arch -arm64 "$INSTALL_DIR/Quaver.bin" "$@" + fi + + exec "$INSTALL_DIR/Quaver.bin" "$@" """; } @@ -242,6 +247,63 @@ private static void CopyDirectory(string sourceDirectory, string destinationDire } } + private static void CreateUniversalMachOBinaries(string x64BuildPath, string arm64BuildPath, string outputBuildPath, string currentDirectory) + { + foreach (var x64File in Directory.GetFiles(x64BuildPath, "*", SearchOption.AllDirectories)) + { + var relativePath = Path.GetRelativePath(x64BuildPath, x64File); + var arm64File = Path.Combine(arm64BuildPath, relativePath); + var outputFile = Path.Combine(outputBuildPath, relativePath); + + if (!File.Exists(arm64File) || !IsMachO(x64File, currentDirectory) || !IsMachO(arm64File, currentDirectory)) + continue; + + var x64Architectures = GetArchitectures(x64File, currentDirectory); + var arm64Architectures = GetArchitectures(arm64File, currentDirectory); + + if (x64Architectures.SequenceEqual(arm64Architectures)) + { + Console.WriteLine($"Skipping universal merge for {relativePath}; both files contain {string.Join(" ", x64Architectures)}."); + WarnIfNotUniversal(relativePath, x64Architectures); + continue; + } + + if (x64Architectures.Intersect(arm64Architectures).Any()) + { + if (relativePath.Equals("Quaver", StringComparison.Ordinal)) + throw new InvalidOperationException($"Cannot create universal Quaver executable because both publishes contain overlapping architectures. x64: {string.Join(" ", x64Architectures)}, arm64: {string.Join(" ", arm64Architectures)}"); + + Console.WriteLine($"Skipping universal merge for {relativePath}; architectures overlap. x64: {string.Join(" ", x64Architectures)}, arm64: {string.Join(" ", arm64Architectures)}."); + WarnIfNotUniversal(relativePath, x64Architectures.Union(arm64Architectures).OrderBy(architecture => architecture, StringComparer.Ordinal).ToArray()); + continue; + } + + Console.WriteLine($"Creating universal binary: {relativePath}"); + RunCommand("lipo", new[] { "-create", x64File, arm64File, "-output", outputFile }, currentDirectory); + } + } + + private static bool IsMachO(string path, string currentDirectory) + { + var output = RunCommandWithOutput("file", new[] { path }, currentDirectory); + return output.Contains("Mach-O", StringComparison.Ordinal); + } + + private static void WarnIfNotUniversal(string relativePath, string[] architectures) + { + if (!architectures.Contains("arm64") || !architectures.Contains("x86_64")) + Console.WriteLine($"Warning: {relativePath} is not universal after packaging. Architectures: {string.Join(" ", architectures)}."); + } + + private static string[] GetArchitectures(string path, string currentDirectory) + { + var output = RunCommandWithOutput("lipo", new[] { "-archs", path }, currentDirectory); + return output + .Split((char[])null, StringSplitOptions.RemoveEmptyEntries) + .OrderBy(architecture => architecture, StringComparer.Ordinal) + .ToArray(); + } + private static void DeleteAndCreate(string path) { if (Directory.Exists(path)) @@ -278,4 +340,35 @@ private static void RunCommand(string command, string[] args, string workingDire if (process.ExitCode != 0) throw new InvalidOperationException($"{command} failed with exit code {process.ExitCode}: {output}"); } + + private static string RunCommandWithOutput(string command, string[] args, string workingDirectory) + { + var processStartInfo = new ProcessStartInfo(command) + { + WorkingDirectory = workingDirectory, + CreateNoWindow = true, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + WindowStyle = ProcessWindowStyle.Hidden + }; + + foreach (var arg in args) + processStartInfo.ArgumentList.Add(arg); + + using var process = Process.Start(processStartInfo); + + if (process == null) + throw new InvalidOperationException($"Failed to start command: {command}"); + + var output = process.StandardOutput.ReadToEnd(); + output += process.StandardError.ReadToEnd(); + + process.WaitForExit(); + + if (process.ExitCode != 0) + throw new InvalidOperationException($"{command} failed with exit code {process.ExitCode}: {output}"); + + return output; + } } diff --git a/Program.cs b/Program.cs index ee3d94f..bd4b6d6 100644 --- a/Program.cs +++ b/Program.cs @@ -34,8 +34,8 @@ internal static class Program private static string[] Platforms { get; } = { - "win-x64", - "linux-x64", + // "win-x64", + // "linux-x64", "osx-x64", "osx-arm64", }; From 8b284426a7dddffbb574d1166313beb80ca77e25 Mon Sep 17 00:00:00 2001 From: AiAe Date: Fri, 5 Jun 2026 23:08:01 +0300 Subject: [PATCH 04/13] Implement properly parsing of quaver:// URLs for macOS --- MacAppPackager.cs | 116 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 99 insertions(+), 17 deletions(-) diff --git a/MacAppPackager.cs b/MacAppPackager.cs index 4e232c5..f75ea8d 100644 --- a/MacAppPackager.cs +++ b/MacAppPackager.cs @@ -46,7 +46,7 @@ internal static void Package(string currentDirectory, string compiledBuildPath, var iconFileName = CopyAppIcon(resourcesPath, currentDirectory, sourceCodePath, configuration); var launcherPath = Path.Combine(macOsPath, "Quaver"); - File.WriteAllText(launcherPath, CreateLauncherScript()); + CreateAppLauncher(launcherPath, macOsPath, currentDirectory); RunCommand("chmod", new[] { "+x", launcherPath }, currentDirectory); RunCommand("chmod", new[] { "+x", executablePath }, currentDirectory); RunCommand("chmod", new[] { "+x", executableBinaryPath }, currentDirectory); @@ -56,25 +56,106 @@ internal static void Package(string currentDirectory, string compiledBuildPath, Console.WriteLine($"Created universal macOS build at {macAppBuildPath}"); } - private static string CreateLauncherScript() + private static void CreateAppLauncher(string launcherPath, string buildDirectory, string currentDirectory) { - return """ - #!/bin/sh - set -e - - SCRIPT_DIR="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)" - CONTENTS_DIR="$(dirname "$SCRIPT_DIR")" - APP_DIR="$(dirname "$CONTENTS_DIR")" - INSTALL_DIR="$(dirname "$APP_DIR")" + var sourcePath = Path.Combine(buildDirectory, "QuaverLauncher.m"); + File.WriteAllText(sourcePath, CreateAppLauncherSource()); - cd "$INSTALL_DIR" - export QUAVER_INSTALL_DIR="$INSTALL_DIR" - - if [ "$(sysctl -n hw.optional.arm64 2>/dev/null || echo 0)" = "1" ]; then - exec /usr/bin/arch -arm64 "$INSTALL_DIR/Quaver.bin" "$@" - fi + RunCommand("xcrun", new[] + { + "clang", + "-fobjc-arc", + "-framework", + "Cocoa", + "-mmacosx-version-min=10.15", + "-arch", + "x86_64", + "-arch", + "arm64", + sourcePath, + "-o", + launcherPath + }, currentDirectory); + + File.Delete(sourcePath); + } - exec "$INSTALL_DIR/Quaver.bin" "$@" + private static string CreateAppLauncherSource() + { + return """ + #import + + @interface QuaverAppDelegate : NSObject + @property(nonatomic) BOOL launchedGame; + @end + + @implementation QuaverAppDelegate + + - (NSString *)installDirectory { + NSURL *bundleURL = [[NSBundle mainBundle] bundleURL]; + return [[[bundleURL URLByDeletingLastPathComponent] path] stringByStandardizingPath]; + } + + - (void)launchQuaverWithArguments:(NSArray *)arguments { + NSString *installDirectory = [self installDirectory]; + NSString *binaryPath = [installDirectory stringByAppendingPathComponent:@"Quaver.bin"]; + + NSTask *task = [[NSTask alloc] init]; + task.executableURL = [NSURL fileURLWithPath:binaryPath]; + task.currentDirectoryURL = [NSURL fileURLWithPath:installDirectory isDirectory:YES]; + task.arguments = arguments ?: @[]; + + NSMutableDictionary *environment = [[[NSProcessInfo processInfo] environment] mutableCopy]; + environment[@"QUAVER_INSTALL_DIR"] = installDirectory; + task.environment = environment; + + NSError *error = nil; + if (![task launchAndReturnError:&error]) { + NSLog(@"Failed to launch Quaver.bin: %@", error); + } + + self.launchedGame = YES; + } + + - (void)applicationDidFinishLaunching:(NSNotification *)notification { + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + if (!self.launchedGame) { + [self launchQuaverWithArguments:@[]]; + } + + [NSApp terminate:nil]; + }); + } + + - (void)application:(NSApplication *)application openURLs:(NSArray *)urls { + NSMutableArray *arguments = [NSMutableArray arrayWithCapacity:urls.count]; + + for (NSURL *url in urls) { + [arguments addObject:url.absoluteString]; + } + + [self launchQuaverWithArguments:arguments]; + [NSApp terminate:nil]; + } + + - (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename { + [self launchQuaverWithArguments:@[filename]]; + [NSApp terminate:nil]; + return YES; + } + + @end + + int main(int argc, const char * argv[]) { + @autoreleasepool { + NSApplication *application = [NSApplication sharedApplication]; + QuaverAppDelegate *delegate = [[QuaverAppDelegate alloc] init]; + application.delegate = delegate; + [application run]; + } + + return 0; + } """; } @@ -155,6 +236,7 @@ private static object[] CreateUrlTypes() new XElement("array", new XElement("dict", PlistKeyValue("CFBundleURLName", "Quaver URL"), + PlistKeyValue("CFBundleURLRole", "Viewer"), new XElement("key", "CFBundleURLSchemes"), new XElement("array", new XElement("string", "quaver")))) }; From dcf4cbc0ea0cffbe0786177e01b38a97ef6cdd59 Mon Sep 17 00:00:00 2001 From: AiAe Date: Sat, 6 Jun 2026 00:13:49 +0300 Subject: [PATCH 05/13] WIP --- Program.cs | 81 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 61 insertions(+), 20 deletions(-) diff --git a/Program.cs b/Program.cs index bd4b6d6..45daff3 100644 --- a/Program.cs +++ b/Program.cs @@ -3,6 +3,7 @@ using System.Diagnostics; using System.IO; using System.IO.Compression; +using System.Formats.Tar; using Quaver.Steam.Deploy.Configuration; using System.Linq; using System.Net.Http; @@ -34,8 +35,8 @@ internal static class Program private static string[] Platforms { get; } = { - // "win-x64", - // "linux-x64", + "win-x64", + "linux-x64", "osx-x64", "osx-arm64", }; @@ -47,17 +48,17 @@ static void Main(string[] args) { Directory.SetCurrentDirectory(CurrentDirectory); Configuration = Config.Deserialize(Path.Combine(CurrentDirectory, "config.json")); - //SetupSteamCMD(); + SetupSteamCMD(); //CleanUp(); - //GameVersion(); - //Branch(); + GameVersion(); + Branch(); //CloneProject(); BuildProject(); //ObfuscateClient(); MacAppPackager.Package(CurrentDirectory, CompiledBuildPath, SourceCodePath, Version, Configuration); //HashProject(); //SubmitHashes(); - //Deploy(); + Deploy(); // Avoid closing console Console.WriteLine("Press any key to close"); @@ -66,7 +67,7 @@ static void Main(string[] args) private static void CleanUp() { - // Delete cloned project + // Delete source code DeleteAndCreate(SourceCodePath); // Delete builds DeleteAndCreate(CompiledBuildPath); @@ -80,7 +81,7 @@ private static void DeleteAndCreate(string path) { if (Directory.Exists(path)) { - // This resolves not allowing us to delete git folder + // This resolves not allowing us to delete git var directory = new DirectoryInfo(path) { Attributes = FileAttributes.Normal }; foreach (var info in directory.GetFileSystemInfos("*", SearchOption.AllDirectories)) @@ -124,7 +125,7 @@ private static void CloneProject() private static void BuildProject() { // Update project version - // Temporary fix until we ship Monogame dll instead submodule + // Temporary fix until we ship Monogame dll instead of submodule UpdateProjectVersion(ClientProjectPath, Version); foreach (var platform in Platforms) @@ -276,6 +277,20 @@ private static string GetSteamCmdExecutableName() return RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "steamcmd.exe" : "steamcmd.sh"; } + private static (string Url, string ArchiveName, bool IsZip) GetSteamCmdPackage() + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + return ("https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip", "steamcmd.zip", true); + + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + return ("https://steamcdn-a.akamaihd.net/client/installer/steamcmd_osx.tar.gz", "steamcmd_osx.tar.gz", false); + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + return ("https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz", "steamcmd_linux.tar.gz", false); + + throw new PlatformNotSupportedException("SteamCMD is only supported on Windows, macOS, and Linux."); + } + private static bool RunCommand(string command, string args, bool showOutput = true) { var processStartInfo = new ProcessStartInfo(command, args) @@ -504,33 +519,59 @@ private static void UpdateProjectVersion(string projectFilePath, string newVersi private static void SetupSteamCMD() { - var steamCMDUrl = "https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip"; - var steamCMDName = "steamcmd.zip"; + var steamCmdPackage = GetSteamCmdPackage(); + var steamCmdArchivePath = Path.Combine(CurrentDirectory, steamCmdPackage.ArchiveName); + var steamCmdExecutable = Path.Combine(SteamCmdPath, GetSteamCmdExecutableName()); - if (!Directory.Exists(SteamCmdPath)) + if (!File.Exists(steamCmdExecutable)) { Console.WriteLine("Downloading SteamCMD..."); - DownloadFile(steamCMDUrl, steamCMDName); - ZipFile.ExtractToDirectory($"./{steamCMDName}", SteamCmdPath); - + DownloadFile(steamCmdPackage.Url, steamCmdArchivePath); + Directory.CreateDirectory(SteamCmdPath); + + if (steamCmdPackage.IsZip) + ZipFile.ExtractToDirectory(steamCmdArchivePath, SteamCmdPath, true); + else + ExtractTarGzToDirectory(steamCmdArchivePath, SteamCmdPath); + + EnsureSteamCmdIsExecutable(steamCmdExecutable); + Console.WriteLine("Installing SteamCMD..."); - RunCommand(Path.Combine(SteamCmdPath, GetSteamCmdExecutableName()), "+quit", false); + RunCommand(steamCmdExecutable, "+quit", false); } - if (File.Exists($"./{steamCMDName}")) + EnsureSteamCmdIsExecutable(steamCmdExecutable); + + if (File.Exists(steamCmdArchivePath)) { - File.Delete($"./{steamCMDName}"); + File.Delete(steamCmdArchivePath); } } + + private static void EnsureSteamCmdIsExecutable(string steamCMDExecutable) + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + return; + + var mode = File.GetUnixFileMode(steamCMDExecutable); + File.SetUnixFileMode(steamCMDExecutable, mode | UnixFileMode.UserExecute | UnixFileMode.GroupExecute | UnixFileMode.OtherExecute); + } + + private static void ExtractTarGzToDirectory(string archivePath, string destinationDirectory) + { + using var archiveStream = File.OpenRead(archivePath); + using var gzipStream = new GZipStream(archiveStream, CompressionMode.Decompress); + TarFile.ExtractToDirectory(gzipStream, destinationDirectory, true); + } - static void DownloadFile(string url, string fileName) + static void DownloadFile(string url, string filePath) { using HttpClient client = new HttpClient(); using HttpResponseMessage response = client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead).Result; response.EnsureSuccessStatusCode(); using Stream stream = response.Content.ReadAsStream(); - using FileStream fileStream = new FileStream($"./{fileName}", FileMode.Create, FileAccess.Write, FileShare.None); + using FileStream fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None); stream.CopyTo(fileStream); } } From 006064f28f1b30e51c82480734bacd4f29dbeafd Mon Sep 17 00:00:00 2001 From: AiAe Date: Sat, 6 Jun 2026 02:03:09 +0300 Subject: [PATCH 06/13] Fix --- MacAppPackager.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MacAppPackager.cs b/MacAppPackager.cs index f75ea8d..22cff46 100644 --- a/MacAppPackager.cs +++ b/MacAppPackager.cs @@ -98,10 +98,10 @@ @implementation QuaverAppDelegate - (void)launchQuaverWithArguments:(NSArray *)arguments { NSString *installDirectory = [self installDirectory]; - NSString *binaryPath = [installDirectory stringByAppendingPathComponent:@"Quaver.bin"]; + NSString *launcherPath = [installDirectory stringByAppendingPathComponent:@"Quaver"]; NSTask *task = [[NSTask alloc] init]; - task.executableURL = [NSURL fileURLWithPath:binaryPath]; + task.executableURL = [NSURL fileURLWithPath:launcherPath]; task.currentDirectoryURL = [NSURL fileURLWithPath:installDirectory isDirectory:YES]; task.arguments = arguments ?: @[]; @@ -111,7 +111,7 @@ @implementation QuaverAppDelegate NSError *error = nil; if (![task launchAndReturnError:&error]) { - NSLog(@"Failed to launch Quaver.bin: %@", error); + NSLog(@"Failed to launch Quaver: %@", error); } self.launchedGame = YES; From 4447ae54ef5a1cbc5d3cd4f193a7f7f4bef3e2ac Mon Sep 17 00:00:00 2001 From: AiAe Date: Sat, 6 Jun 2026 02:03:31 +0300 Subject: [PATCH 07/13] Re-enable some of the functions --- Program.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Program.cs b/Program.cs index 45daff3..c1bb247 100644 --- a/Program.cs +++ b/Program.cs @@ -49,10 +49,10 @@ static void Main(string[] args) Directory.SetCurrentDirectory(CurrentDirectory); Configuration = Config.Deserialize(Path.Combine(CurrentDirectory, "config.json")); SetupSteamCMD(); - //CleanUp(); + CleanUp(); GameVersion(); Branch(); - //CloneProject(); + CloneProject(); BuildProject(); //ObfuscateClient(); MacAppPackager.Package(CurrentDirectory, CompiledBuildPath, SourceCodePath, Version, Configuration); From 77a5ce59d3b5b460edf64c105562eec5b27c9821 Mon Sep 17 00:00:00 2001 From: AiAe Date: Sat, 6 Jun 2026 13:43:09 +0300 Subject: [PATCH 08/13] Dynamic icons --- Images/Quaver.icns | Bin 0 -> 569613 bytes Images/Quaver.iconset/icon_128x128.png | Bin 0 -> 20743 bytes Images/Quaver.iconset/icon_128x128@2x.png | Bin 0 -> 74005 bytes Images/Quaver.iconset/icon_16x16.png | Bin 0 -> 1380 bytes Images/Quaver.iconset/icon_16x16@2x.png | Bin 0 -> 2830 bytes Images/Quaver.iconset/icon_256x256.png | Bin 0 -> 74005 bytes Images/Quaver.iconset/icon_256x256@2x.png | Bin 0 -> 240251 bytes Images/Quaver.iconset/icon_32x32.png | Bin 0 -> 2830 bytes Images/Quaver.iconset/icon_32x32@2x.png | Bin 0 -> 7129 bytes Images/Quaver.iconset/icon_512x512.png | Bin 0 -> 240251 bytes Images/Quaver.iconset/icon_512x512@2x.png | Bin 0 -> 686042 bytes MacAppPackager.cs | 125 +++++++++++++- Program.cs | 189 +++++++++++++++++++++- Quaver.Steam.Deploy.csproj | 3 + 14 files changed, 309 insertions(+), 8 deletions(-) create mode 100644 Images/Quaver.icns create mode 100644 Images/Quaver.iconset/icon_128x128.png create mode 100644 Images/Quaver.iconset/icon_128x128@2x.png create mode 100644 Images/Quaver.iconset/icon_16x16.png create mode 100644 Images/Quaver.iconset/icon_16x16@2x.png create mode 100644 Images/Quaver.iconset/icon_256x256.png create mode 100644 Images/Quaver.iconset/icon_256x256@2x.png create mode 100644 Images/Quaver.iconset/icon_32x32.png create mode 100644 Images/Quaver.iconset/icon_32x32@2x.png create mode 100644 Images/Quaver.iconset/icon_512x512.png create mode 100644 Images/Quaver.iconset/icon_512x512@2x.png diff --git a/Images/Quaver.icns b/Images/Quaver.icns new file mode 100644 index 0000000000000000000000000000000000000000..a3ece55c4a083bd25bb7a57576ebc9f132990391 GIT binary patch literal 569613 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

@$6z)Qf_^(4x>51e5*5X+ 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%0D#irc`Um6rE+PY83vc@0VrWUM!e?f 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