This commit is contained in:
Louis Lam 2022-10-08 23:47:27 +08:00
parent 3eaccb560e
commit 655ba015a0
3 changed files with 121 additions and 11 deletions

View file

@ -1,14 +1,19 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Diagnostics;
using System.IO; using System.IO;
using System.IO.Compression;
using System.Net; using System.Net;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
namespace UptimeKuma { namespace UptimeKuma {
public partial class DownloadForm : Form { public partial class DownloadForm : Form {
private readonly Queue<DownloadItem> downloadQueue = new(); private readonly Queue<DownloadItem> downloadQueue = new();
private readonly WebClient webClient = new(); private readonly WebClient webClient = new();
private DownloadItem currentDownloadItem;
public DownloadForm() { public DownloadForm() {
InitializeComponent(); InitializeComponent();
@ -18,17 +23,19 @@ namespace UptimeKuma {
webClient.DownloadProgressChanged += DownloadProgressChanged; webClient.DownloadProgressChanged += DownloadProgressChanged;
webClient.DownloadFileCompleted += DownloadFileCompleted; webClient.DownloadFileCompleted += DownloadFileCompleted;
if (!File.Exists("node")) { if (!Directory.Exists("node")) {
downloadQueue.Enqueue(new DownloadItem { downloadQueue.Enqueue(new DownloadItem {
URL = "https://nodejs.org/dist/v16.17.1/node-v16.17.1-win-x64.zip", URL = "https://nodejs.org/dist/v16.17.1/node-v16.17.1-win-x64.zip",
Filename = "node.zip" Filename = "node.zip",
TargetFolder = "node"
}); });
} }
if (!File.Exists("node")) { if (!Directory.Exists("node")) {
downloadQueue.Enqueue(new DownloadItem { downloadQueue.Enqueue(new DownloadItem {
URL = "https://github.com/louislam/uptime-kuma/archive/refs/tags/1.18.3.zip", URL = "https://github.com/louislam/uptime-kuma/archive/refs/tags/1.18.3.zip",
Filename = "core.zip" Filename = "core.zip",
TargetFolder = "core"
}); });
} }
@ -38,28 +45,130 @@ namespace UptimeKuma {
void DownloadNextFile() { void DownloadNextFile() {
if (downloadQueue.Count > 0) { if (downloadQueue.Count > 0) {
var item = downloadQueue.Dequeue(); var item = downloadQueue.Dequeue();
currentDownloadItem = item;
// Download if the zip file is not existing
if (!File.Exists(item.Filename)) {
label.Text = item.URL; label.Text = item.URL;
webClient.DownloadFileAsync(new Uri(item.URL), item.Filename); webClient.DownloadFileAsync(new Uri(item.URL), item.Filename);
} else { } else {
// TODO: Finished, extract? progressBar.Value = 100;
label.Text = "Use local " + item.Filename;
DownloadFileCompleted(null, null);
} }
} else {
npmSetup();
}
}
void npmSetup() {
if (Directory.Exists("core/node_modules")) {
// Application.Restart();
}
label.Text = "npm run setup";
progressBar.Value = 50;
labelData.Text = "";
var startInfo = new ProcessStartInfo {
FileName = "cmd.exe",
Arguments = "run setup",
RedirectStandardOutput = false,
RedirectStandardError = false,
RedirectStandardInput = true,
UseShellExecute = false,
CreateNoWindow = false,
WorkingDirectory = "core"
};
var process = new Process();
process.StartInfo = startInfo;
process.EnableRaisingEvents = true;
process.Exited += (object _, EventArgs e) => {
// Application.Restart();
progressBar.Value = 100;
if (process.ExitCode == 0) {
label.Text = "Done";
} else {
label.Text = "Failed, exit code: " + process.ExitCode;
}
};
process.Start();
process.StandardInput.WriteLine("\"../node/npm\" run setup");
} }
void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) { void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) {
progressBar.Value = e.ProgressPercentage; progressBar.Value = e.ProgressPercentage;
var total = e.TotalBytesToReceive / 1024; var total = e.TotalBytesToReceive / 1024;
var current = e.BytesReceived / 1024; var current = e.BytesReceived / 1024;
if (total > 0) {
labelData.Text = $"{current}KB/{total}KB"; labelData.Text = $"{current}KB/{total}KB";
} }
}
void DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) { async void DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) {
Extract(currentDownloadItem);
DownloadNextFile(); DownloadNextFile();
} }
void Extract(DownloadItem item) {
if (Directory.Exists(item.TargetFolder)) {
var dir = new DirectoryInfo(item.TargetFolder);
dir.Delete(true);
}
if (Directory.Exists("temp")) {
var dir = new DirectoryInfo("temp");
dir.Delete(true);
}
labelData.Text = $"Extracting {item.Filename}...";
ZipFile.ExtractToDirectory(item.Filename, "temp");
string[] dirList;
// Move to the correct level
dirList = Directory.GetDirectories("temp");
if (dirList.Length > 0) {
var dir = dirList[0];
// As sometime ExtractToDirectory is still locking the directory, loop until ok
while (true) {
try {
Directory.Move(dir, item.TargetFolder);
break;
} catch (Exception exception) {
Thread.Sleep(1000);
}
}
} else {
MessageBox.Show("Unexcepted Error: Cannot move extracted files, folder not found.");
}
labelData.Text = $"Extracted";
if (Directory.Exists("temp")) {
var dir = new DirectoryInfo("temp");
dir.Delete(true);
}
File.Delete(item.Filename);
}
} }
public class DownloadItem { public class DownloadItem {
public string URL { get; set; } public string URL { get; set; }
public string Filename { get; set; } public string Filename { get; set; }
public string TargetFolder { get; set; }
} }
} }

View file

@ -45,7 +45,7 @@ namespace UptimeKuma {
trayIcon.MouseDoubleClick += new MouseEventHandler(Open); trayIcon.MouseDoubleClick += new MouseEventHandler(Open);
trayIcon.Visible = true; trayIcon.Visible = true;
if (File.Exists("core") && File.Exists("node")) { if (Directory.Exists("core") && Directory.Exists("node") && Directory.Exists("core/node_modules")) {
// Go go go // Go go go
StartProcess(); StartProcess();
} else { } else {

View file

@ -35,11 +35,12 @@
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>
<PostBuildEvent>COPY "$(SolutionDir)bin\Debug\uptime-kuma.exe" "C:\Users\LouisLam\Desktop\uptime-kuma-win64\"</PostBuildEvent> <PostBuildEvent>COPY "$(SolutionDir)bin\Debug\uptime-kuma.exe" "%UserProfile%\Desktop\uptime-kuma-win64\"</PostBuildEvent>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.IO.Compression.FileSystem" />
<Reference Include="System.Xml.Linq" /> <Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" /> <Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />