From 0f697bc5f3dbecdd511aec3d81864098d2bb374c Mon Sep 17 00:00:00 2001 From: rootdarkarchon Date: Mon, 14 Nov 2022 01:56:45 +0100 Subject: [PATCH] fixes issue where character hash of paused users in a syncshell was uselessly sent --- .../MareSynchronosServer/Hubs/MareHub.Functions.cs | 10 ++++++---- .../MareSynchronosServer/Hubs/MareHub.Groups.cs | 1 + .../MareSynchronosServer/Utils/PauseState.cs | 4 +++- .../MareSynchronosServer/Utils/PausedEntry.cs | 7 +++++++ 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Functions.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Functions.cs index 55eda08..6d9a29a 100644 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Functions.cs +++ b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Functions.cs @@ -22,7 +22,8 @@ public partial class MareHub { UID = Convert.ToString(userPair.OtherUserUID), GID = "DIRECT", - PauseState = (userPair.IsPaused || otherUserPair.IsPaused) + PauseStateSelf = userPair.IsPaused, + PauseStateOther = otherUserPair.IsPaused }) .Union( (from userGroupPair in _dbContext.GroupPairs @@ -34,15 +35,16 @@ public partial class MareHub { UID = Convert.ToString(otherGroupPair.GroupUserUID), GID = Convert.ToString(otherGroupPair.GroupGID), - PauseState = (userGroupPair.IsPaused || otherGroupPair.IsPaused) + PauseStateSelf = userGroupPair.IsPaused, + PauseStateOther = otherGroupPair.IsPaused, }) ).AsNoTracking().ToListAsync().ConfigureAwait(false); - return query.GroupBy(g => g.UID, g => (g.GID, g.PauseState), + return query.GroupBy(g => g.UID, g => (g.GID, g.PauseStateSelf, g.PauseStateOther), (key, g) => new PausedEntry { UID = key, - PauseStates = g.Select(p => new PauseState() { GID = string.Equals(p.GID, "DIRECT", StringComparison.Ordinal) ? null : p.GID, IsPaused = p.PauseState }) + PauseStates = g.Select(p => new PauseState() { GID = string.Equals(p.GID, "DIRECT", StringComparison.Ordinal) ? null : p.GID, IsSelfPaused = p.PauseStateSelf, IsOtherPaused = p.PauseStateOther }) .ToList() }, StringComparer.Ordinal).ToList(); } diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Groups.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Groups.cs index ba1f471..47bde0c 100644 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Groups.cs +++ b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Groups.cs @@ -407,6 +407,7 @@ public partial class MareHub { if (userPair.IsDirectlyPaused != PauseInfo.NoConnection) continue; if (userPair.IsPausedExcludingGroup(gid) is PauseInfo.Unpaused) continue; + if (userPair.IsOtherPausedForSpecificGroup(gid) is PauseInfo.Paused) continue; } var groupUserIdent = _clientIdentService.GetCharacterIdentForUid(groupUserPair.GroupUserUID); diff --git a/MareSynchronosServer/MareSynchronosServer/Utils/PauseState.cs b/MareSynchronosServer/MareSynchronosServer/Utils/PauseState.cs index 8106f9f..f656c3a 100644 --- a/MareSynchronosServer/MareSynchronosServer/Utils/PauseState.cs +++ b/MareSynchronosServer/MareSynchronosServer/Utils/PauseState.cs @@ -3,5 +3,7 @@ public record PauseState { public string GID { get; set; } - public bool IsPaused { get; set; } + public bool IsPaused => IsSelfPaused || IsOtherPaused; + public bool IsSelfPaused { get; set; } + public bool IsOtherPaused { get; set; } } \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosServer/Utils/PausedEntry.cs b/MareSynchronosServer/MareSynchronosServer/Utils/PausedEntry.cs index 00fe0ae..21187f4 100644 --- a/MareSynchronosServer/MareSynchronosServer/Utils/PausedEntry.cs +++ b/MareSynchronosServer/MareSynchronosServer/Utils/PausedEntry.cs @@ -37,6 +37,13 @@ public record PausedEntry } } + public PauseInfo IsOtherPausedForSpecificGroup(string gid) + { + var state = PauseStatesWithoutDirect.SingleOrDefault(g => string.Equals(g.GID, gid, StringComparison.Ordinal)); + if (state == null) return PauseInfo.NoConnection; + return state.IsOtherPaused ? PauseInfo.Paused : PauseInfo.Unpaused; + } + public PauseInfo IsPausedForSpecificGroup(string gid) { var state = PauseStatesWithoutDirect.SingleOrDefault(g => string.Equals(g.GID, gid, StringComparison.Ordinal));