Hiding of syncshells that already been joined in shell finder

This commit is contained in:
CakeAndBanana
2025-09-26 04:40:15 +02:00
parent 31b56ba58a
commit e3a3f16d14
2 changed files with 50 additions and 43 deletions

View File

@@ -4,15 +4,15 @@ using Dalamud.Interface.Colors;
using Dalamud.Interface.Utility;
using Dalamud.Interface.Utility.Raii;
using LightlessSync.API.Data.Enum;
using LightlessSync.API.Data.Extensions;
using LightlessSync.API.Dto;
using LightlessSync.API.Dto.Group;
using LightlessSync.LightlessConfiguration;
using LightlessSync.PlayerData.Pairs;
using LightlessSync.Services;
using LightlessSync.Services.Mediator;
using LightlessSync.Utils;
using LightlessSync.WebAPI;
using Microsoft.Extensions.Logging;
using LightlessSync.API.Data.Extensions;
using System.Numerics;
namespace LightlessSync.UI;
@@ -20,12 +20,12 @@ namespace LightlessSync.UI;
public class SyncshellFinderUI : WindowMediatorSubscriberBase
{
private readonly ApiController _apiController;
private readonly LightlessConfigService _configService;
private readonly BroadcastService _broadcastService;
private readonly UiSharedService _uiSharedService;
private readonly BroadcastScannerService _broadcastScannerService;
private readonly PairManager _pairManager;
private readonly List<GroupJoinDto> _nearbySyncshells = new();
private readonly List<GroupJoinDto> _nearbySyncshells = [];
private int _selectedNearbyIndex = -1;
private GroupJoinDto? _joinDto;
@@ -37,17 +37,16 @@ public class SyncshellFinderUI : WindowMediatorSubscriberBase
LightlessMediator mediator,
PerformanceCollectorService performanceCollectorService,
BroadcastService broadcastService,
LightlessConfigService configService,
UiSharedService uiShared,
ApiController apiController,
BroadcastScannerService broadcastScannerService
) : base(logger, mediator, "Shellfinder###LightlessSyncshellFinderUI", performanceCollectorService)
BroadcastScannerService broadcastScannerService,
PairManager pairManager) : base(logger, mediator, "Shellfinder###LightlessSyncshellFinderUI", performanceCollectorService)
{
_broadcastService = broadcastService;
_uiSharedService = uiShared;
_configService = configService;
_apiController = apiController;
_broadcastScannerService = broadcastScannerService;
_pairManager = pairManager;
IsOpen = false;
SizeConstraints = new()
@@ -56,14 +55,14 @@ public class SyncshellFinderUI : WindowMediatorSubscriberBase
MaximumSize = new(600, 550)
};
Mediator.Subscribe<SyncshellBroadcastsUpdatedMessage>(this, async _ => await RefreshSyncshellsAsync());
Mediator.Subscribe<BroadcastStatusChangedMessage>(this, async _ => await RefreshSyncshellsAsync());
Mediator.Subscribe<SyncshellBroadcastsUpdatedMessage>(this, async _ => await RefreshSyncshellsAsync().ConfigureAwait(false));
Mediator.Subscribe<BroadcastStatusChangedMessage>(this, async _ => await RefreshSyncshellsAsync().ConfigureAwait(false));
}
public override async void OnOpen()
{
_ownPermissions = _apiController.DefaultPermissions.DeepClone()!;
await RefreshSyncshellsAsync();
await RefreshSyncshellsAsync().ConfigureAwait(false);
}
protected override void DrawInternal()
@@ -170,28 +169,31 @@ public class SyncshellFinderUI : WindowMediatorSubscriberBase
private void DrawConfirmation()
{
ImGui.Separator();
ImGui.TextUnformatted($"Join Syncshell: {_joinDto.Group.AliasOrGID} by {_joinInfo.OwnerAliasOrUID}");
ImGuiHelpers.ScaledDummy(2f);
ImGui.TextUnformatted("Suggested Syncshell Permissions:");
DrawPermissionRow("Sounds", _joinInfo.GroupPermissions.IsPreferDisableSounds(), _ownPermissions.DisableGroupSounds, v => _ownPermissions.DisableGroupSounds = v);
DrawPermissionRow("Animations", _joinInfo.GroupPermissions.IsPreferDisableAnimations(), _ownPermissions.DisableGroupAnimations, v => _ownPermissions.DisableGroupAnimations = v);
DrawPermissionRow("VFX", _joinInfo.GroupPermissions.IsPreferDisableVFX(), _ownPermissions.DisableGroupVFX, v => _ownPermissions.DisableGroupVFX = v);
ImGui.NewLine();
ImGui.NewLine();
if (_uiSharedService.IconTextButton(Dalamud.Interface.FontAwesomeIcon.Plus, $"Finalize and join {_joinDto.Group.AliasOrGID}"))
if (_joinDto != null && _joinInfo != null)
{
var finalPermissions = GroupUserPreferredPermissions.NoneSet;
finalPermissions.SetDisableSounds(_ownPermissions.DisableGroupSounds);
finalPermissions.SetDisableAnimations(_ownPermissions.DisableGroupAnimations);
finalPermissions.SetDisableVFX(_ownPermissions.DisableGroupVFX);
ImGui.Separator();
ImGui.TextUnformatted($"Join Syncshell: {_joinDto.Group.AliasOrGID} by {_joinInfo.OwnerAliasOrUID}");
ImGuiHelpers.ScaledDummy(2f);
ImGui.TextUnformatted("Suggested Syncshell Permissions:");
_ = _apiController.GroupJoinFinalize(new GroupJoinDto(_joinDto.Group, _joinDto.Password, finalPermissions));
_joinDto = null;
_joinInfo = null;
DrawPermissionRow("Sounds", _joinInfo.GroupPermissions.IsPreferDisableSounds(), _ownPermissions.DisableGroupSounds, v => _ownPermissions.DisableGroupSounds = v);
DrawPermissionRow("Animations", _joinInfo.GroupPermissions.IsPreferDisableAnimations(), _ownPermissions.DisableGroupAnimations, v => _ownPermissions.DisableGroupAnimations = v);
DrawPermissionRow("VFX", _joinInfo.GroupPermissions.IsPreferDisableVFX(), _ownPermissions.DisableGroupVFX, v => _ownPermissions.DisableGroupVFX = v);
ImGui.NewLine();
ImGui.NewLine();
if (_uiSharedService.IconTextButton(Dalamud.Interface.FontAwesomeIcon.Plus, $"Finalize and join {_joinDto.Group.AliasOrGID}"))
{
var finalPermissions = GroupUserPreferredPermissions.NoneSet;
finalPermissions.SetDisableSounds(_ownPermissions.DisableGroupSounds);
finalPermissions.SetDisableAnimations(_ownPermissions.DisableGroupAnimations);
finalPermissions.SetDisableVFX(_ownPermissions.DisableGroupVFX);
_ = _apiController.GroupJoinFinalize(new GroupJoinDto(_joinDto.Group, _joinDto.Password, finalPermissions));
_joinDto = null;
_joinInfo = null;
}
}
}
@@ -224,6 +226,7 @@ public class SyncshellFinderUI : WindowMediatorSubscriberBase
private async Task RefreshSyncshellsAsync()
{
var syncshellBroadcasts = _broadcastScannerService.GetActiveSyncshellBroadcasts();
var currentSyncshells = _pairManager.GroupPairs.Select(g => g.Key).ToList();
if (syncshellBroadcasts.Count == 0)
{
@@ -231,11 +234,20 @@ public class SyncshellFinderUI : WindowMediatorSubscriberBase
return;
}
List<GroupJoinDto> updatedList;
List<GroupJoinDto> updatedList = [];
try
{
var groups = await _apiController.GetBroadcastedGroups(syncshellBroadcasts);
updatedList = groups?.ToList() ?? new();
var groups = await _apiController.GetBroadcastedGroups(syncshellBroadcasts).ConfigureAwait(false);
if (groups != null && currentSyncshells != null)
{
foreach (var group in groups)
{
if (!currentSyncshells.Exists(g => string.Equals(g.GID, group.GID, StringComparison.Ordinal)))
{
updatedList = groups?.ToList();
}
}
}
}
catch (Exception ex)
{
@@ -243,8 +255,8 @@ public class SyncshellFinderUI : WindowMediatorSubscriberBase
return;
}
var currentGids = _nearbySyncshells.Select(s => s.Group.GID).ToHashSet();
var newGids = updatedList.Select(s => s.Group.GID).ToHashSet();
var currentGids = _nearbySyncshells.Select(s => s.Group.GID).ToHashSet(StringComparer.Ordinal);
var newGids = updatedList.Select(s => s.Group.GID).ToHashSet(StringComparer.Ordinal);
if (currentGids.SetEquals(newGids))
return;
@@ -256,7 +268,7 @@ public class SyncshellFinderUI : WindowMediatorSubscriberBase
if (previousGid != null)
{
var newIndex = _nearbySyncshells.FindIndex(s => s.Group.GID == previousGid);
var newIndex = _nearbySyncshells.FindIndex(s => string.Equals(s.Group.GID, previousGid, StringComparison.Ordinal));
if (newIndex >= 0)
{
_selectedNearbyIndex = newIndex;
@@ -290,9 +302,4 @@ public class SyncshellFinderUI : WindowMediatorSubscriberBase
return _nearbySyncshells[_selectedNearbyIndex].Group.GID;
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
}
}