From 4578dcc11f299da1df8a6a45ab00ef43b9cc13f7 Mon Sep 17 00:00:00 2001
From: ahjephson <16685186+ahjephson@users.noreply.github.com>
Date: Tue, 22 Apr 2025 14:03:33 +0100
Subject: [PATCH] FIx issue with duplicate paused/stopped status lists when
 handling v4/5 differences
---
 .../Lantean.QBTMud.Test.csproj                | 10 ++---
 .../Components/TorrentActions.razor.cs        | 28 +-----------
 Lantean.QBTMud/Helpers/VersionHelper.cs       | 34 +++++++++++++++
 Lantean.QBTMud/Lantean.QBTMud.csproj          | 10 ++---
 Lantean.QBTMud/Layout/LoggedInLayout.razor.cs |  4 +-
 Lantean.QBTMud/Models/MainData.cs             |  5 ++-
 Lantean.QBTMud/Models/Status.cs               |  3 +-
 Lantean.QBTMud/Services/DataManager.cs        | 43 ++++++++++++++-----
 Lantean.QBTMud/Services/IDataManager.cs       |  2 +-
 9 files changed, 84 insertions(+), 55 deletions(-)
 create mode 100644 Lantean.QBTMud/Helpers/VersionHelper.cs
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);