From a06a53f4cec2ce8f9c577b3dee9d7e52031d2e16 Mon Sep 17 00:00:00 2001 From: David DarkVamprism Date: Thu, 20 Aug 2020 14:37:16 +0800 Subject: [PATCH] Added ability to silently setup. --- BandagedBD/BandagedBD.csproj | 1 + BandagedBD/Program.cs | 62 ++++- BandagedBD/Silent/SilentOnlyUtilities.cs | 308 +++++++++++++++++++++++ BandagedBD/Utilities.cs | 1 + 4 files changed, 366 insertions(+), 6 deletions(-) create mode 100644 BandagedBD/Silent/SilentOnlyUtilities.cs diff --git a/BandagedBD/BandagedBD.csproj b/BandagedBD/BandagedBD.csproj index 520b4cf..09b20da 100644 --- a/BandagedBD/BandagedBD.csproj +++ b/BandagedBD/BandagedBD.csproj @@ -150,6 +150,7 @@ + FormMain.cs diff --git a/BandagedBD/Program.cs b/BandagedBD/Program.cs index 37b7967..2a62d00 100644 --- a/BandagedBD/Program.cs +++ b/BandagedBD/Program.cs @@ -1,4 +1,5 @@ -using System; +using BandagedBD.Silent; +using System; using System.Windows.Forms; namespace BandagedBD { @@ -7,10 +8,59 @@ namespace BandagedBD { /// The main entry point for the application. /// [STAThread] - static void Main() { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new FormMain()); - } + + static void Main(string[] args) { + LaunchMode launchMode = LaunchMode.GUI; + + // check first argument to check if it is a silent install switch + switch (args[0].ToLower()) { + // Silent Install switches + case "-install": + case "-i": + launchMode = LaunchMode.Install; + break; + case "-repair": + case "-r": + launchMode = LaunchMode.Repair; + break; + case "-uninstall": + case "-u": + launchMode = LaunchMode.Uninstall; + break; + case "-help": + case "-h": + launchMode = LaunchMode.None; + Console.WriteLine("-install, -i Install BBD\n" + + "-uninstall, -u Uninstall BBD\n" + + " Optional switches for uninstall\n" + + " -deleteuserdata deletes all user settings of betterdiscord\n" + + "-repair, -r Repair BBD\n" + + " Optional switches for repair, for the following issues\n" + + " -repairupdateloop Discord update loop\n" + + " -repairnotlaunching BandagedBD not launching with Discord\n" + + " -repairloadingindefinitely BandagedBD loading indefinitely\n" + + " -repairjavascripterror Fatal JavaScript error on launch\n" + + "\nall require using one or more of the following\n" + + " -stable [path], -canary [path], -ptb [path]\n" + + "\n-norestart By default discord will be restarted, this disables restarting of processes" + + ""); + break; + default: + break; + } + + switch (launchMode) { + case LaunchMode.GUI: + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new FormMain()); + break; + case LaunchMode.None: + break; + default: + new SilentOnlyUtilities(launchMode, args); + break; + } + } } } diff --git a/BandagedBD/Silent/SilentOnlyUtilities.cs b/BandagedBD/Silent/SilentOnlyUtilities.cs new file mode 100644 index 0000000..463143d --- /dev/null +++ b/BandagedBD/Silent/SilentOnlyUtilities.cs @@ -0,0 +1,308 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Compression; +using System.Net; + +namespace BandagedBD.Silent { + class SilentOnlyUtilities { + private bool useStable; + private bool useCanary; + private bool usePTB; + + // Additional Options + private bool shouldRestart = true; + + // Repair Options + public bool shouldDeleteRoaming; + public bool shouldDeleteLocal; + public bool shouldDeleteStorage; + public bool shouldReinstall; + + // Uninstall Options + public bool shouldDeleteUserData; + + // General + private string repo = "rauenzi"; + private string branch = "injector"; + + private int iteration = 0; + + private string[] processNames; + private string[] paths; + private string[] roamings; + + private int progressChunk; + + public string[] pathsToDelete { + get { + List paths = new List(Utilities.GetLocalPaths(useStable, useCanary, usePTB, "resources\\app")); + if (shouldDeleteUserData) paths.Add($"{Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)}\\BetterDiscord"); + return paths.ToArray(); + } + } + + public SilentOnlyUtilities(LaunchMode launchMode, string[] args) { + processArgs(args); + + if (useStable || useCanary || usePTB) { + paths = Utilities.GetLocalPaths(useStable, useCanary, usePTB); + processNames = Utilities.GetExecutables(useStable, useCanary, usePTB); + roamings = Utilities.GetRoamingPaths(useStable, useCanary, usePTB); + + if (paths.Length > 0) progressChunk = 100 / paths.Length; + + switch (launchMode) { + case LaunchMode.Install: + Install(); + break; + case LaunchMode.Repair: + Repair(); + break; + case LaunchMode.Uninstall: + Uninstall(); + break; + } + } else { + Console.WriteLine("No branch specified, please use -stable, -canary or -ptb"); + } + } + + private void setProgress(int baseAmount) { + Console.WriteLine(((baseAmount * progressChunk) / 100) + (progressChunk * iteration) + "% of 100% complete"); + } + + private void processArgs(string[] args) { + for (int i = 0; i < args.Length; i++) { + switch (args[i].ToLower()) { + // Path switches + // If Path switch is found then next argument should be the path + case "-stablepath": + case "-stable": + useStable = true; + Utilities.CurrentStablePath = args[i + 1]; + i++; + break; + case "-canarypath": + case "-canary": + useCanary = true; + Utilities.CurrentCanaryPath = args[i + 1]; + i++; + break; + case "-ptbpath": + case "-ptb": + usePTB = true; + Utilities.CurrentPtbPath = args[i + 1]; + i++; + break; + + // Additional Options switches + case "-norestart": + shouldRestart = false; + break; + + // Repair switches + case "-repairupdateloop": + shouldDeleteRoaming = true; + shouldDeleteLocal = true; + shouldReinstall = true; + break; + case "-repairnotlaunching": + shouldReinstall = true; + break; + case "-repairloadingindefinitely": + shouldDeleteStorage = true; + break; + case "-repairjavascripterror": + shouldDeleteRoaming = true; + break; + case "-deleteuserdata": + shouldDeleteUserData = true; + break; + } + } + } + + private void Install() { + InstallTask(); + } + + private void Repair() { + List exes = new List(); + foreach (var process in processNames) exes.Add(Utilities.KillProcess(process, Append)); + if (shouldDeleteRoaming) Utilities.DeleteFolders(Utilities.GetRoamingPaths(useStable, useCanary, usePTB), Append); + if (shouldDeleteLocal) Utilities.DeleteFolders(Utilities.GetLocalPaths(useStable, useCanary, usePTB), Append); + if (shouldDeleteStorage) Utilities.DeleteFiles(new string[] { $"{Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)}\\BetterDiscord\\bdstorage.json" }, Append); + if (shouldReinstall) { + Install(); + } else { + foreach (var exe in exes) { + if (exe != string.Empty && shouldRestart) Utilities.OpenProcess(exe); + } + Append("Repairs completed!"); + } + } + + private void Uninstall() { + List exes = new List(); + foreach (var process in processNames) exes.Add(Utilities.KillProcess(process, Append)); + string[] deletePaths = pathsToDelete; + int chunk = 80 / deletePaths.Length; + int i = 0; + int newValue = 20; + Utilities.DeleteFolders(deletePaths, (message) => { + Append(message); + newValue = (chunk * i + chunk) + 20; + i++; + }); + foreach (var exe in exes) { + if (exe != string.Empty && shouldRestart) Utilities.OpenProcess(exe); + } + Append("Uninstalling Complete!"); + } + + private int InstallTask() { + for (int i = 0; i < paths.Length; i++) { + iteration = i; + Append($"Starting installation for {processNames[i]}"); + Append($"Killing {processNames[i]} Processes"); + string currentExecutable = Utilities.KillProcess(processNames[i], Append); + + if (DownloadBd(paths[i]) != 1) { + setProgress(0); + Append("Download seems to have failed, will try once more."); + if (DownloadBd(paths[i]) != 1) return 0; + } + + setProgress(75); + if (Verify(paths[i]) != 1) return 0; + setProgress(90); + if (shouldRestart && currentExecutable != string.Empty) { + Append($"Restarting {processNames[i]}"); + Utilities.OpenProcess(currentExecutable); + } + setProgress(100); + Append($"Finished installing BandagedBD for {processNames[i]}!"); + Append("---------------------------------------------------------------------------------"); + } + return 1; + } + + private int DownloadBd(string installationPath) { + var channel = $"https://github.com/{repo}/BetterDiscordApp/archive/{branch}.zip"; + var dest = $"{installationPath}\\resources\\BetterDiscord.zip"; + + Append("Downloading BandagedBD package"); + + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3; + + + using (var wc = new TimedWebClient()) { + wc.DownloadProgressChanged += (sender, args) => { + setProgress(args.ProgressPercentage / 2); + }; + + Append($"Using channel: {channel}"); + Append($"Downloading to: {dest}"); + + try { + wc.DownloadFile(channel, dest); + } catch (WebException e) { + Append("Download error: " + e.Message); + return 0; + } + + } + + Append("Finished downloading BandagedBD package"); + + return ExtractBd(dest, $"{installationPath}\\resources"); + } + + private int ExtractBd(string path, string dest) { + + if (Directory.Exists($"{dest}\\app")) { + Append("Deleting old BetterDiscord"); + Directory.Delete($"{dest}\\app", true); + } + + if (Directory.Exists($"{dest}\\BetterDiscordApp-{branch}")) { + Append($"Deleting old BetterDiscordApp-{branch}"); + Directory.Delete($"{dest}\\BetterDiscordApp-{branch}", true); + } + + Append("Extracting BandagedBD package"); + + if (!File.Exists(path)) { + Append($"BandagedBD package does not exist in: {path}. Cannot continue."); + return 0; + } + + var zar = ZipFile.OpenRead(path); + + if (!Directory.Exists(dest)) { + Directory.CreateDirectory(dest); + } + + zar.ExtractToDirectory(dest); + zar.Dispose(); + if (!Directory.Exists($"{dest}\\BetterDiscordApp-{branch}")) { + Append($"BandagedBD package does not exist in: {dest}\\BetterDiscordApp-{branch}. Cannot continue."); + return 0; + } + + Append("Renaming package dir"); + + Directory.Move($"{dest}\\BetterDiscordApp-{branch}", $"{dest}\\app"); + + if (File.Exists(path)) { + Append($"Deleting temp file {path}"); + File.Delete(path); + } + + return 1; + } + + private int Verify(string installationPath) { + + Append("Verifying installation"); + Append("Checking for old style injection"); + foreach (var roaming in roamings) { + var core = $"{roaming}\\modules\\discord_desktop_core\\core"; + Append($"Checking for old injection {roaming}"); + if (!Directory.Exists(core)) continue; + Append($"Deleting old injection {roaming}"); + try { + Directory.Delete(roaming, true); + } catch { + Append($"Please delete this folder: {roaming}"); + } + } + + var appFolder = $"{installationPath}\\resources\\app"; + if (!Directory.Exists(appFolder)) { + Append($"{appFolder} does not exist! Verification failed!"); + return 0; + } + + var injectorFiles = new[] { "index.js", "package.json", "betterdiscord\\index.js", "betterdiscord\\preload.js", "betterdiscord\\config.json", "betterdiscord\\logger.js" }; + + foreach (var bdFile in injectorFiles) { + if (File.Exists($"{appFolder}\\{bdFile}")) { + Append($"Verifying {appFolder}\\{bdFile}"); + continue; + } + Append($"{appFolder}\\{bdFile} does not exist! Verification failed!"); + return 0; + } + + Append("Verification successful"); + + return 1; + } + + private void Append(string text) { + Console.WriteLine(text); + } + } +} diff --git a/BandagedBD/Utilities.cs b/BandagedBD/Utilities.cs index 3b04d1a..fba5674 100644 --- a/BandagedBD/Utilities.cs +++ b/BandagedBD/Utilities.cs @@ -10,6 +10,7 @@ using System.Windows.Forms; namespace BandagedBD { public enum Discord { Stable, Canary, PTB }; + public enum LaunchMode { GUI, Install, Repair, Uninstall, None }; public class Utilities { public static readonly Regex _matcher = new Regex(@"[0-9]+\.[0-9]+\.[0-9]+");