diff --git a/ModpackUpdater.Apps.Manager/Features/SharedFunctions.cs b/ModpackUpdater.Apps.Manager/Features/SharedFunctions.cs index 78ab203..b0352ce 100644 --- a/ModpackUpdater.Apps.Manager/Features/SharedFunctions.cs +++ b/ModpackUpdater.Apps.Manager/Features/SharedFunctions.cs @@ -6,7 +6,6 @@ using ModpackUpdater.Apps.Manager.Ui; using ModpackUpdater.Apps.Manager.Ui.Models.MainWindow; using ModpackUpdater.Apps.Manager.Ui.Models.UpdatesCollectorViewMode; using ModpackUpdater.Manager; -using MsBox.Avalonia; using OfficeOpenXml; using OfficeOpenXml.Table; using Pilz.UI.AvaloniaUI.Dialogs; @@ -39,7 +38,7 @@ internal static class SharedFunctions var result = await factory.ResolveSourceUrl(row.Action); failed = string.IsNullOrWhiteSpace(result); } - catch (Exception ex) + catch { // Ignore } @@ -65,12 +64,12 @@ internal static class SharedFunctions return false; // Collect versions with changes - var updates = resultUpdates.List.Where(update => update.Origin.SourceTag != update.AvailableVersions[update.NewVersion].Key).ToList(); + var updates = resultUpdates.List.Where(update => update.Origin.SourceTag != update.AvailableVersions[update.NewVersion].Tag).ToList(); // Path install actions foreach (var update in updates) { - var sourceTag = update.AvailableVersions[update.NewVersion].Key; + var sourceTag = update.AvailableVersions[update.NewVersion].Tag; if (api.Model.CurrentGridRows?.FirstOrDefault(n => n.Action == update.Origin) is { } row) row.SourceTag = sourceTag; else diff --git a/ModpackUpdater.Apps.Manager/Ui/Models/UpdatesCollectorViewMode/ModUpdateInfo.cs b/ModpackUpdater.Apps.Manager/Ui/Models/UpdatesCollectorViewMode/ModUpdateInfo.cs index 99b70be..a77c5e2 100644 --- a/ModpackUpdater.Apps.Manager/Ui/Models/UpdatesCollectorViewMode/ModUpdateInfo.cs +++ b/ModpackUpdater.Apps.Manager/Ui/Models/UpdatesCollectorViewMode/ModUpdateInfo.cs @@ -1,18 +1,30 @@ using System.ComponentModel; +using ModpackUpdater.Manager; namespace ModpackUpdater.Apps.Manager.Ui.Models.UpdatesCollectorViewMode; -public record ModUpdateInfo(KeyValuePair[] AvailableVersions, InstallAction Origin) : INotifyPropertyChanged +public record ModUpdateInfo(ModVersionInfo[] AvailableVersions, InstallAction Origin) : INotifyPropertyChanged { public event PropertyChangedEventHandler? PropertyChanged; public int NewVersion { get; set; } public bool Visible { get; set; } = true; + + public string? OldVersion + { + get + { + if (AvailableVersions.FirstOrDefault(n => n.Tag.Equals(Origin.SourceTag)) is { } old + && !old.Name.Equals(old.Tag, StringComparison.InvariantCulture)) + return $"{old.Name} ({old.Tag})"; + return Origin.SourceTag; + } + } public IEnumerable DisplayVersions { get; } = AvailableVersions.Select(n => { - if (string.IsNullOrWhiteSpace(n.Value) || n.Value.Equals(n.Key, StringComparison.InvariantCulture)) - return n.Key; - return $"{n.Value} ({n.Value})"; + if (string.IsNullOrWhiteSpace(n.Tag) || n.Tag.Equals(n.Name, StringComparison.InvariantCulture)) + return n.Name; + return $"{n.Name} ({n.Tag})"; }); } \ No newline at end of file diff --git a/ModpackUpdater.Apps.Manager/Ui/UpdatesCollectorView.axaml b/ModpackUpdater.Apps.Manager/Ui/UpdatesCollectorView.axaml index c95f240..e0d3986 100644 --- a/ModpackUpdater.Apps.Manager/Ui/UpdatesCollectorView.axaml +++ b/ModpackUpdater.Apps.Manager/Ui/UpdatesCollectorView.axaml @@ -56,7 +56,7 @@ + Text="{Binding OldVersion}"/> ResolveSourceUrl(InstallAction action, Version? targetVersion = null, string? overwriteVersion = null) { - if (action.SourceType == SourceType.GitHub) + switch (action.SourceType) { - var repo = await github.Repository.Get(action.SourceOwner, action.SourceName); - var release = await github.Repository.Release.Get(repo.Id, action.SourceTag); - var assets = await github.Repository.Release.GetAllAssets(repo.Id, release.Id); + case SourceType.GitHub: + { + var repo = await github.Repository.Get(action.SourceOwner, action.SourceName); + var release = await github.Repository.Release.Get(repo.Id, action.SourceTag); + var assets = await github.Repository.Release.GetAllAssets(repo.Id, release.Id); - if (assets.LastOrDefault(asset => Regex.IsMatch(asset.Name, action.SourceRegex)) is ReleaseAsset asset) - return asset.BrowserDownloadUrl; - } - else if (action.SourceType == SourceType.GitLab) - { - throw new NotImplementedException("To be implemented soon."); - } - else if (action.SourceType == SourceType.CurseForge) - { - var res = await curseForge.GetModFileDownloadUrlAsync(Convert.ToInt32(action.SourceName), Convert.ToInt32(action.SourceTag)); - if (!string.IsNullOrWhiteSpace(res.Data)) - return res.Data; - } - else if (action.SourceType == SourceType.Modrinth) - { - var res = await modrinth.VersionFile.GetVersionByHashAsync(action.SourceTag); - var file = res.Files.Length == 1 ? res.Files[0] : res.Files.FirstOrDefault(n => Regex.IsMatch(n.FileName, action.SourceRegex)); - if (file != null) - return file.Url; + if (assets.LastOrDefault(a => Regex.IsMatch(a.Name, action.SourceRegex)) is ReleaseAsset asset) + return asset.BrowserDownloadUrl; + break; + } + case SourceType.GitLab: + throw new NotSupportedException("To be implemented soon."); + case SourceType.CurseForge: + { + var res = await curseForge.GetModFileDownloadUrlAsync(Convert.ToInt32(action.SourceName), Convert.ToInt32(action.SourceTag)); + if (!string.IsNullOrWhiteSpace(res.Data)) + return res.Data; + break; + } + case SourceType.Modrinth: + { + var res = await modrinth.VersionFile.GetVersionByHashAsync(action.SourceTag); + var file = res.Files.Length == 1 ? res.Files[0] : res.Files.FirstOrDefault(n => Regex.IsMatch(n.FileName, action.SourceRegex)); + if (file != null) + return file.Url; + break; + } } return action.GetSourceUrl(targetVersion, overwriteVersion: overwriteVersion); } - public async Task[]?> FindUpdates(InstallAction action, string? gameVersion, ModLoader modLoader) + public async Task FindUpdates(InstallAction action, string? gameVersion, ModLoader modLoader) { switch (action.SourceType) { @@ -65,7 +70,7 @@ public class ModpackFactory { var repo = await github.Repository.Get(action.SourceOwner, action.SourceName); var releases = await github.Repository.Release.GetAll(repo.Id); - return releases.Select(r => new KeyValuePair(r.TagName, r.Name ?? r.TagName)).ToArray(); + return releases.Select(r => new ModVersionInfo(r.TagName, r.Name ?? r.TagName)).ToArray(); } catch { @@ -73,18 +78,18 @@ public class ModpackFactory } break; case SourceType.GitLab: - throw new NotImplementedException("To be implemented soon."); + throw new NotSupportedException("To be implemented soon."); case SourceType.CurseForge: { var res = await curseForge.GetModFilesAsync(Convert.ToInt32(action.SourceName), gameVersion: gameVersion, modLoaderType: GetModLoaderForCurseForge(modLoader)); if (res.Data != null) - return res.Data.Select(n => new KeyValuePair(n.DisplayName, n.Id.ToString())).ToArray(); + return res.Data.Select(n => new ModVersionInfo(n.DisplayName, n.Id.ToString())).ToArray(); break; } case SourceType.Modrinth: { var res = await modrinth.Version.GetProjectVersionListAsync(action.SourceName, gameVersions: GetGameVersionForModrinth(gameVersion), loaders: GetModLoaderForModrinth(modLoader)); - return res.Select(v => new KeyValuePair($"{v.VersionNumber} {v.ProjectVersionType} {v.Name}", v.Id)).ToArray(); + return res.Select(v => new ModVersionInfo(v.VersionNumber, v.Id)).ToArray(); } } return null; @@ -116,7 +121,7 @@ public class ModpackFactory ModLoader.LiteLoader => ["liteloader"], ModLoader.Cauldron => ["cauldron"], ModLoader.Quilt => ["quilt"], - _ => null, + _ => [], }; }