diff --git a/Lantean.QBTMud.Test/Lantean.QBTMud.Test.csproj b/Lantean.QBTMud.Test/Lantean.QBTMud.Test.csproj index d7c594f..a91356f 100644 --- a/Lantean.QBTMud.Test/Lantean.QBTMud.Test.csproj +++ b/Lantean.QBTMud.Test/Lantean.QBTMud.Test.csproj @@ -10,18 +10,14 @@ - - - - - + + - + all runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Lantean.QBTMud/Components/TorrentActions.razor.cs b/Lantean.QBTMud/Components/TorrentActions.razor.cs index 8556340..e0d24a5 100644 --- a/Lantean.QBTMud/Components/TorrentActions.razor.cs +++ b/Lantean.QBTMud/Components/TorrentActions.razor.cs @@ -12,10 +12,7 @@ namespace Lantean.QBTMud.Components { public partial class TorrentActions : IAsyncDisposable { - private const int _defaultVersion = 5; - private bool _disposedValue; - private int? _version; private List? _actions; @@ -74,30 +71,7 @@ namespace Lantean.QBTMud.Components protected bool OverlayVisible { get; set; } - protected int MajorVersion - { - get - { - if (_version is not null) - { - return _version.Value; - } - - if (string.IsNullOrEmpty(Version)) - { - return _defaultVersion; - } - - if (!System.Version.TryParse(Version.Replace("v", ""), out var version)) - { - return _defaultVersion; - } - - _version = version.Major; - - return _version.Value; - } - } + protected int MajorVersion => VersionHelper.GetMajorVersion(Version); protected override void OnInitialized() { diff --git a/Lantean.QBTMud/Helpers/VersionHelper.cs b/Lantean.QBTMud/Helpers/VersionHelper.cs new file mode 100644 index 0000000..e4a1730 --- /dev/null +++ b/Lantean.QBTMud/Helpers/VersionHelper.cs @@ -0,0 +1,34 @@ + +namespace Lantean.QBTMud.Helpers +{ + internal static class VersionHelper + { + private static int? _version; + + private const int _defaultVersion = 5; + + public static int DefaultVersion => _defaultVersion; + + public static int GetMajorVersion(string? version) + { + if (_version is not null) + { + return _version.Value; + } + + if (string.IsNullOrEmpty(version)) + { + return _defaultVersion; + } + + if (!Version.TryParse(version?.Replace("v", ""), out var theVersion)) + { + return _defaultVersion; + } + + _version = theVersion.Major; + + return _version.Value; + } + } +} diff --git a/Lantean.QBTMud/Lantean.QBTMud.csproj b/Lantean.QBTMud/Lantean.QBTMud.csproj index 31e46f3..b6517ca 100644 --- a/Lantean.QBTMud/Lantean.QBTMud.csproj +++ b/Lantean.QBTMud/Lantean.QBTMud.csproj @@ -12,13 +12,13 @@ - - - - + + + + - + diff --git a/Lantean.QBTMud/Layout/LoggedInLayout.razor.cs b/Lantean.QBTMud/Layout/LoggedInLayout.razor.cs index cad0081..b340abe 100644 --- a/Lantean.QBTMud/Layout/LoggedInLayout.razor.cs +++ b/Lantean.QBTMud/Layout/LoggedInLayout.razor.cs @@ -83,7 +83,7 @@ namespace Lantean.QBTMud.Layout Preferences = await ApiClient.GetApplicationPreferences(); Version = await ApiClient.GetApplicationVersion(); var data = await ApiClient.GetMainData(_requestId); - MainData = DataManager.CreateMainData(data); + MainData = DataManager.CreateMainData(data, Version); _requestId = data.ResponseId; _refreshInterval = MainData.ServerState.RefreshInterval; @@ -128,7 +128,7 @@ namespace Lantean.QBTMud.Layout if (MainData is null || data.FullUpdate) { - MainData = DataManager.CreateMainData(data); + MainData = DataManager.CreateMainData(data, Version); } else { diff --git a/Lantean.QBTMud/Models/MainData.cs b/Lantean.QBTMud/Models/MainData.cs index 444b1da..91e11af 100644 --- a/Lantean.QBTMud/Models/MainData.cs +++ b/Lantean.QBTMud/Models/MainData.cs @@ -11,7 +11,8 @@ Dictionary> tagState, Dictionary> categoriesState, Dictionary> statusState, - Dictionary> trackersState) + Dictionary> trackersState, + int majorVersion) { Torrents = torrents.ToDictionary(); Tags = tags.ToHashSet(); @@ -22,6 +23,7 @@ CategoriesState = categoriesState; StatusState = statusState; TrackersState = trackersState; + MajorVersion = majorVersion; } public Dictionary Torrents { get; } @@ -36,5 +38,6 @@ public Dictionary> TrackersState { get; } public string? SelectedTorrentHash { get; set; } public bool LostConnection { get; set; } + public int MajorVersion { get; } } } \ No newline at end of file diff --git a/Lantean.QBTMud/Models/Status.cs b/Lantean.QBTMud/Models/Status.cs index 55e66e4..9be29be 100644 --- a/Lantean.QBTMud/Models/Status.cs +++ b/Lantean.QBTMud/Models/Status.cs @@ -8,6 +8,7 @@ Completed, Resumed, Paused, + Stopped, Active, Inactive, Stalled, @@ -15,6 +16,6 @@ StalledDownloading, Checking, Errored, - Stopped + } } \ No newline at end of file diff --git a/Lantean.QBTMud/Services/DataManager.cs b/Lantean.QBTMud/Services/DataManager.cs index 0401e22..7a5e8aa 100644 --- a/Lantean.QBTMud/Services/DataManager.cs +++ b/Lantean.QBTMud/Services/DataManager.cs @@ -5,7 +5,7 @@ namespace Lantean.QBTMud.Services { public class DataManager : IDataManager { - private static readonly Status[] _statuses = Enum.GetValues(); + private static Status[]? _statusArray = null; public PeerList CreatePeerList(QBitTorrentClient.Models.TorrentPeers torrentPeers) { @@ -25,8 +25,9 @@ namespace Lantean.QBTMud.Services return peerList; } - public MainData CreateMainData(QBitTorrentClient.Models.MainData mainData) + public MainData CreateMainData(QBitTorrentClient.Models.MainData mainData, string version) { + var majorVersion = VersionHelper.GetMajorVersion(version); var torrents = new Dictionary(mainData.Torrents?.Count ?? 0); if (mainData.Torrents is not null) { @@ -87,8 +88,9 @@ namespace Lantean.QBTMud.Services categoriesState.Add(category, torrents.Values.Where(t => FilterHelper.FilterCategory(t, category, serverState.UseSubcategories)).ToHashesHashSet()); } - var statusState = new Dictionary>(_statuses.Length + 2); - foreach (var status in _statuses) + var statuses = GetStatuses(majorVersion).ToArray(); + var statusState = new Dictionary>(statuses.Length + 2); + foreach (var status in statuses) { statusState.Add(status.ToString(), torrents.Values.Where(t => FilterHelper.FilterStatus(t, status)).ToHashesHashSet()); } @@ -101,7 +103,7 @@ namespace Lantean.QBTMud.Services trackersState.Add(tracker, torrents.Values.Where(t => FilterHelper.FilterTracker(t, tracker)).ToHashesHashSet()); } - var torrentList = new MainData(torrents, tags, categories, trackers, serverState, tagState, categoriesState, statusState, trackersState); + var torrentList = new MainData(torrents, tags, categories, trackers, serverState, tagState, categoriesState, statusState, trackersState, majorVersion); return torrentList; } @@ -206,7 +208,7 @@ namespace Lantean.QBTMud.Services { foreach (var (url, hashes) in mainData.Trackers) { - if (!torrentList.Trackers.TryGetValue(url, out var existingHashes)) + if (!torrentList.Trackers.TryGetValue(url, out _)) { torrentList.Trackers.Add(url, hashes); } @@ -225,7 +227,7 @@ namespace Lantean.QBTMud.Services { var newTorrent = CreateTorrent(hash, torrent); torrentList.Torrents.Add(hash, newTorrent); - AddTorrentToStates(torrentList, hash); + AddTorrentToStates(torrentList, hash, torrentList.MajorVersion); } else { @@ -241,7 +243,7 @@ namespace Lantean.QBTMud.Services } } - private static void AddTorrentToStates(MainData torrentList, string hash) + private static void AddTorrentToStates(MainData torrentList, string hash, int version) { var torrent = torrentList.Torrents[hash]; @@ -271,7 +273,7 @@ namespace Lantean.QBTMud.Services value.AddIfTrue(hash, FilterHelper.FilterCategory(torrent, category, torrentList.ServerState.UseSubcategories)); } - foreach (var status in _statuses) + foreach (var status in GetStatuses(version)) { torrentList.StatusState[status.ToString()].AddIfTrue(hash, FilterHelper.FilterStatus(torrent, status)); } @@ -289,6 +291,25 @@ namespace Lantean.QBTMud.Services } } + private static Status[] GetStatuses(int version) + { + if (_statusArray is not null) + { + return _statusArray; + } + + if (version == 5) + { + _statusArray = Enum.GetValues().Where(s => s != Status.Paused).ToArray(); + } + else + { + _statusArray = Enum.GetValues().Where(s => s != Status.Stopped).ToArray(); + } + + return _statusArray; + } + private static void UpdateTorrentStates(MainData torrentList, string hash) { var torrent = torrentList.Torrents[hash]; @@ -317,7 +338,7 @@ namespace Lantean.QBTMud.Services value.AddIfTrueOrRemove(hash, FilterHelper.FilterCategory(torrent, category, torrentList.ServerState.UseSubcategories)); } - foreach (var status in _statuses) + foreach (var status in GetStatuses(torrentList.MajorVersion)) { torrentList.StatusState[status.ToString()].AddIfTrueOrRemove(hash, FilterHelper.FilterStatus(torrent, status)); } @@ -361,7 +382,7 @@ namespace Lantean.QBTMud.Services categoryState.RemoveIfTrue(hash, FilterHelper.FilterCategory(torrent, category, torrentList.ServerState.UseSubcategories)); } - foreach (var status in _statuses) + foreach (var status in GetStatuses(torrentList.MajorVersion)) { if (!torrentList.StatusState.TryGetValue(status.ToString(), out var statusState)) { diff --git a/Lantean.QBTMud/Services/IDataManager.cs b/Lantean.QBTMud/Services/IDataManager.cs index a54d0ca..0463ec6 100644 --- a/Lantean.QBTMud/Services/IDataManager.cs +++ b/Lantean.QBTMud/Services/IDataManager.cs @@ -4,7 +4,7 @@ namespace Lantean.QBTMud.Services { public interface IDataManager { - MainData CreateMainData(QBitTorrentClient.Models.MainData mainData); + MainData CreateMainData(QBitTorrentClient.Models.MainData mainData, string version); Torrent CreateTorrent(string hash, QBitTorrentClient.Models.Torrent torrent);