diff --git a/EftPatchHelper/EftPatchHelper/EftPatchHelper.csproj b/EftPatchHelper/EftPatchHelper/EftPatchHelper.csproj index f808002..2563e9b 100644 --- a/EftPatchHelper/EftPatchHelper/EftPatchHelper.csproj +++ b/EftPatchHelper/EftPatchHelper/EftPatchHelper.csproj @@ -5,11 +5,12 @@ net8.0 enable enable - 1.5.10 - 1.5.10 + 1.6.0 + 1.6.0 + @@ -23,9 +24,6 @@ - - Resources\Gitea.dll - Resources\WinSCPnet.dll diff --git a/EftPatchHelper/EftPatchHelper/Helpers/R2Helper.cs b/EftPatchHelper/EftPatchHelper/Helpers/R2Helper.cs new file mode 100644 index 0000000..1bffd65 --- /dev/null +++ b/EftPatchHelper/EftPatchHelper/Helpers/R2Helper.cs @@ -0,0 +1,116 @@ +using System.Net; +using Amazon.Runtime; +using Amazon.S3; +using Amazon.S3.Model; +using EftPatchHelper.Model; +using Spectre.Console; + +namespace EftPatchHelper.Helpers; + +public class R2Helper +{ + private readonly AmazonS3Client? _client; + public string ConnectedDomain { get; private set; } + public string BucketName { get; private set; } + + public R2Helper(Settings settings, Options options) + { + ConnectedDomain = settings.R2ConnectedDomainUrl; + BucketName = settings.R2BucketName; + + if (settings.UsingR2()) + { + var creds = new BasicAWSCredentials(settings.R2AccessKeyId, settings.R2SecretKeyId); + _client = new AmazonS3Client(creds, new AmazonS3Config + { + ServiceURL = settings.R2ServiceUrl, + }); + } + } + + /// + /// Deletes all content in the bucket + /// + /// True if all contents of the bucket were deleted, otherwise false + public async Task ClearBucketAsync() + { + 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 (listBucketResponse.HttpStatusCode != HttpStatusCode.OK) + { + AnsiConsole.MarkupLine("[red]failed to get bucket contents[/]"); + return false; + } + + AnsiConsole.MarkupLine("[blue]Removing old content[/]"); + foreach (var s3Object in listBucketResponse.S3Objects) + { + var deleteResponse = await _client.DeleteObjectAsync(BucketName, s3Object.Key); + + if (deleteResponse.HttpStatusCode != HttpStatusCode.OK) + { + AnsiConsole.MarkupLine($"[red]failed to delete {BucketName}::{s3Object.Key}[/]"); + return false; + } + + AnsiConsole.MarkupLine($"[green]{BucketName}::{s3Object.Key} removed[/]"); + } + + return true; + } + + /// + /// 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) + { + 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 8f61a80..e8c8058 100644 --- a/EftPatchHelper/EftPatchHelper/Model/Options.cs +++ b/EftPatchHelper/EftPatchHelper/Model/Options.cs @@ -24,21 +24,21 @@ 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; + /// /// 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..d5fdfc5 --- /dev/null +++ b/EftPatchHelper/EftPatchHelper/Model/R2Upload.cs @@ -0,0 +1,35 @@ +using EftPatchHelper.Helpers; +using EftPatchHelper.Interfaces; + +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 R2Helper _r2; + + public R2Upload(FileInfo file, R2Helper r2) + { + _r2 = r2; + UploadFileInfo = file; + ServiceName = $"R2::{_r2.BucketName} Upload"; + DisplayName = $"{ServiceName} Upload"; + HubEntryText = $"Download from {ServiceName}"; + AddHubEntry = false; + } + + public string GetLink() + { + return $"{_r2.ConnectedDomain}/{UploadFileInfo.Name}"; + } + + public async Task UploadAsync(IProgress? progress = null) + { + 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 0c24b4c..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; } = ""; @@ -57,6 +48,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(); @@ -83,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; @@ -114,6 +107,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/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 e6583a0..0000000 --- a/EftPatchHelper/EftPatchHelper/Tasks/CreateReleaseTasks.cs +++ /dev/null @@ -1,117 +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 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 d863c11..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); @@ -81,6 +72,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/UploadMirrorListTasks.cs b/EftPatchHelper/EftPatchHelper/Tasks/UploadMirrorListTasks.cs new file mode 100644 index 0000000..37897cf --- /dev/null +++ b/EftPatchHelper/EftPatchHelper/Tasks/UploadMirrorListTasks.cs @@ -0,0 +1,71 @@ +using EftPatchHelper.Interfaces; +using EftPatchHelper.Model; +using Spectre.Console; +using System.Text.Json; +using EftPatchHelper.Helpers; + +namespace EftPatchHelper.Tasks +{ + public class UploadMirrorListTasks : IMirrorUploader + { + private Settings _settings; + private Options _options; + private R2Helper _r2; + + public UploadMirrorListTasks(Settings settigns, Options options, R2Helper r2) + { + _settings = settigns; + _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() + { + if (!_settings.UsingR2() || !_options.UplaodToR2) + { + return; + } + + 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 fae6559..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) @@ -48,6 +51,18 @@ namespace EftPatchHelper.Tasks AnsiConsole.WriteLine("Added GoFile"); } + if (_settings.UsingR2() && _options.UplaodToR2) + { + if (!await _r2.ClearBucketAsync()) + { + return false; + } + + var r2 = new R2Upload(patcherFile, _r2); + _fileUploads.Add(r2); + AnsiConsole.WriteLine($"Added R2::{_r2.BucketName}"); + } + if (_settings.SftpUploads.Count > 0 && _options.UploadToSftpSites) { foreach (var sftpInfo in _settings.SftpUploads) @@ -149,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); @@ -185,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