From ec8ddeb513ec7b21056dbc6fa3a2b3ece7bd6266 Mon Sep 17 00:00:00 2001 From: "waffle.lord" Date: Fri, 26 Apr 2024 21:17:08 -0400 Subject: [PATCH 1/3] r2-rework WIP --- .../EftPatchHelper/EftPatchHelper.csproj | 1 + .../EftPatchHelper/Helpers/R2Helper.cs | 66 +++++++++++++++++ .../EftPatchHelper/Model/Options.cs | 2 + .../EftPatchHelper/Model/R2Upload.cs | 62 ++++++++++++++++ .../EftPatchHelper/Model/Settings.cs | 26 +++++++ .../Tasks/CreateReleaseTasks.cs | 72 +++++++++++-------- .../Tasks/StartupSettingsTask.cs | 5 ++ .../EftPatchHelper/Tasks/UploadTasks.cs | 8 +++ 8 files changed, 211 insertions(+), 31 deletions(-) create mode 100644 EftPatchHelper/EftPatchHelper/Helpers/R2Helper.cs create mode 100644 EftPatchHelper/EftPatchHelper/Model/R2Upload.cs diff --git a/EftPatchHelper/EftPatchHelper/EftPatchHelper.csproj b/EftPatchHelper/EftPatchHelper/EftPatchHelper.csproj index f808002..f639b28 100644 --- a/EftPatchHelper/EftPatchHelper/EftPatchHelper.csproj +++ b/EftPatchHelper/EftPatchHelper/EftPatchHelper.csproj @@ -10,6 +10,7 @@ + diff --git a/EftPatchHelper/EftPatchHelper/Helpers/R2Helper.cs b/EftPatchHelper/EftPatchHelper/Helpers/R2Helper.cs new file mode 100644 index 0000000..84674f3 --- /dev/null +++ b/EftPatchHelper/EftPatchHelper/Helpers/R2Helper.cs @@ -0,0 +1,66 @@ +using System.Net; +using Amazon.Runtime; +using Amazon.S3; +using EftPatchHelper.Model; +using Spectre.Console; + +namespace EftPatchHelper.Helpers; + +public class R2Helper +{ + private readonly IAmazonS3? _client; + public bool IsReady => _client != null; + + private Settings _settings; + + public R2Helper(Settings settings, Options options) + { + _settings = settings; + + if (_settings.UsingR2() && options.UplaodToR2) + { + var creds = new BasicAWSCredentials(_settings.R2AccessKeyId, _settings.R2SecretKeyId); + _client = new AmazonS3Client(creds, new AmazonS3Config + { + ServiceURL = _settings.R2ServiceUrl, + }); + } + } + + /// + /// Deletes all content in the bucket + /// + /// + public async Task ClearBucketAsync() + { + AnsiConsole.MarkupLine($"[blue]Getting bucket contents: {_settings.R2BucketName}[/]"); + var listBucketReponse = await _client.ListObjectsAsync(_settings.R2BucketName); + + if (listBucketReponse.HttpStatusCode != HttpStatusCode.OK) + { + AnsiConsole.MarkupLine("[red]failed to get bucket contents[/]"); + return false; + } + + AnsiConsole.MarkupLine("[blue]Removing old content"); + foreach (var s3Object in listBucketReponse.S3Objects) + { + var deleteRepsonse = await _client.DeleteObjectAsync(_settings.R2BucketName, s3Object.Key); + + if (deleteRepsonse.HttpStatusCode != HttpStatusCode.OK) + { + AnsiConsole.MarkupLine($"[red]failed to delete {_settings.R2BucketName}::{s3Object.Key}[/]"); + return false; + } + + AnsiConsole.MarkupLine($"[green]{_settings.R2BucketName}::{s3Object.Key} removed[/]"); + } + + return true; + } + + public async Task UplaodToBucketAsync(FileInfo file, IProgress progress = null) + { + // todo: this + } +} \ No newline at end of file diff --git a/EftPatchHelper/EftPatchHelper/Model/Options.cs b/EftPatchHelper/EftPatchHelper/Model/Options.cs index 8f61a80..93d4b60 100644 --- a/EftPatchHelper/EftPatchHelper/Model/Options.cs +++ b/EftPatchHelper/EftPatchHelper/Model/Options.cs @@ -39,6 +39,8 @@ namespace EftPatchHelper.Model /// public bool UploadToMega = false; + public bool UplaodToR2 = false; + /// /// Whether or not to upload to all sftp site listing /// diff --git a/EftPatchHelper/EftPatchHelper/Model/R2Upload.cs b/EftPatchHelper/EftPatchHelper/Model/R2Upload.cs new file mode 100644 index 0000000..4339bc3 --- /dev/null +++ b/EftPatchHelper/EftPatchHelper/Model/R2Upload.cs @@ -0,0 +1,62 @@ +using System.Net; +using Amazon.Runtime; +using Amazon.S3; +using Amazon.S3.Model; +using EftPatchHelper.Interfaces; +using Spectre.Console; + +namespace EftPatchHelper.Model; + +public class R2Upload : IFileUpload +{ + public string DisplayName { get; set; } + public string ServiceName { get; set; } + public string HubEntryText { get; set; } + public FileInfo UploadFileInfo { get; } + public bool AddHubEntry { get; } + + private readonly string _bucketName; + private readonly string _connectedDomainUrl; + private readonly IAmazonS3 _s3Client; + + public R2Upload(string connectedDomainUrl, string serviceUrl, string accessKey, string secretKey, string bucketName) + { + _bucketName = bucketName; + _connectedDomainUrl = connectedDomainUrl; + + var creds = new BasicAWSCredentials(accessKey, secretKey); + _s3Client = new AmazonS3Client(creds, new AmazonS3Config + { + ServiceURL = serviceUrl, + }); + + AddHubEntry = false; + } + + public string GetLink() + { + return $"{_connectedDomainUrl}/{UploadFileInfo.Name}"; + } + + public async Task UploadAsync(IProgress? progress = null) + { + var uploadRequest = new PutObjectRequest + { + BucketName = _bucketName, + FilePath = UploadFileInfo.FullName, + DisablePayloadSigning = true, + }; + + if (progress != null) + { + uploadRequest.StreamTransferProgress = (sender, progressArgs) => + { + progress.Report(progressArgs.PercentDone); + }; + } + + var uploadResponse = await _s3Client.PutObjectAsync(uploadRequest); + + return uploadResponse.HttpStatusCode == HttpStatusCode.OK; + } +} \ No newline at end of file diff --git a/EftPatchHelper/EftPatchHelper/Model/Settings.cs b/EftPatchHelper/EftPatchHelper/Model/Settings.cs index 0c24b4c..0750b4f 100644 --- a/EftPatchHelper/EftPatchHelper/Model/Settings.cs +++ b/EftPatchHelper/EftPatchHelper/Model/Settings.cs @@ -57,6 +57,21 @@ namespace EftPatchHelper.Model [JsonPropertyName("goFileFolderId")] public string GoFileFolderId { get; set; } = ""; + [JsonPropertyName("r2ConnectedDomainUrl")] + public string R2ConnectedDomainUrl { get; set; } = ""; + + [JsonPropertyName("r2ServiceUrl")] + public string R2ServiceUrl { get; set; } = ""; + + [JsonPropertyName("r2Bucketname")] + public string R2BucketName { get; set; } = ""; + + [JsonPropertyName("r2AccessKeyId")] + public string R2AccessKeyId { get; set; } = ""; + + [JsonPropertyName("r2SecretKeyId")] + public string R2SecretKeyId { get; set; } = ""; + [JsonPropertyName("sftpUploads")] public List SftpUploads { get; set; } = new(); @@ -114,6 +129,17 @@ namespace EftPatchHelper.Model return true; } + public bool UsingR2() + { + if (string.IsNullOrWhiteSpace(R2ConnectedDomainUrl)) return false; + if (string.IsNullOrWhiteSpace(R2ServiceUrl)) return false; + if (string.IsNullOrWhiteSpace(R2BucketName)) return false; + if (string.IsNullOrWhiteSpace(R2AccessKeyId)) return false; + if (string.IsNullOrWhiteSpace(R2SecretKeyId)) return false; + + return true; + } + public bool Validate() { if (string.IsNullOrWhiteSpace(TargetEftVersion)) return false; diff --git a/EftPatchHelper/EftPatchHelper/Tasks/CreateReleaseTasks.cs b/EftPatchHelper/EftPatchHelper/Tasks/CreateReleaseTasks.cs index e6583a0..c63f7a9 100644 --- a/EftPatchHelper/EftPatchHelper/Tasks/CreateReleaseTasks.cs +++ b/EftPatchHelper/EftPatchHelper/Tasks/CreateReleaseTasks.cs @@ -20,40 +20,50 @@ namespace EftPatchHelper.Tasks _options = options; } - private bool UploadAsset(FileInfo file, Release release, RepositoryApi repo) + private bool UploadMirrorList(FileInfo file) { - return AnsiConsole.Status().Spinner(Spinner.Known.Point).Start("Uploading Asset", (StatusContext context) => - { - AnsiConsole.MarkupLine($"[blue]Adding release asset: {file.Name.EscapeMarkup()}[/]"); + var r2Uplaod = new R2Upload(_settings.R2ConnectedDomainUrl, _settings.R2ServiceUrl, _settings.R2AccessKeyId, + _settings.R2SecretKeyId, _settings.R2BucketName); + + - file.Refresh(); - - if (!file.Exists) - { - AnsiConsole.MarkupLine($"[red]File does not exist: {file.FullName}[/]"); - } - - using var fileStream = file.OpenRead(); - - try - { - var attachment = repo.RepoCreateReleaseAttachment(_settings.GiteaReleaseRepoOwner, _settings.GiteaReleaseRepoName, release.Id, fileStream, file.Name); - - AnsiConsole.MarkupLine("[green]Upload Complete[/]"); - - return true; - } - catch (Exception ex) - { - AnsiConsole.MarkupLine("[red]Failed to upload asset[/]"); - - AnsiConsole.WriteException(ex); - - return false; - } - }); + return true; } + // private bool UploadAsset(FileInfo file, Release release, RepositoryApi repo) + // { + // return AnsiConsole.Status().Spinner(Spinner.Known.Point).Start("Uploading Asset", (StatusContext context) => + // { + // AnsiConsole.MarkupLine($"[blue]Adding release asset: {file.Name.EscapeMarkup()}[/]"); + // + // file.Refresh(); + // + // if (!file.Exists) + // { + // AnsiConsole.MarkupLine($"[red]File does not exist: {file.FullName}[/]"); + // } + // + // using var fileStream = file.OpenRead(); + // + // try + // { + // var attachment = repo.RepoCreateReleaseAttachment(_settings.GiteaReleaseRepoOwner, _settings.GiteaReleaseRepoName, release.Id, fileStream, file.Name); + // + // AnsiConsole.MarkupLine("[green]Upload Complete[/]"); + // + // return true; + // } + // catch (Exception ex) + // { + // AnsiConsole.MarkupLine("[red]Failed to upload asset[/]"); + // + // AnsiConsole.WriteException(ex); + // + // return false; + // } + // }); + // } + private Release? MakeRelease(RepositoryApi repo) { AnsiConsole.Write("Adding release to gitea ... "); @@ -111,7 +121,7 @@ namespace EftPatchHelper.Tasks var release = MakeRelease(repo).ValidateOrExit(); - UploadAsset(fileInfo, release, repo); + //UploadAsset(fileInfo, release, repo); } } } diff --git a/EftPatchHelper/EftPatchHelper/Tasks/StartupSettingsTask.cs b/EftPatchHelper/EftPatchHelper/Tasks/StartupSettingsTask.cs index d863c11..f2fc4d5 100644 --- a/EftPatchHelper/EftPatchHelper/Tasks/StartupSettingsTask.cs +++ b/EftPatchHelper/EftPatchHelper/Tasks/StartupSettingsTask.cs @@ -81,6 +81,11 @@ namespace EftPatchHelper.Tasks _options.UploadToGoFile = new ConfirmationPrompt("Upload to GoFile?").Show(AnsiConsole.Console); } + if (_settings.UsingR2()) + { + _options.UplaodToR2 = new ConfirmationPrompt("Upload to R2?").Show(AnsiConsole.Console); + } + if (_settings.SftpUploads.Count > 0) { _options.UploadToSftpSites = diff --git a/EftPatchHelper/EftPatchHelper/Tasks/UploadTasks.cs b/EftPatchHelper/EftPatchHelper/Tasks/UploadTasks.cs index fae6559..7eef6dc 100644 --- a/EftPatchHelper/EftPatchHelper/Tasks/UploadTasks.cs +++ b/EftPatchHelper/EftPatchHelper/Tasks/UploadTasks.cs @@ -48,6 +48,14 @@ namespace EftPatchHelper.Tasks AnsiConsole.WriteLine("Added GoFile"); } + if (_settings.UsingR2() && _options.UplaodToR2) + { + var r2 = new R2Upload(_settings.R2ConnectedDomainUrl, _settings.R2ServiceUrl, _settings.R2AccessKeyId, + _settings.R2SecretKeyId, _settings.R2BucketName); + _fileUploads.Add(r2); + AnsiConsole.WriteLine($"Added R2: {_settings.R2BucketName}"); + } + if (_settings.SftpUploads.Count > 0 && _options.UploadToSftpSites) { foreach (var sftpInfo in _settings.SftpUploads) From 67203037a1939ab9f7f2ab5e0637cca6467a85b0 Mon Sep 17 00:00:00 2001 From: "waffle.lord" Date: Thu, 2 May 2024 19:50:39 -0400 Subject: [PATCH 2/3] do the thing --- .../EftPatchHelper/EftPatchHelper.csproj | 7 +- .../EftPatchHelper/Helpers/R2Helper.cs | 90 ++++++++++--- ...{IReleaseCreator.cs => IMirrorUploader.cs} | 2 +- .../EftPatchHelper/Model/Options.cs | 10 +- .../EftPatchHelper/Model/R2Upload.cs | 47 ++----- .../EftPatchHelper/Model/ReleaseInfo.cs | 8 ++ .../EftPatchHelper/Model/ReleaseInfoMirror.cs | 7 + .../EftPatchHelper/Model/Settings.cs | 28 +--- .../EftPatchHelper/Model/SftpUpload.cs | 2 +- .../EftPatchHelper/Model/SftpUploadInfo.cs | 3 + EftPatchHelper/EftPatchHelper/Program.cs | 16 ++- .../Tasks/ClientSelectionTask.cs | 26 ++-- .../Tasks/CreateReleaseTasks.cs | 127 ------------------ .../Tasks/StartupSettingsTask.cs | 9 -- .../Tasks/UploadMirrorListTasks.cs | 64 +++++++++ .../EftPatchHelper/Tasks/UploadTasks.cs | 29 ++-- EftPatchHelper/EftPatchHelper/settings.json | 14 +- 17 files changed, 219 insertions(+), 270 deletions(-) rename EftPatchHelper/EftPatchHelper/Interfaces/{IReleaseCreator.cs => IMirrorUploader.cs} (77%) create mode 100644 EftPatchHelper/EftPatchHelper/Model/ReleaseInfo.cs create mode 100644 EftPatchHelper/EftPatchHelper/Model/ReleaseInfoMirror.cs delete mode 100644 EftPatchHelper/EftPatchHelper/Tasks/CreateReleaseTasks.cs create mode 100644 EftPatchHelper/EftPatchHelper/Tasks/UploadMirrorListTasks.cs diff --git a/EftPatchHelper/EftPatchHelper/EftPatchHelper.csproj b/EftPatchHelper/EftPatchHelper/EftPatchHelper.csproj index f639b28..2563e9b 100644 --- a/EftPatchHelper/EftPatchHelper/EftPatchHelper.csproj +++ b/EftPatchHelper/EftPatchHelper/EftPatchHelper.csproj @@ -5,8 +5,8 @@ net8.0 enable enable - 1.5.10 - 1.5.10 + 1.6.0 + 1.6.0 @@ -24,9 +24,6 @@ - - Resources\Gitea.dll - Resources\WinSCPnet.dll diff --git a/EftPatchHelper/EftPatchHelper/Helpers/R2Helper.cs b/EftPatchHelper/EftPatchHelper/Helpers/R2Helper.cs index 84674f3..1bffd65 100644 --- a/EftPatchHelper/EftPatchHelper/Helpers/R2Helper.cs +++ b/EftPatchHelper/EftPatchHelper/Helpers/R2Helper.cs @@ -1,6 +1,7 @@ using System.Net; using Amazon.Runtime; using Amazon.S3; +using Amazon.S3.Model; using EftPatchHelper.Model; using Spectre.Console; @@ -8,21 +9,21 @@ namespace EftPatchHelper.Helpers; public class R2Helper { - private readonly IAmazonS3? _client; - public bool IsReady => _client != null; - - private Settings _settings; + private readonly AmazonS3Client? _client; + public string ConnectedDomain { get; private set; } + public string BucketName { get; private set; } public R2Helper(Settings settings, Options options) { - _settings = settings; + ConnectedDomain = settings.R2ConnectedDomainUrl; + BucketName = settings.R2BucketName; - if (_settings.UsingR2() && options.UplaodToR2) + if (settings.UsingR2()) { - var creds = new BasicAWSCredentials(_settings.R2AccessKeyId, _settings.R2SecretKeyId); + var creds = new BasicAWSCredentials(settings.R2AccessKeyId, settings.R2SecretKeyId); _client = new AmazonS3Client(creds, new AmazonS3Config { - ServiceURL = _settings.R2ServiceUrl, + ServiceURL = settings.R2ServiceUrl, }); } } @@ -30,37 +31,86 @@ public class R2Helper /// /// Deletes all content in the bucket /// - /// + /// True if all contents of the bucket were deleted, otherwise false public async Task ClearBucketAsync() { - AnsiConsole.MarkupLine($"[blue]Getting bucket contents: {_settings.R2BucketName}[/]"); - var listBucketReponse = await _client.ListObjectsAsync(_settings.R2BucketName); + if (_client == null) + { + AnsiConsole.MarkupLine("[red]Client is unavailable[/]"); + return false; + } + + AnsiConsole.MarkupLine($"[blue]Getting bucket contents: {BucketName}[/]"); + var listBucketResponse = await _client.ListObjectsAsync(BucketName); - if (listBucketReponse.HttpStatusCode != HttpStatusCode.OK) + if (listBucketResponse.HttpStatusCode != HttpStatusCode.OK) { AnsiConsole.MarkupLine("[red]failed to get bucket contents[/]"); return false; } - AnsiConsole.MarkupLine("[blue]Removing old content"); - foreach (var s3Object in listBucketReponse.S3Objects) + AnsiConsole.MarkupLine("[blue]Removing old content[/]"); + foreach (var s3Object in listBucketResponse.S3Objects) { - var deleteRepsonse = await _client.DeleteObjectAsync(_settings.R2BucketName, s3Object.Key); + var deleteResponse = await _client.DeleteObjectAsync(BucketName, s3Object.Key); - if (deleteRepsonse.HttpStatusCode != HttpStatusCode.OK) + if (deleteResponse.HttpStatusCode != HttpStatusCode.OK) { - AnsiConsole.MarkupLine($"[red]failed to delete {_settings.R2BucketName}::{s3Object.Key}[/]"); + AnsiConsole.MarkupLine($"[red]failed to delete {BucketName}::{s3Object.Key}[/]"); return false; } - AnsiConsole.MarkupLine($"[green]{_settings.R2BucketName}::{s3Object.Key} removed[/]"); + AnsiConsole.MarkupLine($"[green]{BucketName}::{s3Object.Key} removed[/]"); } return true; } - public async Task UplaodToBucketAsync(FileInfo file, IProgress progress = null) + /// + /// Upload a file into the bucket + /// + /// The file to upload + /// A progress object to track upload progress + /// True if the file was uploaded successfully, otherwise false + public async Task UploadToBucketAsync(FileInfo file, IProgress? progress = null) { - // todo: this + if (_client == null) + { + AnsiConsole.MarkupLine("[red]Client is unavailable[/]"); + return false; + } + + file.Refresh(); + + if (!file.Exists) + { + AnsiConsole.MarkupLine($"[red]File '{file.Name}' does not exist[/]"); + return false; + } + + var request = new PutObjectRequest + { + BucketName = BucketName, + FilePath = file.FullName, + DisablePayloadSigning = true, + }; + + if (progress != null) + { + request.StreamTransferProgress = (sender, progressArgs) => + { + progress.Report(progressArgs.PercentDone); + }; + } + + var uploadResponse = await _client.PutObjectAsync(request); + + if (uploadResponse.HttpStatusCode != HttpStatusCode.OK) + { + AnsiConsole.MarkupLine("[red]failed to upload file[/]"); + return false; + } + + return true; } } \ No newline at end of file diff --git a/EftPatchHelper/EftPatchHelper/Interfaces/IReleaseCreator.cs b/EftPatchHelper/EftPatchHelper/Interfaces/IMirrorUploader.cs similarity index 77% rename from EftPatchHelper/EftPatchHelper/Interfaces/IReleaseCreator.cs rename to EftPatchHelper/EftPatchHelper/Interfaces/IMirrorUploader.cs index e412c5f..346588b 100644 --- a/EftPatchHelper/EftPatchHelper/Interfaces/IReleaseCreator.cs +++ b/EftPatchHelper/EftPatchHelper/Interfaces/IMirrorUploader.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace EftPatchHelper.Interfaces { - public interface IReleaseCreator : ITaskable + public interface IMirrorUploader : ITaskable { } } diff --git a/EftPatchHelper/EftPatchHelper/Model/Options.cs b/EftPatchHelper/EftPatchHelper/Model/Options.cs index 93d4b60..e8c8058 100644 --- a/EftPatchHelper/EftPatchHelper/Model/Options.cs +++ b/EftPatchHelper/EftPatchHelper/Model/Options.cs @@ -24,21 +24,19 @@ namespace EftPatchHelper.Model /// public string OutputPatchPath = null; - /// - /// Whether or not the user opted to create a release on gitea - /// - public bool CreateRelease = false; - /// /// Whether or not to upload the patcher to gofile.io /// public bool UploadToGoFile = false; /// - /// Whether or not to upload the pather to mega.io + /// Whether or not to upload the patcher to mega.io /// public bool UploadToMega = false; + /// + /// Whether or not to upload the patcher and mirror list to r2 + /// public bool UplaodToR2 = false; /// diff --git a/EftPatchHelper/EftPatchHelper/Model/R2Upload.cs b/EftPatchHelper/EftPatchHelper/Model/R2Upload.cs index 4339bc3..d5fdfc5 100644 --- a/EftPatchHelper/EftPatchHelper/Model/R2Upload.cs +++ b/EftPatchHelper/EftPatchHelper/Model/R2Upload.cs @@ -1,9 +1,5 @@ -using System.Net; -using Amazon.Runtime; -using Amazon.S3; -using Amazon.S3.Model; +using EftPatchHelper.Helpers; using EftPatchHelper.Interfaces; -using Spectre.Console; namespace EftPatchHelper.Model; @@ -15,48 +11,25 @@ public class R2Upload : IFileUpload public FileInfo UploadFileInfo { get; } public bool AddHubEntry { get; } - private readonly string _bucketName; - private readonly string _connectedDomainUrl; - private readonly IAmazonS3 _s3Client; + private readonly R2Helper _r2; - public R2Upload(string connectedDomainUrl, string serviceUrl, string accessKey, string secretKey, string bucketName) + public R2Upload(FileInfo file, R2Helper r2) { - _bucketName = bucketName; - _connectedDomainUrl = connectedDomainUrl; - - var creds = new BasicAWSCredentials(accessKey, secretKey); - _s3Client = new AmazonS3Client(creds, new AmazonS3Config - { - ServiceURL = serviceUrl, - }); - + _r2 = r2; + UploadFileInfo = file; + ServiceName = $"R2::{_r2.BucketName} Upload"; + DisplayName = $"{ServiceName} Upload"; + HubEntryText = $"Download from {ServiceName}"; AddHubEntry = false; } public string GetLink() { - return $"{_connectedDomainUrl}/{UploadFileInfo.Name}"; + return $"{_r2.ConnectedDomain}/{UploadFileInfo.Name}"; } public async Task UploadAsync(IProgress? progress = null) { - var uploadRequest = new PutObjectRequest - { - BucketName = _bucketName, - FilePath = UploadFileInfo.FullName, - DisablePayloadSigning = true, - }; - - if (progress != null) - { - uploadRequest.StreamTransferProgress = (sender, progressArgs) => - { - progress.Report(progressArgs.PercentDone); - }; - } - - var uploadResponse = await _s3Client.PutObjectAsync(uploadRequest); - - return uploadResponse.HttpStatusCode == HttpStatusCode.OK; + return await _r2.UploadToBucketAsync(UploadFileInfo, progress); } } \ No newline at end of file diff --git a/EftPatchHelper/EftPatchHelper/Model/ReleaseInfo.cs b/EftPatchHelper/EftPatchHelper/Model/ReleaseInfo.cs new file mode 100644 index 0000000..0cef86c --- /dev/null +++ b/EftPatchHelper/EftPatchHelper/Model/ReleaseInfo.cs @@ -0,0 +1,8 @@ +namespace EftPatchHelper.Model; + +public class ReleaseInfo +{ + public string AkiVersion { get; set; } + public string ClientVersion { get; set; } + public List Mirrors { get; set; } +} \ No newline at end of file diff --git a/EftPatchHelper/EftPatchHelper/Model/ReleaseInfoMirror.cs b/EftPatchHelper/EftPatchHelper/Model/ReleaseInfoMirror.cs new file mode 100644 index 0000000..f69b5f5 --- /dev/null +++ b/EftPatchHelper/EftPatchHelper/Model/ReleaseInfoMirror.cs @@ -0,0 +1,7 @@ +namespace EftPatchHelper.Model; + +public class ReleaseInfoMirror +{ + public string DownloadUrl { get; set; } + public string Hash { get; set; } +} \ No newline at end of file diff --git a/EftPatchHelper/EftPatchHelper/Model/Settings.cs b/EftPatchHelper/EftPatchHelper/Model/Settings.cs index 0750b4f..f21156d 100644 --- a/EftPatchHelper/EftPatchHelper/Model/Settings.cs +++ b/EftPatchHelper/EftPatchHelper/Model/Settings.cs @@ -30,17 +30,8 @@ namespace EftPatchHelper.Model [JsonPropertyName("patcherExePath")] public string PatcherEXEPath { get; set; } = ""; - [JsonPropertyName("giteaApiBasePath")] - public string GiteaApiBasePath { get; set; } = ""; - - [JsonPropertyName("giteaApiKey")] - public string GiteaApiKey { get; set; } = ""; - - [JsonPropertyName("giteaReleaseRepoOwner")] - public string GiteaReleaseRepoOwner { get; set; } = ""; - - [JsonPropertyName("giteaReleaseRepoName")] - public string GiteaReleaseRepoName { get; set; } = ""; + [JsonPropertyName("latestReleaseUrl")] + public string LatestReleaseUrl { get; set; } = ""; [JsonPropertyName("megaEmail")] public string MegaEmail { get; set; } = ""; @@ -63,7 +54,7 @@ namespace EftPatchHelper.Model [JsonPropertyName("r2ServiceUrl")] public string R2ServiceUrl { get; set; } = ""; - [JsonPropertyName("r2Bucketname")] + [JsonPropertyName("r2BucketName")] public string R2BucketName { get; set; } = ""; [JsonPropertyName("r2AccessKeyId")] @@ -98,19 +89,6 @@ namespace EftPatchHelper.Model } } - public bool UsingGitea() - { - if (string.IsNullOrWhiteSpace(GiteaApiBasePath)) return false; - - if (string.IsNullOrWhiteSpace(GiteaReleaseRepoOwner)) return false; - - if (string.IsNullOrWhiteSpace(GiteaReleaseRepoName)) return false; - - if (string.IsNullOrWhiteSpace(GiteaApiKey)) return false; - - return true; - } - public bool UsingMega() { if (string.IsNullOrWhiteSpace(MegaEmail)) return false; diff --git a/EftPatchHelper/EftPatchHelper/Model/SftpUpload.cs b/EftPatchHelper/EftPatchHelper/Model/SftpUpload.cs index 5e063da..b354f82 100644 --- a/EftPatchHelper/EftPatchHelper/Model/SftpUpload.cs +++ b/EftPatchHelper/EftPatchHelper/Model/SftpUpload.cs @@ -32,7 +32,7 @@ public class SftpUpload : IFileUpload ServiceName = _sftpInfo.Hostname; DisplayName = $"{ServiceName} Upload"; HubEntryText = $"Download from {ServiceName}"; - AddHubEntry = false; + AddHubEntry = sftpInfo.AllowHubEntry; } public string GetLink() diff --git a/EftPatchHelper/EftPatchHelper/Model/SftpUploadInfo.cs b/EftPatchHelper/EftPatchHelper/Model/SftpUploadInfo.cs index b9d8f9c..f3cbb45 100644 --- a/EftPatchHelper/EftPatchHelper/Model/SftpUploadInfo.cs +++ b/EftPatchHelper/EftPatchHelper/Model/SftpUploadInfo.cs @@ -25,6 +25,9 @@ public class SftpUploadInfo [JsonPropertyName("httpPath")] public string HttpPath { get; set; } = ""; + [JsonPropertyName("allowHubEntry")] + public bool AllowHubEntry { get; set; } = false; + public bool IsValid() { if (string.IsNullOrWhiteSpace(Username)) diff --git a/EftPatchHelper/EftPatchHelper/Program.cs b/EftPatchHelper/EftPatchHelper/Program.cs index 0df99de..0b6c1d7 100644 --- a/EftPatchHelper/EftPatchHelper/Program.cs +++ b/EftPatchHelper/EftPatchHelper/Program.cs @@ -20,9 +20,9 @@ namespace EftPatchHelper ITaskable _fileProcessingTasks; ITaskable _patchGenTasks; ITaskable _patchTestingTasks; - private ITaskable _compressPatcherTasks; - ITaskable _createReleaseTasks; + ITaskable _compressPatcherTasks; ITaskable _uploadTasks; + ITaskable _uploadMirrorList; public static void Main(string[] args) { @@ -48,7 +48,7 @@ namespace EftPatchHelper IPatchTestingTasks patchTestingTasks, ICompressPatcherTasks compressPatcherTasks, IUploadTasks uploadTasks, - IReleaseCreator createReleaseTasks + IMirrorUploader uploadMirrorList ) { _settingsTasks = settingsTasks; @@ -58,7 +58,7 @@ namespace EftPatchHelper _patchGenTasks = patchGenTasks; _patchTestingTasks = patchTestingTasks; _compressPatcherTasks = compressPatcherTasks; - _createReleaseTasks = createReleaseTasks; + _uploadMirrorList = uploadMirrorList; _uploadTasks = uploadTasks; } @@ -72,14 +72,17 @@ namespace EftPatchHelper _patchTestingTasks.Run(); _compressPatcherTasks.Run(); _uploadTasks.Run(); - _createReleaseTasks.Run(); + _uploadMirrorList.Run(); } private static IHost ConfigureHost(string[] args) { return Host.CreateDefaultBuilder(args).ConfigureServices((_, services) => { + HttpClient client = new HttpClient() { Timeout = TimeSpan.FromHours(1) }; + services.AddSingleton(); + services.AddSingleton(client); services.AddSingleton(serviceProvider => { var configuration = serviceProvider.GetRequiredService(); @@ -90,6 +93,7 @@ namespace EftPatchHelper services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); services.AddScoped(); @@ -100,8 +104,8 @@ namespace EftPatchHelper services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); }) .ConfigureAppConfiguration((_, config) => diff --git a/EftPatchHelper/EftPatchHelper/Tasks/ClientSelectionTask.cs b/EftPatchHelper/EftPatchHelper/Tasks/ClientSelectionTask.cs index 101491c..ca2f984 100644 --- a/EftPatchHelper/EftPatchHelper/Tasks/ClientSelectionTask.cs +++ b/EftPatchHelper/EftPatchHelper/Tasks/ClientSelectionTask.cs @@ -1,8 +1,8 @@ -using EftPatchHelper.Extensions; +using System.Net.Http.Json; +using EftPatchHelper.Extensions; using EftPatchHelper.Helpers; using EftPatchHelper.Interfaces; using EftPatchHelper.Model; -using Gitea.Api; using Spectre.Console; namespace EftPatchHelper.Tasks @@ -12,11 +12,13 @@ namespace EftPatchHelper.Tasks private Settings _settings; private Options _options; private EftClientSelector _clientSelector; + private HttpClient _http; - public ClientSelectionTask(Settings settings, Options options, EftClientSelector clientSelector) + public ClientSelectionTask(Settings settings, Options options, EftClientSelector clientSelector, HttpClient client) { _settings = settings; _options = options; + _http = client; _clientSelector = clientSelector; } @@ -58,22 +60,16 @@ namespace EftPatchHelper.Tasks private string GetCurrentReleaseVersion() { - if (!_settings.UsingGitea()) - return ""; - - return AnsiConsole.Status().Start("Starting...", ctx => + return AnsiConsole.Status().Start("Starting...", async ctx => { - RepositoryApi repo = new RepositoryApi(); - ctx.Spinner = Spinner.Known.Dots8; ctx.Status = "Getting latest release ..."; + + var blah = await _http.GetAsync(_settings.LatestReleaseUrl); + var release = await blah.Content.ReadFromJsonAsync(); - var releases = repo.RepoListReleases("SPT-AKI", "Stable-releases"); - - var release = releases.First(x => !x.Prerelease).Name.Split('(')[1]; - - return release.Remove(release.Length - 1); - }); + return release?.ClientVersion ?? "failed to get version :("; + }).GetAwaiter().GetResult(); } public void Run() diff --git a/EftPatchHelper/EftPatchHelper/Tasks/CreateReleaseTasks.cs b/EftPatchHelper/EftPatchHelper/Tasks/CreateReleaseTasks.cs deleted file mode 100644 index c63f7a9..0000000 --- a/EftPatchHelper/EftPatchHelper/Tasks/CreateReleaseTasks.cs +++ /dev/null @@ -1,127 +0,0 @@ -using EftPatchHelper.Interfaces; -using EftPatchHelper.Model; -using Gitea.Api; -using Gitea.Model; -using Gitea.Client; -using Spectre.Console; -using EftPatchHelper.Extensions; -using System.Text.Json; - -namespace EftPatchHelper.Tasks -{ - public class CreateReleaseTasks : IReleaseCreator - { - private Settings _settings; - private Options _options; - - public CreateReleaseTasks(Settings settings, Options options) - { - _settings = settings; - _options = options; - } - - private bool UploadMirrorList(FileInfo file) - { - var r2Uplaod = new R2Upload(_settings.R2ConnectedDomainUrl, _settings.R2ServiceUrl, _settings.R2AccessKeyId, - _settings.R2SecretKeyId, _settings.R2BucketName); - - - - return true; - } - - // private bool UploadAsset(FileInfo file, Release release, RepositoryApi repo) - // { - // return AnsiConsole.Status().Spinner(Spinner.Known.Point).Start("Uploading Asset", (StatusContext context) => - // { - // AnsiConsole.MarkupLine($"[blue]Adding release asset: {file.Name.EscapeMarkup()}[/]"); - // - // file.Refresh(); - // - // if (!file.Exists) - // { - // AnsiConsole.MarkupLine($"[red]File does not exist: {file.FullName}[/]"); - // } - // - // using var fileStream = file.OpenRead(); - // - // try - // { - // var attachment = repo.RepoCreateReleaseAttachment(_settings.GiteaReleaseRepoOwner, _settings.GiteaReleaseRepoName, release.Id, fileStream, file.Name); - // - // AnsiConsole.MarkupLine("[green]Upload Complete[/]"); - // - // return true; - // } - // catch (Exception ex) - // { - // AnsiConsole.MarkupLine("[red]Failed to upload asset[/]"); - // - // AnsiConsole.WriteException(ex); - // - // return false; - // } - // }); - // } - - private Release? MakeRelease(RepositoryApi repo) - { - AnsiConsole.Write("Adding release to gitea ... "); - - string sourceTail = _options.SourceClient.Version.Split('.').Last(); - - string targetTail = _options.TargetClient.Version.Split('.').Last(); - - string releaseName = $"{sourceTail} to {targetTail}"; - - string tag = $"{sourceTail}_{new Random().Next(100, 999)}"; - - try - { - var release = repo.RepoCreateRelease(_settings.GiteaReleaseRepoOwner, _settings.GiteaReleaseRepoName, new CreateReleaseOption(null, false, releaseName, false, tag, null)); - - AnsiConsole.MarkupLine($"[green]Release added: {release.Name.EscapeMarkup()}[/]"); - - return release; - } - catch(Exception ex) - { - AnsiConsole.MarkupLine($"[red]Failed to create release[/]"); - - AnsiConsole.WriteException(ex); - - return null; - } - } - - public bool CreateMirrorList(FileInfo mirrorListFileInfo) - { - List mirrors = _options.MirrorList.Values.ToList(); - - string json = JsonSerializer.Serialize(mirrors, new JsonSerializerOptions() { WriteIndented = true }); - - File.WriteAllText(mirrorListFileInfo.FullName, json); - - mirrorListFileInfo.Refresh(); - - return mirrorListFileInfo.Exists; - } - - public void Run() - { - AnsiConsole.WriteLine(); - - var fileInfo = new FileInfo(Path.Join(Environment.CurrentDirectory, "mirrors.json")); - - CreateMirrorList(fileInfo); - - if (!_options.CreateRelease) return; - - var repo = new RepositoryApi(Configuration.Default); - - var release = MakeRelease(repo).ValidateOrExit(); - - //UploadAsset(fileInfo, release, repo); - } - } -} diff --git a/EftPatchHelper/EftPatchHelper/Tasks/StartupSettingsTask.cs b/EftPatchHelper/EftPatchHelper/Tasks/StartupSettingsTask.cs index f2fc4d5..50beab4 100644 --- a/EftPatchHelper/EftPatchHelper/Tasks/StartupSettingsTask.cs +++ b/EftPatchHelper/EftPatchHelper/Tasks/StartupSettingsTask.cs @@ -1,7 +1,6 @@ using EftPatchHelper.Extensions; using EftPatchHelper.Interfaces; using EftPatchHelper.Model; -using Gitea.Client; using Spectre.Console; namespace EftPatchHelper.Tasks @@ -63,14 +62,6 @@ namespace EftPatchHelper.Tasks { _options.IgnoreExistingDirectories = new ConfirmationPrompt("Skip existing directories? (you will be prompted if no)").Show(AnsiConsole.Console); - if (_settings.UsingGitea()) - { - Configuration.Default.BasePath = _settings.GiteaApiBasePath; - Configuration.Default.AddApiKey("token", _settings.GiteaApiKey); - - _options.CreateRelease = new ConfirmationPrompt("Create a release on gitea?").Show(AnsiConsole.Console); - } - if (_settings.UsingMega()) { _options.UploadToMega = new ConfirmationPrompt("Upload to Mega?").Show(AnsiConsole.Console); diff --git a/EftPatchHelper/EftPatchHelper/Tasks/UploadMirrorListTasks.cs b/EftPatchHelper/EftPatchHelper/Tasks/UploadMirrorListTasks.cs new file mode 100644 index 0000000..af2c9b2 --- /dev/null +++ b/EftPatchHelper/EftPatchHelper/Tasks/UploadMirrorListTasks.cs @@ -0,0 +1,64 @@ +using EftPatchHelper.Interfaces; +using EftPatchHelper.Model; +using Spectre.Console; +using System.Text.Json; +using EftPatchHelper.Helpers; + +namespace EftPatchHelper.Tasks +{ + public class UploadMirrorListTasks : IMirrorUploader + { + private Options _options; + private R2Helper _r2; + + public UploadMirrorListTasks(Options options, R2Helper r2) + { + _options = options; + _r2 = r2; + } + + private async Task UploadMirrorList(FileInfo file) + { + return await AnsiConsole.Progress().Columns(new ProgressColumn[] + { + new TaskDescriptionColumn() { Alignment = Justify.Left }, + new ProgressBarColumn(), + new PercentageColumn(), + new RemainingTimeColumn(), + new SpinnerColumn(Spinner.Known.Dots2), + }) + .StartAsync(async ctx => + { + var uploadTask = ctx.AddTask("mirrors.json upload"); + + var progress = new Progress((p) => { uploadTask.Value = p; }); + + return await _r2.UploadToBucketAsync(file, progress); + }); + } + + public bool CreateMirrorList(FileInfo mirrorListFileInfo) + { + List mirrors = _options.MirrorList.Values.ToList(); + + string json = JsonSerializer.Serialize(mirrors, new JsonSerializerOptions() { WriteIndented = true }); + + File.WriteAllText(mirrorListFileInfo.FullName, json); + + mirrorListFileInfo.Refresh(); + + return mirrorListFileInfo.Exists; + } + + public void Run() + { + AnsiConsole.WriteLine(); + + var fileInfo = new FileInfo(Path.Join(Environment.CurrentDirectory, "mirrors.json")); + + CreateMirrorList(fileInfo); + + UploadMirrorList(fileInfo).GetAwaiter().GetResult(); + } + } +} diff --git a/EftPatchHelper/EftPatchHelper/Tasks/UploadTasks.cs b/EftPatchHelper/EftPatchHelper/Tasks/UploadTasks.cs index 7eef6dc..c718f08 100644 --- a/EftPatchHelper/EftPatchHelper/Tasks/UploadTasks.cs +++ b/EftPatchHelper/EftPatchHelper/Tasks/UploadTasks.cs @@ -3,20 +3,23 @@ using EftPatchHelper.Interfaces; using EftPatchHelper.Model; using Spectre.Console; using System.Security.Cryptography; +using EftPatchHelper.Helpers; namespace EftPatchHelper.Tasks { public class UploadTasks : IUploadTasks { - private Options _options; - private Settings _settings; - private List _fileUploads = new List(); - private Dictionary uploadTasks = new Dictionary(); + private readonly Options _options; + private readonly Settings _settings; + private readonly R2Helper _r2; + private readonly List _fileUploads = new(); + private readonly Dictionary _uploadTasks = new(); - public UploadTasks(Options options, Settings settings) + public UploadTasks(Options options, Settings settings, R2Helper r2) { _options = options; _settings = settings; + _r2 = r2; } private static string GetFileHash(FileInfo file) @@ -50,10 +53,14 @@ namespace EftPatchHelper.Tasks if (_settings.UsingR2() && _options.UplaodToR2) { - var r2 = new R2Upload(_settings.R2ConnectedDomainUrl, _settings.R2ServiceUrl, _settings.R2AccessKeyId, - _settings.R2SecretKeyId, _settings.R2BucketName); + if (!await _r2.ClearBucketAsync()) + { + return false; + } + + var r2 = new R2Upload(patcherFile, _r2); _fileUploads.Add(r2); - AnsiConsole.WriteLine($"Added R2: {_settings.R2BucketName}"); + AnsiConsole.WriteLine($"Added R2::{_r2.BucketName}"); } if (_settings.SftpUploads.Count > 0 && _options.UploadToSftpSites) @@ -157,10 +164,10 @@ namespace EftPatchHelper.Tasks { var task = context.AddTask($"[purple][[Pending]][/] {file.DisplayName} - [blue]{BytesToString(file.UploadFileInfo.Length)}[/]"); task.IsIndeterminate = true; - uploadTasks.Add(file, task); + _uploadTasks.Add(file, task); } - foreach(var pair in uploadTasks) + foreach(var pair in _uploadTasks) { // set the value of the progress task object var progress = new System.Progress((d) => pair.Value.Value = d); @@ -193,7 +200,7 @@ namespace EftPatchHelper.Tasks public void Run() { - if (!_options.UploadToGoFile && !_options.UploadToMega && !_options.UploadToSftpSites) return; + if (!_options.UploadToGoFile && !_options.UploadToMega && !_options.UploadToSftpSites && !_options.UplaodToR2) return; UploadAllFiles().GetAwaiter().GetResult().ValidateOrExit(); diff --git a/EftPatchHelper/EftPatchHelper/settings.json b/EftPatchHelper/EftPatchHelper/settings.json index 949f118..8004952 100644 --- a/EftPatchHelper/EftPatchHelper/settings.json +++ b/EftPatchHelper/EftPatchHelper/settings.json @@ -6,15 +6,17 @@ "patcherExePath": "", "autoZip": true, "autoClose": false, - "giteaApiBasePath": "", //You can leave the gitea settings blank if you don't need to create releases on gitea - "giteaApiKey": "", - "giteaReleaseRepoOwner": "", - "giteaReleaseRepoName": "", + "latestReleaseUrl": "", "megaEmail": "", "megaPassword": "", "megaUploadFolder": "", "goFileApiKey": "", "goFileFolderId": "", + "r2ConnectedDomainUrl": "", + "r2ServiceUrl": "", + "r2BucketName": "", + "r2AccessKeyId": "", + "r2SecretKeyId": "", "sftpUploads": [ { "username": "example-remove-before-using", @@ -26,6 +28,4 @@ "httpPath": "https://mirror.slugma-ligma.com/patchers" } ] -} - - +} \ No newline at end of file From d9d8f4980880c661aaacefb8e45ee4a642ab952a Mon Sep 17 00:00:00 2001 From: "waffle.lord" Date: Sat, 4 May 2024 10:48:45 -0400 Subject: [PATCH 3/3] add check to mirror upload --- .../EftPatchHelper/Tasks/UploadMirrorListTasks.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/EftPatchHelper/EftPatchHelper/Tasks/UploadMirrorListTasks.cs b/EftPatchHelper/EftPatchHelper/Tasks/UploadMirrorListTasks.cs index af2c9b2..37897cf 100644 --- a/EftPatchHelper/EftPatchHelper/Tasks/UploadMirrorListTasks.cs +++ b/EftPatchHelper/EftPatchHelper/Tasks/UploadMirrorListTasks.cs @@ -8,11 +8,13 @@ namespace EftPatchHelper.Tasks { public class UploadMirrorListTasks : IMirrorUploader { + private Settings _settings; private Options _options; private R2Helper _r2; - public UploadMirrorListTasks(Options options, R2Helper r2) + public UploadMirrorListTasks(Settings settigns, Options options, R2Helper r2) { + _settings = settigns; _options = options; _r2 = r2; } @@ -52,6 +54,11 @@ namespace EftPatchHelper.Tasks public void Run() { + if (!_settings.UsingR2() || !_options.UplaodToR2) + { + return; + } + AnsiConsole.WriteLine(); var fileInfo = new FileInfo(Path.Join(Environment.CurrentDirectory, "mirrors.json"));