Skip to content

Commit

Permalink
I'm going to play tetris
Browse files Browse the repository at this point in the history
  • Loading branch information
notcarlton committed Apr 20, 2023
1 parent b97ff7c commit 8946a01
Show file tree
Hide file tree
Showing 4 changed files with 149 additions and 17 deletions.
80 changes: 64 additions & 16 deletions JiayiLauncher/Features/Versions/VersionManager.cs
Original file line number Diff line number Diff line change
@@ -1,33 +1,81 @@
using System.IO;
using System;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net.Http;
using System.Security.Cryptography;
using System.Threading.Tasks;
using JiayiLauncher.Settings;
using JiayiLauncher.Utils;

namespace JiayiLauncher.Features.Versions;

public static class VersionManager
{
public static event EventHandler<EventArgs>? DownloadFinished;

public static bool VersionInstalled(string ver)
{
Directory.CreateDirectory(JiayiSettings.Instance!.VersionsPath);
var folders = Directory.GetDirectories(JiayiSettings.Instance!.VersionsPath);
return folders.Any(x => x.Contains(ver));
}

// haven't finished this code yet pls no touch
// public static async Task DownloadVersion(MinecraftVersion version)
// {
// var updateId = version.Archs.x64!.UpdateIds[0];
// var url = await RequestFactory.GetDownloadUrl(updateId);
// var fileName = version.Archs.x64.FileName;
// var filePath = Path.Combine(JiayiSettings.Instance!.VersionsPath, fileName);
//
// var hash = MD5.HashData(await File.ReadAllBytesAsync(filePath));
// var hashString = string.Join("", hash.Select(x => x.ToString("x2")));
// if (hashString == version.Archs.x64.Hashes.MD5) return;
//
// using var client = new HttpClient();
// using
// }
public static async Task DownloadVersion(MinecraftVersion version, IProgress<ProgressEventArgs> progress)
{
var updateId = version.Archs.x64!.UpdateIds[0];
var url = await RequestFactory.GetDownloadUrl(updateId);
var fileName = version.Archs.x64.FileName;
var filePath = Path.Combine(JiayiSettings.Instance!.VersionsPath, fileName);

if (File.Exists(filePath)) File.Delete(filePath);

using var client = new HttpClient();
using var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);

if (!response.IsSuccessStatusCode) return;

var contentLength = response.Content.Headers.ContentLength;
var totalRead = 0L;
var buffer = new byte[1048576]; // 1 MB buffer

await using var stream = await response.Content.ReadAsStreamAsync();
await using var fileStream = new FileStream(filePath, FileMode.Create);

progress.Report(new ProgressEventArgs(0));

while (true)
{
var read = await stream.ReadAsync(buffer);
if (read == 0) break;

await fileStream.WriteAsync(buffer.AsMemory(0, read));
totalRead += read;
progress.Report(new ProgressEventArgs((int)(totalRead * 100 / contentLength)!));
}

progress.Report(new ProgressEventArgs(100));

fileStream.Close();
stream.Close();

var folder = Path.Combine(JiayiSettings.Instance.VersionsPath, version.Version);
Directory.CreateDirectory(folder);
ZipFile.ExtractToDirectory(filePath, folder);
File.Delete(filePath);

DownloadFinished?.Invoke(null, EventArgs.Empty);
}

public static async Task RemoveVersion(string ver)
{
await Task.Run(() =>
{
var folders = Directory.GetDirectories(JiayiSettings.Instance!.VersionsPath);
var folder = folders.FirstOrDefault(x => x.Contains(ver));
if (folder == null) return;
Directory.Delete(folder, true);
});
}
}
57 changes: 56 additions & 1 deletion JiayiLauncher/Pages/Extra/FullVersionList.razor
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
@page "/Versions/Full/{version?}"
@using JiayiLauncher.Features.Versions
@using Microsoft.JSInterop
@using ProgressEventArgs = JiayiLauncher.Utils.ProgressEventArgs

@* javascript :( *@
@inject IJSRuntime JavaScript
Expand Down Expand Up @@ -38,9 +39,39 @@
var name = versions[i].Key;
var id = name.Replace(".", "");
var version = versions[i].Value;
var text = string.Empty;
var downloadDisabled = false;

<li class="version" id="@id">
<strong>@name</strong>
<div class="version-text">
<strong>@name</strong>
<i>@text</i>
</div>

<div class="version-buttons">
@if (VersionManager.VersionInstalled(name))
{
<JiayiButton Size="JiayiButton.ButtonSize.Small"
OnClick="async () => await RemoveClicked(name)">Remove</JiayiButton>
<JiayiButton Size="JiayiButton.ButtonSize.Small">Switch</JiayiButton>
}
else
{
text = "0% downloaded";
var progress = new Progress<ProgressEventArgs>(args =>
{
downloadDisabled = true;
text = args.Percentage == 100 ? $"{args.Percentage}% downloaded" : "Extracting...";
StateHasChanged();
});

<JiayiButton Size="JiayiButton.ButtonSize.Small"
Disabled="@downloadDisabled"
OnClick="async () => await VersionManager.DownloadVersion(version, progress)">
Download
</JiayiButton>
}
</div>
</li>
}
</ul>
Expand All @@ -62,6 +93,9 @@

[Parameter]
public bool ShowTitle { get; set; } = true;

[CascadingParameter]
public IModalService ModalService { get; set; } = default!;

private Dictionary<string, MinecraftVersion>? _versionList;
private int _amountToDisplay = 10;
Expand All @@ -73,6 +107,7 @@
protected override async Task OnInitializedAsync()
{
_versionList = await VersionList.GetFullVersionList();
VersionManager.DownloadFinished += (_, _) => StateHasChanged();
}

protected override async Task OnParametersSetAsync()
Expand All @@ -93,4 +128,24 @@
NavigationManager.NavigateTo("/Versions");
}

private async Task RemoveClicked(string ver)
{
var options = new List<(string, EventCallback)>
{
("Yes", new EventCallback(null, async () =>
{
await VersionManager.RemoveVersion(ver);
StateHasChanged();
})),
("No", EventCallback.Empty)
};

var parameters = new ModalParameters()
.Add(nameof(MessageBox.Buttons), options)
.Add(nameof(MessageBox.Message), "Are you sure you want to remove this version?");

var modal = ModalService.Show<MessageBox>("Remove version", parameters);
await modal.Result;
StateHasChanged();
}
}
16 changes: 16 additions & 0 deletions JiayiLauncher/Pages/Extra/FullVersionList.razor.css
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,22 @@
background-color: var(--background-secondary);
}

.version-text {
display: flex;
gap: 0.5rem;
}

.version-text i {
color: var(--text-grayed);
font-size: 14px;
font-style: italic;
}

.version-buttons {
display: flex;
gap: 0.5rem;
}

.load-more {
cursor: pointer;
display: flex;
Expand Down
13 changes: 13 additions & 0 deletions JiayiLauncher/Utils/ProgressEventArgs.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using System;

namespace JiayiLauncher.Utils;

public class ProgressEventArgs : EventArgs
{
public int Percentage { get; set; }

public ProgressEventArgs(int percentage)
{
Percentage = percentage;
}
}

0 comments on commit 8946a01

Please sign in to comment.