From 280c80d89f32bcbed87e888582fb2d21833bcb06 Mon Sep 17 00:00:00 2001 From: CakeAndBanana Date: Thu, 16 Oct 2025 15:19:01 +0200 Subject: [PATCH] Changed the layout a bit, added nsfw --- LightlessSync/UI/SyncshellAdminUI.cs | 75 +++++++++++++++++++++++++--- 1 file changed, 69 insertions(+), 6 deletions(-) diff --git a/LightlessSync/UI/SyncshellAdminUI.cs b/LightlessSync/UI/SyncshellAdminUI.cs index 6faf08a..141510b 100644 --- a/LightlessSync/UI/SyncshellAdminUI.cs +++ b/LightlessSync/UI/SyncshellAdminUI.cs @@ -13,11 +13,13 @@ using LightlessSync.API.Dto.User; using LightlessSync.PlayerData.Pairs; using LightlessSync.Services; using LightlessSync.Services.Mediator; +using LightlessSync.UI.Handlers; using LightlessSync.WebAPI; using Microsoft.Extensions.Logging; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; using System.Globalization; +using System.Linq; using System.Numerics; namespace LightlessSync.UI; @@ -34,7 +36,6 @@ public class SyncshellAdminUI : WindowMediatorSubscriberBase private readonly UiSharedService _uiSharedService; private List _bannedUsers = []; private LightlessGroupProfileData? _profileData = null; - private GroupData? _lastProfileGroup = null; private bool _adjustedForScollBarsLocalProfile = false; private bool _adjustedForScollBarsOnlineProfile = false; private string _descriptionText = string.Empty; @@ -48,7 +49,8 @@ public class SyncshellAdminUI : WindowMediatorSubscriberBase private Task? _pruneTestTask; private Task? _pruneTask; private int _pruneDays = 14; - private bool renewProfile; + private readonly List _allowedTags = ["Apex", "Predator", "Tavern", "NSFW", "SFW"]; + private List _selectedTags = []; public SyncshellAdminUI(ILogger logger, LightlessMediator mediator, ApiController apiController, UiSharedService uiSharedService, PairManager pairManager, GroupFullInfoDto groupFullInfo, PerformanceCollectorService performanceCollectorService, LightlessProfileManager lightlessProfileManager, FileDialogManager fileDialogManager) @@ -92,6 +94,7 @@ public class SyncshellAdminUI : WindowMediatorSubscriberBase GroupFullInfo = _pairManager.Groups[GroupFullInfo.Group]; _profileData = _lightlessProfileManager.GetLightlessGroupProfile(GroupFullInfo.Group); + GetTagsFromProfile(); using var id = ImRaii.PushId("syncshell_admin_" + GroupFullInfo.GID); using (_uiSharedService.UidFont.Push()) @@ -109,7 +112,7 @@ public class SyncshellAdminUI : WindowMediatorSubscriberBase DrawManagement(); DrawPermission(perm); - + DrawProfile(); } } @@ -270,7 +273,7 @@ public class SyncshellAdminUI : WindowMediatorSubscriberBase if (_uiSharedService.MediumTreeNode("Profile Settings", UIColors.Get("LightlessPurple"))) { ImGui.Dummy(new Vector2(5)); - + ImGui.TextUnformatted($"Profile Picture:"); if (_uiSharedService.IconTextButton(FontAwesomeIcon.FileUpload, "Upload new profile picture")) { _fileDialogManager.OpenFileDialog("Select new Profile picture", ".png", (success, file) => @@ -314,8 +317,15 @@ public class SyncshellAdminUI : WindowMediatorSubscriberBase { UiSharedService.ColorTextWrapped("The profile picture must be a PNG file with a maximum height and width of 256px and 250KiB size", ImGuiColors.DalamudRed); } + ImGui.Separator(); + ImGui.TextUnformatted($"Tags:"); + var childFrameLocal = ImGuiHelpers.ScaledVector2(256 + ImGui.GetStyle().WindowPadding.X + ImGui.GetStyle().WindowBorderSize, 200); - _uiSharedService.DrawHelpText("If your profile description or image can be considered NSFW, toggle this to ON"); + foreach (string tag in _allowedTags) + { + using (ImRaii.PushId($"tag-{tag}")) DrawTag(tag); + } + ImGui.Separator(); var widthTextBox = 400; var posX = ImGui.GetCursorPosX(); ImGui.TextUnformatted($"Description {_descriptionText.Length}/1500"); @@ -330,7 +340,6 @@ public class SyncshellAdminUI : WindowMediatorSubscriberBase using (_uiSharedService.GameFont.Push()) { var descriptionTextSizeLocal = ImGui.CalcTextSize(_descriptionText, wrapWidth: 256f); - var childFrameLocal = ImGuiHelpers.ScaledVector2(256 + ImGui.GetStyle().WindowPadding.X + ImGui.GetStyle().WindowBorderSize, 200); if (descriptionTextSizeLocal.Y > childFrameLocal.Y) { _adjustedForScollBarsLocalProfile = true; @@ -361,6 +370,14 @@ public class SyncshellAdminUI : WindowMediatorSubscriberBase _ = _apiController.GroupSetProfile(new GroupProfileDto(new GroupData(GroupFullInfo.Group.AliasOrGID), Description: null, Tags: null, PictureBase64: null)); } UiSharedService.AttachToolTip("Clears your profile description text"); + ImGui.Separator(); + ImGui.TextUnformatted($"Profile Options:"); + var isNsfw = false; + if (ImGui.Checkbox("Profile is NSFW", ref isNsfw)) + { + _ = _apiController.UserSetProfile(new UserProfileDto(new UserData(_apiController.UID), Disabled: false, isNsfw, ProfilePictureBase64: null, Description: null)); + } + _uiSharedService.DrawHelpText("If your profile description or image can be considered NSFW, toggle this to ON"); ImGui.TreePop(); } } @@ -710,6 +727,52 @@ public class SyncshellAdminUI : WindowMediatorSubscriberBase } inviteTab.Dispose(); } + private void DrawTag(string tag) + { + var HasTag = _selectedTags.Contains(tag, StringComparer.Ordinal); + if (ImGui.Checkbox(tag, ref HasTag)) + { + if (HasTag) + { + _ = _apiController.GroupSetProfile(new GroupProfileDto(new GroupData(GroupFullInfo.Group.AliasOrGID), Description: null, Tags: ListToString(_selectedTags, ","), PictureBase64: null)); + + _selectedTags.Add(tag); + } + else + { + _ = _selectedTags.Count > 0 + ? _apiController.GroupSetProfile(new GroupProfileDto(new GroupData(GroupFullInfo.Group.AliasOrGID), Description: null, Tags: ListToString(_selectedTags, ","), PictureBase64: null)) + : _apiController.GroupSetProfile(new GroupProfileDto(new GroupData(GroupFullInfo.Group.AliasOrGID), Description: null, Tags: string.Empty, PictureBase64: null)); + + _selectedTags.Remove(tag); + } + } + } + + private void GetTagsFromProfile() + { + _selectedTags = []; + if (_profileData != null) + { + _selectedTags = StringToList(_profileData.Tags, ","); + } + } + + private static string ListToString(List list, string delimiter) + { + if (list == null || list.Count == 0) + return string.Empty; + + return string.Join(delimiter, list); + } + + public static List StringToList(string input, string delimiter) + { + if (string.IsNullOrEmpty(input)) + return []; + + return [.. input.Split([delimiter], StringSplitOptions.None)]; + } public override void OnClose() {