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

@@ -230,7 +230,7 @@ public sealed class Plugin : IDalamudPlugin
s.GetRequiredService<LightlessProfileManager>(), s.GetRequiredService<PerformanceCollectorService>())); s.GetRequiredService<LightlessProfileManager>(), s.GetRequiredService<PerformanceCollectorService>()));
collection.AddScoped<WindowMediatorSubscriberBase, PopupHandler>(); collection.AddScoped<WindowMediatorSubscriberBase, PopupHandler>();
collection.AddScoped<WindowMediatorSubscriberBase, BroadcastUI>((s) => new BroadcastUI(s.GetRequiredService<ILogger<BroadcastUI>>(), s.GetRequiredService<LightlessMediator>(), s.GetRequiredService<PerformanceCollectorService>(), s.GetRequiredService<BroadcastService>(), s.GetRequiredService<LightlessConfigService>(), s.GetRequiredService<UiSharedService>(), s.GetRequiredService<ApiController>(), s.GetRequiredService<BroadcastScannerService>())); collection.AddScoped<WindowMediatorSubscriberBase, BroadcastUI>((s) => new BroadcastUI(s.GetRequiredService<ILogger<BroadcastUI>>(), s.GetRequiredService<LightlessMediator>(), s.GetRequiredService<PerformanceCollectorService>(), s.GetRequiredService<BroadcastService>(), s.GetRequiredService<LightlessConfigService>(), s.GetRequiredService<UiSharedService>(), s.GetRequiredService<ApiController>(), s.GetRequiredService<BroadcastScannerService>()));
collection.AddScoped<WindowMediatorSubscriberBase, SyncshellFinderUI>((s) => new SyncshellFinderUI(s.GetRequiredService<ILogger<SyncshellFinderUI>>(), s.GetRequiredService<LightlessMediator>(), s.GetRequiredService<PerformanceCollectorService>(), s.GetRequiredService<BroadcastService>(), s.GetRequiredService<LightlessConfigService>(), s.GetRequiredService<UiSharedService>(), s.GetRequiredService<ApiController>(), s.GetRequiredService<BroadcastScannerService>())); collection.AddScoped<WindowMediatorSubscriberBase, SyncshellFinderUI>((s) => new SyncshellFinderUI(s.GetRequiredService<ILogger<SyncshellFinderUI>>(), s.GetRequiredService<LightlessMediator>(), s.GetRequiredService<PerformanceCollectorService>(), s.GetRequiredService<BroadcastService>(), s.GetRequiredService<UiSharedService>(), s.GetRequiredService<ApiController>(), s.GetRequiredService<BroadcastScannerService>(), s.GetRequiredService<PairManager>()));
collection.AddScoped<IPopupHandler, BanUserPopupHandler>(); collection.AddScoped<IPopupHandler, BanUserPopupHandler>();
collection.AddScoped<IPopupHandler, CensusPopupHandler>(); collection.AddScoped<IPopupHandler, CensusPopupHandler>();
collection.AddScoped<CacheCreationService>(); collection.AddScoped<CacheCreationService>();

View File

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