downloading now works

This commit is contained in:
murdle 2025-05-01 15:45:01 -07:00
parent e220c2e20d
commit b8c915a37d
4 changed files with 52 additions and 18 deletions

View File

@ -1,3 +1,5 @@
// See https://aka.ms/new-console-template for more information using RobloxLegacy;
using RobloxLegacy.AppData;
Console.WriteLine("hi"); using var manager = new VersionManager(new StudioData());
await manager.InstallPackage();

View File

@ -9,6 +9,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.AspNet.WebApi.Client" Version="6.0.0" /> <PackageReference Include="Microsoft.AspNet.WebApi.Client" Version="6.0.0" />
<PackageReference Include="SharpZipLib" Version="1.4.2" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -2,8 +2,13 @@
public static class Logger public static class Logger
{ {
public static void Log(string msg) public static void Info(string msg)
{ {
Console.Write($"[+] {msg}"); Console.Write($"[+] {msg}\n", ConsoleColor.Gray);
}
public static void Error(string msg)
{
Console.Write($"[!] {msg}\n", ConsoleColor.Red);
} }
} }

View File

@ -1,23 +1,31 @@
using System.Text.Json.Serialization; using Newtonsoft.Json;
using System.IO.Compression;
using RobloxLegacy.AppData; using RobloxLegacy.AppData;
using RobloxLegacy.Utilities; using RobloxLegacy.Utilities;
using ICSharpCode.SharpZipLib.Zip;
namespace RobloxLegacy; namespace RobloxLegacy;
public abstract class VersionData public class VersionData
{ {
[JsonPropertyName("version")] [JsonProperty("version")]
public required string Version { get; set; } public required string Version { get; set; }
[JsonPropertyName("clientVersionUpload")] [JsonProperty("clientVersionUpload")]
public required string UploadHash { get; set; } public required string UploadHash { get; set; }
} }
public class VersionManager(IAppData appData) public class VersionManager : IDisposable
{ {
private static readonly HttpClient Client = new(); private static readonly HttpClient Client = new();
private const string CdnUrl = "https://setup.rbxcdn.com"; private const string CdnUrl = "https://setup.rbxcdn.com";
private readonly string _tempPath = Path.Combine(Path.GetTempPath(), $"RobloxLegacy.{Guid.NewGuid().ToString()}");
private readonly IAppData _appData;
public VersionManager(IAppData appData)
{
Directory.CreateDirectory(_tempPath);
_appData = appData;
}
private static string GetVersionPath(string version) private static string GetVersionPath(string version)
{ {
@ -27,7 +35,7 @@ public class VersionManager(IAppData appData)
private async Task<VersionData?> GetLatestVersion() private async Task<VersionData?> GetLatestVersion()
{ {
var url = $"https://clientsettings.roblox.com/v2/client-version/{appData.Name}/channel/LIVE"; var url = $"https://clientsettings.roblox.com/v2/client-version/{_appData.Name}/channel/LIVE";
var response = await Client.GetAsync(url); var response = await Client.GetAsync(url);
if(!response.IsSuccessStatusCode) // just to be safe if(!response.IsSuccessStatusCode) // just to be safe
return null; return null;
@ -35,10 +43,11 @@ public class VersionManager(IAppData appData)
return version; return version;
} }
private static void ExtractBundle(string version, string folder, Stream file) private static void ExtractBundle(string version, string folder, string tempFile)
{ {
var fastZip = new FastZip();
var extractPath = Path.Combine(GetVersionPath(version), folder); var extractPath = Path.Combine(GetVersionPath(version), folder);
ZipFile.ExtractToDirectory(file, extractPath); fastZip.ExtractZip(tempFile, extractPath, null);
} }
public async Task InstallPackage() public async Task InstallPackage()
@ -47,12 +56,29 @@ public class VersionManager(IAppData appData)
if(version == null) if(version == null)
throw new Exception("No version data found"); throw new Exception("No version data found");
Logger.Log($"Installing {appData.Name} version {version.Version}"); Logger.Info($"Installing {_appData.Name} version {version.Version}");
foreach (var file in appData.PackageFiles) foreach (var file in _appData.PackageFiles)
{
try
{ {
var fileName = $"{version.UploadHash}-{file.Key}"; var fileName = $"{version.UploadHash}-{file.Key}";
var fileStream = await Client.GetStreamAsync($"{CdnUrl}/{fileName}"); var fileBytes = await Client.GetByteArrayAsync($"{CdnUrl}/{fileName}");
ExtractBundle(version.UploadHash, file.Value, fileStream);
var zipPath = Path.Combine(_tempPath, fileName);
await File.WriteAllBytesAsync(zipPath, fileBytes);
ExtractBundle(version.UploadHash, file.Value, zipPath);
} }
catch (HttpRequestException)
{
Logger.Error($"Failed to download {file.Key}");
}
}
}
public void Dispose()
{
Directory.Delete(_tempPath, true);
GC.SuppressFinalize(this);
} }
} }