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