From 77a609758bb80bac9497d2e3988550f8be578407 Mon Sep 17 00:00:00 2001 From: Rory& Date: Mon, 23 Feb 2026 02:03:20 +0100 Subject: Initial commit --- .../Services/BuildDownloadService.cs | 76 ++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 ReferenceClientProxyImplementation/Services/BuildDownloadService.cs (limited to 'ReferenceClientProxyImplementation/Services/BuildDownloadService.cs') diff --git a/ReferenceClientProxyImplementation/Services/BuildDownloadService.cs b/ReferenceClientProxyImplementation/Services/BuildDownloadService.cs new file mode 100644 index 0000000..364c6c5 --- /dev/null +++ b/ReferenceClientProxyImplementation/Services/BuildDownloadService.cs @@ -0,0 +1,76 @@ +// using System.Net; +// using AngleSharp.Html.Parser; +// +// namespace ReferenceClientProxyImplementation.Services; +// +// public class BuildDownloadService(ILogger logger) { +// private static readonly HttpClient hc = new(); +// +// public async Task DownloadBuildFromArchiveOrg(string outputDirectory, DateTime timestamp) { +// // 20150906025145 +// var paddedTimestamp = timestamp.ToString("yyyyMMddHHmmss"); +// await DownloadBuildFromUrl(outputDirectory, $"https://web.archive.org/web/{paddedTimestamp}im_/https://discordapp.com/login"); +// } +// +// public async Task DownloadBuildFromUrl(string outputDirectory, string url) { +// logger.LogInformation("Downloading build from {url} to {outDir}", url, outputDirectory); +// var response = await hc.GetAsync(url); +// if (!response.IsSuccessStatusCode) +// throw new Exception($"Failed to download build from {url}"); +// var html = await response.Content.ReadAsStringAsync(); +// File.WriteAllText(outputDirectory + "/index.html", html); +// var parser = new HtmlParser(); +// var document = parser.ParseDocument(html); +// var assets = document.QuerySelectorAll("link[rel=stylesheet], link[rel=icon], script, img"); +// foreach (var asset in assets) { +// var assetUrl = asset.GetAttribute("href") ?? asset.GetAttribute("src"); +// if (assetUrl == null) +// continue; +// if (assetUrl.StartsWith("//")) { +// logger.LogWarning("Skipping asset {assetUrl} as it is a protocol-relative URL", assetUrl); +// continue; +// } +// +// var assetStream = await GetAssetStream(assetUrl); +// var assetPath = Path.Combine(outputDirectory, assetUrl.TrimStart('/')); +// Console.WriteLine($"Downloading asset {assetUrl} to {assetPath}"); +// Directory.CreateDirectory(Path.GetDirectoryName(assetPath)); +// await using var fs = File.Create(assetPath); +// await assetStream.CopyToAsync(fs); +// } +// +// logger.LogInformation("Downloading build from {url} complete!", url); +// } +// +// public async Task GetAssetStream(string asset) { +// asset = asset.Replace("/assets/", ""); +// var urlsToTry = new Stack(new[] { +// $"https://web.archive.org/web/0id_/https://discordapp.com/assets/{asset}", +// $"https://web.archive.org/web/0id_/https://discord.com/assets/{asset}", +// $"https://discord.com/assets/{asset}" +// }); +// while (urlsToTry.TryPop(out var urlToTry)) { +// if (string.IsNullOrWhiteSpace(urlToTry)) continue; +// try { +// var response = await hc.GetAsync(urlToTry, HttpCompletionOption.ResponseHeadersRead); +// if (response.IsSuccessStatusCode) { +// Console.WriteLine($"Got success for asset {asset} from {urlToTry}"); +// return await response.Content.ReadAsStreamAsync(); +// } +// //redirect +// +// if (response.StatusCode == HttpStatusCode.Found) { +// var redirectUrl = response.Headers.Location?.ToString(); +// if (string.IsNullOrWhiteSpace(redirectUrl)) continue; +// urlsToTry.Push(redirectUrl); +// } +// else logger.LogWarning("Failed to download asset {asset} from {urlToTry}", asset, urlToTry); +// } +// catch { +// // ignored +// } +// } +// +// throw new Exception($"Failed to download asset {asset}"); +// } +// } \ No newline at end of file -- cgit 1.5.1