Added ability to silently setup.
This commit is contained in:
parent
2cf46226ae
commit
a06a53f4ce
|
@ -150,6 +150,7 @@
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Program.cs" />
|
<Compile Include="Program.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<Compile Include="Silent\SilentOnlyUtilities.cs" />
|
||||||
<Compile Include="Utilities.cs" />
|
<Compile Include="Utilities.cs" />
|
||||||
<EmbeddedResource Include="FormMain.resx">
|
<EmbeddedResource Include="FormMain.resx">
|
||||||
<DependentUpon>FormMain.cs</DependentUpon>
|
<DependentUpon>FormMain.cs</DependentUpon>
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using System;
|
using BandagedBD.Silent;
|
||||||
|
using System;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
namespace BandagedBD {
|
namespace BandagedBD {
|
||||||
|
@ -7,10 +8,59 @@ namespace BandagedBD {
|
||||||
/// The main entry point for the application.
|
/// The main entry point for the application.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[STAThread]
|
[STAThread]
|
||||||
static void Main() {
|
|
||||||
Application.EnableVisualStyles();
|
static void Main(string[] args) {
|
||||||
Application.SetCompatibleTextRenderingDefault(false);
|
LaunchMode launchMode = LaunchMode.GUI;
|
||||||
Application.Run(new FormMain());
|
|
||||||
}
|
// 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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<string> paths = new List<string>(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<string> exes = new List<string>();
|
||||||
|
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<string> exes = new List<string>();
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,6 +10,7 @@ using System.Windows.Forms;
|
||||||
namespace BandagedBD {
|
namespace BandagedBD {
|
||||||
|
|
||||||
public enum Discord { Stable, Canary, PTB };
|
public enum Discord { Stable, Canary, PTB };
|
||||||
|
public enum LaunchMode { GUI, Install, Repair, Uninstall, None };
|
||||||
|
|
||||||
public class Utilities {
|
public class Utilities {
|
||||||
public static readonly Regex _matcher = new Regex(@"[0-9]+\.[0-9]+\.[0-9]+");
|
public static readonly Regex _matcher = new Regex(@"[0-9]+\.[0-9]+\.[0-9]+");
|
||||||
|
|
Loading…
Reference in New Issue