From 1db5b7056d673148dc0ee051a1539078028d8553 Mon Sep 17 00:00:00 2001 From: defnotken Date: Wed, 29 Oct 2025 17:23:07 -0500 Subject: [PATCH 01/17] Initial Bot Cleanup + Profile Toggling --- .../Controllers/GroupController.cs | 56 +++++ .../Controllers/UserController.cs | 36 ++- .../LightlessSyncServer/Startup.cs | 1 - .../Discord/MareModule.cs | 213 ++++++++++++------ 4 files changed, 238 insertions(+), 68 deletions(-) create mode 100644 LightlessSyncServer/LightlessSyncServer/Controllers/GroupController.cs diff --git a/LightlessSyncServer/LightlessSyncServer/Controllers/GroupController.cs b/LightlessSyncServer/LightlessSyncServer/Controllers/GroupController.cs new file mode 100644 index 0000000..9099aed --- /dev/null +++ b/LightlessSyncServer/LightlessSyncServer/Controllers/GroupController.cs @@ -0,0 +1,56 @@ +using LightlessSync.API.Dto.Group; +using LightlessSync.API.Routes; +using LightlessSyncShared.Data; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; + +namespace LightlessSyncServer.Controllers; + +[Route(LightlessAuth.Group)] +[Authorize(Policy = "Internal")] +public class GroupController : Controller +{ + protected readonly ILogger Logger; + protected readonly IDbContextFactory LightlessDbContextFactory; + + public GroupController(ILogger logger, IDbContextFactory lightlessDbContext) + { + Logger = logger; + LightlessDbContextFactory = lightlessDbContext; + } + + [Route(LightlessAuth.Disable_Profile)] + [HttpPost] + public async Task DisableGroupProfile([FromBody] GroupProfileAvailabilityRequest request) + { + using var dbContext = await LightlessDbContextFactory.CreateDbContextAsync(); + + Logger.LogInformation("Disabling profile for group with GID {GID}", request.GID); + + var group = await dbContext.GroupProfiles.FirstOrDefaultAsync(f => f.GroupGID == request.GID); + if (group != null) + { + group.ProfileDisabled = true; + } + + await dbContext.SaveChangesAsync(); + } + + [Route(LightlessAuth.Enable_Profile)] + [HttpPost] + public async Task EnableGroupProfile([FromBody] GroupProfileAvailabilityRequest request) + { + using var dbContext = await LightlessDbContextFactory.CreateDbContextAsync(); + + Logger.LogInformation("Disabling profile for group with GID {GID}", request.GID); + + var group = await dbContext.GroupProfiles.FirstOrDefaultAsync(f => f.GroupGID == request.GID); + if (group != null) + { + group.ProfileDisabled = false; + } + + await dbContext.SaveChangesAsync(); + } +} \ No newline at end of file diff --git a/LightlessSyncServer/LightlessSyncServer/Controllers/UserController.cs b/LightlessSyncServer/LightlessSyncServer/Controllers/UserController.cs index 0084566..d73adbb 100644 --- a/LightlessSyncServer/LightlessSyncServer/Controllers/UserController.cs +++ b/LightlessSyncServer/LightlessSyncServer/Controllers/UserController.cs @@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; -namespace LightlessSyncAuthService.Controllers; +namespace LightlessSyncServer.Controllers; [Route(LightlessAuth.User)] [Authorize(Policy = "Internal")] @@ -96,4 +96,38 @@ public class UserController : Controller await dbContext.SaveChangesAsync(); } + + [Route(LightlessAuth.Disable_Profile)] + [HttpPost] + public async Task DisableGroupProfile([FromBody] UserProfileAvailabilityRequest request) + { + using var dbContext = await LightlessDbContextFactory.CreateDbContextAsync(); + + Logger.LogInformation("Disabling profile for user with uid {UID}", request.UID); + + var user = await dbContext.UserProfileData.FirstOrDefaultAsync(f => f.UserUID == request.UID); + if (user != null) + { + user.ProfileDisabled = true; + } + + await dbContext.SaveChangesAsync(); + } + + [Route(LightlessAuth.Enable_Profile)] + [HttpPost] + public async Task EnableGroupProfile([FromBody] UserProfileAvailabilityRequest request) + { + using var dbContext = await LightlessDbContextFactory.CreateDbContextAsync(); + + Logger.LogInformation("Enabling profile for user with uid {UID}", request.UID); + + var user = await dbContext.UserProfileData.FirstOrDefaultAsync(f => f.UserUID == request.UID); + if (user != null) + { + user.ProfileDisabled = true; + } + + await dbContext.SaveChangesAsync(); + } } \ No newline at end of file diff --git a/LightlessSyncServer/LightlessSyncServer/Startup.cs b/LightlessSyncServer/LightlessSyncServer/Startup.cs index 3b9ba70..5578334 100644 --- a/LightlessSyncServer/LightlessSyncServer/Startup.cs +++ b/LightlessSyncServer/LightlessSyncServer/Startup.cs @@ -1,6 +1,5 @@ using AspNetCoreRateLimit; using LightlessSync.API.SignalR; -using LightlessSyncAuthService.Controllers; using LightlessSyncServer.Controllers; using LightlessSyncServer.Configuration; using LightlessSyncServer.Hubs; diff --git a/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs b/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs index 48d1c03..3c974e2 100644 --- a/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs +++ b/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs @@ -1,15 +1,17 @@ using Discord; using Discord.Interactions; +using LightlessSync.API.Data.Enum; +using LightlessSync.API.Dto.Group; +using LightlessSync.API.Dto.User; using LightlessSyncShared.Data; +using LightlessSyncShared.Models; +using LightlessSyncShared.Services; +using LightlessSyncShared.Utils; +using LightlessSyncShared.Utils.Configuration; using Microsoft.EntityFrameworkCore; using Prometheus; -using LightlessSyncShared.Models; -using LightlessSyncShared.Utils; -using LightlessSyncShared.Services; using StackExchange.Redis; -using LightlessSync.API.Data.Enum; -using LightlessSyncShared.Utils.Configuration; -using LightlessSync.API.Dto.User; +using System.Net.Http.Json; namespace LightlessSyncServices.Discord; @@ -110,10 +112,10 @@ public class LightlessModule : InteractionModuleBase var testUri = new Uri(_lightlessServicesConfiguration.GetValue (nameof(ServicesConfiguration.MainServerAddress)), "/msgc/sendMessage"); - await c.PostAsJsonAsync( + using (await c.PostAsJsonAsync( new Uri(_lightlessServicesConfiguration.GetValue(nameof(ServicesConfiguration.MainServerAddress)), "/msgc/sendMessage"), new ClientMessage(messageType, message, uid ?? string.Empty) - ).ConfigureAwait(false); + ).ConfigureAwait(false)) { } var discordChannelForMessages = _lightlessServicesConfiguration.GetValueOrDefault(nameof(ServicesConfiguration.DiscordChannelForMessages), null); if (uid == null && discordChannelForMessages != null) @@ -146,20 +148,47 @@ public class LightlessModule : InteractionModuleBase } } - [SlashCommand("unbanbydiscord", "ADMIN ONLY: Unban a user by their discord ID")] - public async Task UnbanByDiscord([Summary("discord_id", "Discord ID to unban")] string discordId) + [SlashCommand("serviceunban", "ADMIN ONLY: Unban a user by their discord ID or user ID [CHOOSE ONE ONLY]")] + public async Task ServiceUnban( + [Summary("discord_id", "Discord ID to unban")] string? discordId, + [Summary("uid", "UID to unban")] string? uid + ) { _logger.LogInformation("SlashCommand:{userId}:{Method}:{params}", - Context.Interaction.User.Id, nameof(UnbanByDiscord), - string.Join(",", new[] { $"{nameof(discordId)}:{discordId}" })); + Context.Interaction.User.Id, nameof(ServiceUnban), + string.Join(",", new[] { $"{nameof(discordId)}:{discordId}", $"{nameof(uid)}:{uid}" })); + try { using HttpClient c = new HttpClient(); - + c.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", _serverTokenGenerator.Token); - await c.PostAsJsonAsync(new Uri(_lightlessServicesConfiguration.GetValue - (nameof(ServicesConfiguration.MainServerAddress)), "/user/unbanDiscord"), new UnbanRequest(string.Empty, discordId)) - .ConfigureAwait(false); + + string endpoint; + UnbanRequest unbanRequest; + + if (!string.IsNullOrEmpty(uid)) + { + endpoint = "/user/unbanUID"; + unbanRequest = new UnbanRequest(uid, string.Empty); + } + else if (!string.IsNullOrEmpty(discordId)) + { + endpoint = "/user/unbanDiscord"; + unbanRequest = new UnbanRequest(string.Empty, discordId); + } + else + { + await RespondAsync("You must provide either a UID or Discord ID.", ephemeral: true).ConfigureAwait(false); + return; + } + + using (await c.PostAsJsonAsync( + new Uri(_lightlessServicesConfiguration.GetValue(nameof(ServicesConfiguration.MainServerAddress)), endpoint), + unbanRequest).ConfigureAwait(false)) + { + } + var discordChannelForMessages = _lightlessServicesConfiguration.GetValueOrDefault(nameof(ServicesConfiguration.DiscordChannelForMessages), null); if (discordChannelForMessages != null) { @@ -168,10 +197,12 @@ public class LightlessModule : InteractionModuleBase { var embedColor = Color.Blue; + String idToUse = !string.IsNullOrEmpty(uid) ? uid : discordId; + EmbedBuilder eb = new(); eb.WithTitle("Unban Alert!"); eb.WithColor(embedColor); - eb.WithDescription(discordId + " has been unbanned"); + eb.WithDescription(idToUse + " has been unbanned"); await discordChannel.SendMessageAsync(embed: eb.Build()).ConfigureAwait(false); } @@ -188,64 +219,20 @@ public class LightlessModule : InteractionModuleBase } } - [SlashCommand("unbanbyuid", "ADMIN ONLY: Unban a user by their uid")] - public async Task UnbanByUID([Summary("uid", "uid to unban")] string uid) + [SlashCommand("serviceban", "ADMIN ONLY: ban a user by their uid")] + public async Task ServiceBan([Summary("uid", "uid to ban")] string uid) { _logger.LogInformation("SlashCommand:{userId}:{Method}:{params}", - Context.Interaction.User.Id, nameof(UnbanByUID), - string.Join(",", new[] { $"{nameof(uid)}:{uid}" })); - try - { - using HttpClient c = new HttpClient(); - var testUri = new Uri(_lightlessServicesConfiguration.GetValue - (nameof(ServicesConfiguration.MainServerAddress)), "/user/unbanDiscord"); - - c.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", _serverTokenGenerator.Token); - await c.PostAsJsonAsync(new Uri(_lightlessServicesConfiguration.GetValue - (nameof(ServicesConfiguration.MainServerAddress)), "/user/unbanUID"), new UnbanRequest(uid, string.Empty)) - .ConfigureAwait(false); - var discordChannelForMessages = _lightlessServicesConfiguration.GetValueOrDefault(nameof(ServicesConfiguration.DiscordChannelForMessages), null); - if (discordChannelForMessages != null) - { - var discordChannel = await Context.Guild.GetChannelAsync(discordChannelForMessages.Value).ConfigureAwait(false) as IMessageChannel; - if (discordChannel != null) - { - var embedColor = Color.Blue; - - EmbedBuilder eb = new(); - eb.WithTitle("Unban Alert!"); - eb.WithColor(embedColor); - eb.WithDescription(uid + " has been unbanned"); - - await discordChannel.SendMessageAsync(embed: eb.Build()).ConfigureAwait(false); - } - } - - await RespondAsync("Message sent", ephemeral: true).ConfigureAwait(false); - } - catch (Exception ex) - { - EmbedBuilder eb = new(); - eb.WithTitle("An error occured"); - eb.WithDescription("Please report this: " + Environment.NewLine + ex.Message + Environment.NewLine + ex.StackTrace + Environment.NewLine); - await RespondAsync(embeds: new Embed[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); - } - } - - [SlashCommand("markforban", "ADMIN ONLY: ban a user by their uid")] - public async Task MarkUidForBan([Summary("uid", "uid to ban")] string uid) - { - _logger.LogInformation("SlashCommand:{userId}:{Method}:{params}", - Context.Interaction.User.Id, nameof(MarkUidForBan), + Context.Interaction.User.Id, nameof(ServiceBan), string.Join(",", new[] { $"{nameof(uid)}:{uid}" })); try { using HttpClient c = new HttpClient(); c.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", _serverTokenGenerator.Token); - await c.PostAsJsonAsync(new Uri(_lightlessServicesConfiguration.GetValue + using (await c.PostAsJsonAsync(new Uri(_lightlessServicesConfiguration.GetValue (nameof(ServicesConfiguration.MainServerAddress)), "/user/ban"), new BanRequest(uid)) - .ConfigureAwait(false); + .ConfigureAwait(false)) { } var discordChannelForMessages = _lightlessServicesConfiguration.GetValueOrDefault(nameof(ServicesConfiguration.DiscordChannelForMessages), null); if (discordChannelForMessages != null) { @@ -274,6 +261,100 @@ public class LightlessModule : InteractionModuleBase } } + [SlashCommand("Toggle User Profile", "ADMIN ONLY: disable a user profile by their uid")] + public async Task ToggleUserProfile( + [Summary("uid", "uid to disable")] string uid, + [Summary("toggle", "Enable or Disable the profile")] + [Choice("Enable", "Enable")] + [Choice("Disable", "Disable")] string toggle + ) + { + _logger.LogInformation("SlashCommand:{userId}:{Method}:{params}", + Context.Interaction.User.Id, nameof(ToggleUserProfile), + string.Join(",", new[] { $"{nameof(uid)}:{uid}" })); + try + { + using HttpClient c = new HttpClient(); + c.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", _serverTokenGenerator.Token); + string endpoint = string.Equals(toggle, "Enable", StringComparison.Ordinal) ? "/user/enableProfile" : "/user/disableProfile"; + using (await c.PostAsJsonAsync(new Uri(_lightlessServicesConfiguration.GetValue + (nameof(ServicesConfiguration.MainServerAddress)), endpoint), new UserProfileAvailabilityRequest(uid)) + .ConfigureAwait(false)) { } + var discordChannelForMessages = _lightlessServicesConfiguration.GetValueOrDefault(nameof(ServicesConfiguration.DiscordChannelForMessages), null); + if (discordChannelForMessages != null) + { + var discordChannel = await Context.Guild.GetChannelAsync(discordChannelForMessages.Value).ConfigureAwait(false) as IMessageChannel; + if (discordChannel != null) + { + var embedColor = Color.Blue; + var action = string.Equals(toggle, "Enable", StringComparison.Ordinal) ? "enabled" : "disabled"; + + EmbedBuilder eb = new(); + eb.WithTitle($"Profile {action}"); + eb.WithColor(embedColor); + eb.WithDescription($"{uid}'s profile has been {action}"); + + await discordChannel.SendMessageAsync(embed: eb.Build()).ConfigureAwait(false); + } + } + await RespondAsync("Message sent", ephemeral: true).ConfigureAwait(false); + } + catch (Exception ex) + { + EmbedBuilder eb = new(); + eb.WithTitle("An error occured"); + eb.WithDescription("Please report this: " + Environment.NewLine + ex.Message + Environment.NewLine + ex.StackTrace + Environment.NewLine); + await RespondAsync(embeds: new Embed[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); + } + } + + [SlashCommand("Toggle Group Profile", "ADMIN ONLY: toggle a group profile by their gid")] + public async Task ToggleGroupProfile( + [Summary("gid", "gid to disable")] string gid, + [Summary("toggle", "Enable or Disable the profile")] + [Choice("Enable", "Enable")] + [Choice("Disable", "Disable")] string toggle + ) + { + _logger.LogInformation("SlashCommand:{userId}:{Method}:{params}", + Context.Interaction.User.Id, nameof(ToggleUserProfile), + string.Join(",", new[] { $"{nameof(gid)}:{gid}" })); + try + { + using HttpClient c = new HttpClient(); + c.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", _serverTokenGenerator.Token); + string endpoint = string.Equals(toggle, "Enable", StringComparison.Ordinal) ? "/group/enableProfile" : "/group/disableProfile"; + using (await c.PostAsJsonAsync(new Uri(_lightlessServicesConfiguration.GetValue + (nameof(ServicesConfiguration.MainServerAddress)), endpoint), new GroupProfileAvailabilityRequest(gid)) + .ConfigureAwait(false)) { } + var discordChannelForMessages = _lightlessServicesConfiguration.GetValueOrDefault(nameof(ServicesConfiguration.DiscordChannelForMessages), null); + if (discordChannelForMessages != null) + { + var discordChannel = await Context.Guild.GetChannelAsync(discordChannelForMessages.Value).ConfigureAwait(false) as IMessageChannel; + if (discordChannel != null) + { + var embedColor = Color.Blue; + var action = string.Equals(toggle, "Enable", StringComparison.Ordinal) ? "enabled" : "disabled"; + + EmbedBuilder eb = new(); + eb.WithTitle($"Profile {action}"); + eb.WithColor(embedColor); + eb.WithDescription($"{gid}'s profile has been {action}"); + + await discordChannel.SendMessageAsync(embed: eb.Build()).ConfigureAwait(false); + } + } + await RespondAsync("Message sent", ephemeral: true).ConfigureAwait(false); + } + catch (Exception ex) + { + EmbedBuilder eb = new(); + eb.WithTitle("An error occured"); + eb.WithDescription("Please report this: " + Environment.NewLine + ex.Message + Environment.NewLine + ex.StackTrace + Environment.NewLine); + await RespondAsync(embeds: new Embed[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); + } + } + public async Task HandleUserAdd(string desiredUid, ulong discordUserId) { var embed = new EmbedBuilder(); From de0a37985aa95660c2fbc3db61b388b9466ad3f4 Mon Sep 17 00:00:00 2001 From: defnotken Date: Wed, 29 Oct 2025 17:23:32 -0500 Subject: [PATCH 02/17] Update API --- LightlessAPI | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LightlessAPI b/LightlessAPI index bb92cd4..cec110d 160000 --- a/LightlessAPI +++ b/LightlessAPI @@ -1 +1 @@ -Subproject commit bb92cd477d76f24fd28200ade00076bc77fe299d +Subproject commit cec110d972d98904fe3237330054ff5bd17a907a From 9f97ab1eb4b0797b3dda7600ba6fa88656347874 Mon Sep 17 00:00:00 2001 From: defnotken Date: Wed, 29 Oct 2025 17:26:43 -0500 Subject: [PATCH 03/17] Fixing some group controller stuff --- .../LightlessSyncServer/Controllers/GroupController.cs | 2 +- LightlessSyncServer/LightlessSyncServer/Startup.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/LightlessSyncServer/LightlessSyncServer/Controllers/GroupController.cs b/LightlessSyncServer/LightlessSyncServer/Controllers/GroupController.cs index 9099aed..e77e094 100644 --- a/LightlessSyncServer/LightlessSyncServer/Controllers/GroupController.cs +++ b/LightlessSyncServer/LightlessSyncServer/Controllers/GroupController.cs @@ -14,7 +14,7 @@ public class GroupController : Controller protected readonly ILogger Logger; protected readonly IDbContextFactory LightlessDbContextFactory; - public GroupController(ILogger logger, IDbContextFactory lightlessDbContext) + public GroupController(ILogger logger, IDbContextFactory lightlessDbContext) { Logger = logger; LightlessDbContextFactory = lightlessDbContext; diff --git a/LightlessSyncServer/LightlessSyncServer/Startup.cs b/LightlessSyncServer/LightlessSyncServer/Startup.cs index 5578334..792b166 100644 --- a/LightlessSyncServer/LightlessSyncServer/Startup.cs +++ b/LightlessSyncServer/LightlessSyncServer/Startup.cs @@ -72,7 +72,7 @@ public class Startup a.FeatureProviders.Remove(a.FeatureProviders.OfType().First()); if (lightlessConfig.GetValue(nameof(ServerConfiguration.MainServerAddress), defaultValue: null) == null) { - a.FeatureProviders.Add(new AllowedControllersFeatureProvider(typeof(LightlessServerConfigurationController), typeof(LightlessBaseConfigurationController), typeof(ClientMessageController), typeof(UserController))); + a.FeatureProviders.Add(new AllowedControllersFeatureProvider(typeof(LightlessServerConfigurationController), typeof(LightlessBaseConfigurationController), typeof(ClientMessageController), typeof(UserController), typeof(GroupController))); } else { From 700428eccb107f0e480da51b3321ac6b91070237 Mon Sep 17 00:00:00 2001 From: defnotken Date: Wed, 29 Oct 2025 17:56:09 -0500 Subject: [PATCH 04/17] I'm blind --- .../LightlessSyncServices/Discord/MareModule.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs b/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs index 3c974e2..ee5a1a2 100644 --- a/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs +++ b/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs @@ -261,7 +261,7 @@ public class LightlessModule : InteractionModuleBase } } - [SlashCommand("Toggle User Profile", "ADMIN ONLY: disable a user profile by their uid")] + [SlashCommand("toggleuserprofile", "ADMIN ONLY: disable a user profile by their uid")] public async Task ToggleUserProfile( [Summary("uid", "uid to disable")] string uid, [Summary("toggle", "Enable or Disable the profile")] @@ -308,7 +308,7 @@ public class LightlessModule : InteractionModuleBase } } - [SlashCommand("Toggle Group Profile", "ADMIN ONLY: toggle a group profile by their gid")] + [SlashCommand("togglegroupprofile", "ADMIN ONLY: toggle a group profile by their gid")] public async Task ToggleGroupProfile( [Summary("gid", "gid to disable")] string gid, [Summary("toggle", "Enable or Disable the profile")] From 7520bc1fa0b3b5b92d716a76fe9e508dfbf2749f Mon Sep 17 00:00:00 2001 From: defnotken Date: Wed, 29 Oct 2025 18:09:06 -0500 Subject: [PATCH 05/17] nullable --- .../LightlessSyncServices/Discord/MareModule.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs b/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs index ee5a1a2..0323888 100644 --- a/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs +++ b/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs @@ -150,8 +150,8 @@ public class LightlessModule : InteractionModuleBase [SlashCommand("serviceunban", "ADMIN ONLY: Unban a user by their discord ID or user ID [CHOOSE ONE ONLY]")] public async Task ServiceUnban( - [Summary("discord_id", "Discord ID to unban")] string? discordId, - [Summary("uid", "UID to unban")] string? uid + [Summary("discord_id", "Discord ID to unban")] string? discordId = null, + [Summary("uid", "UID to unban")] string? uid = null ) { _logger.LogInformation("SlashCommand:{userId}:{Method}:{params}", From 47b2a7a9b9cc7a58e7cd2306cc95a6c5e56f65d8 Mon Sep 17 00:00:00 2001 From: defnotken Date: Wed, 29 Oct 2025 18:26:41 -0500 Subject: [PATCH 06/17] boolz --- .../LightlessSyncServer/Controllers/UserController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LightlessSyncServer/LightlessSyncServer/Controllers/UserController.cs b/LightlessSyncServer/LightlessSyncServer/Controllers/UserController.cs index d73adbb..19917bf 100644 --- a/LightlessSyncServer/LightlessSyncServer/Controllers/UserController.cs +++ b/LightlessSyncServer/LightlessSyncServer/Controllers/UserController.cs @@ -125,7 +125,7 @@ public class UserController : Controller var user = await dbContext.UserProfileData.FirstOrDefaultAsync(f => f.UserUID == request.UID); if (user != null) { - user.ProfileDisabled = true; + user.ProfileDisabled = false; } await dbContext.SaveChangesAsync(); From 32a9e932179ae8d8827a71831fae638d08635c06 Mon Sep 17 00:00:00 2001 From: defnotken Date: Tue, 11 Nov 2025 09:53:59 -0600 Subject: [PATCH 07/17] Testing profile in userinfo --- .../Discord/MareModule.cs | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs b/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs index 0323888..146afa2 100644 --- a/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs +++ b/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs @@ -59,6 +59,30 @@ public class LightlessModule : InteractionModuleBase } } + [SlashCommand("groupinfo", "Shows you your group profile information")] + public async Task GroupInfo([Summary("gid", "ADMIN ONLY: GID to check for")] string? uid = null) + { + _logger.LogInformation("SlashCommand:{userId}:{Method}", + Context.Interaction.User.Id, nameof(GroupInfo)); + + try + { + EmbedBuilder eb = new(); + + //eb = await HandleUserInfo(eb, Context.User.Id, secondaryUid, discordUser?.Id ?? null, uid); + + await RespondAsync(embeds: new[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); + } + catch (Exception ex) + { + EmbedBuilder eb = new(); + eb.WithTitle("An error occured"); + eb.WithDescription("Please report this error to bug-reports: " + Environment.NewLine + ex.Message + Environment.NewLine + ex.StackTrace + Environment.NewLine); + + await RespondAsync(embeds: new Embed[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); + } + } + [SlashCommand("useradd", "ADMIN ONLY: add a user unconditionally to the Database")] public async Task UserAdd([Summary("desired_uid", "Desired UID")] string desiredUid) { @@ -463,6 +487,7 @@ public class LightlessModule : InteractionModuleBase var auth = await db.Auth.Include(u => u.PrimaryUser).SingleOrDefaultAsync(u => u.UserUID == dbUser.UID).ConfigureAwait(false); var groups = await db.Groups.Where(g => g.OwnerUID == dbUser.UID).ToListAsync().ConfigureAwait(false); var groupsJoined = await db.GroupPairs.Where(g => g.GroupUserUID == dbUser.UID).ToListAsync().ConfigureAwait(false); + var profile = await db.UserProfileData.Where(u => u.UserUID == dbUser.UID).SingleOrDefaultAsync().ConfigureAwait(false); var identity = await _connectionMultiplexer.GetDatabase().StringGetAsync("UID:" + dbUser.UID).ConfigureAwait(false); eb.WithTitle("User Information"); @@ -485,6 +510,14 @@ public class LightlessModule : InteractionModuleBase eb.AddField("Secondary UIDs", string.Join(Environment.NewLine, secondaryUIDs)); } } + if(profile != null) + { + eb.AddField("Profile Description", string.IsNullOrEmpty(profile.UserDescription) ? "(No description set)" : profile.UserDescription); + eb.AddField("Profile NSFW", profile.IsNSFW); + eb.AddField("Profile Disabled", profile.ProfileDisabled); + eb.AddField("Profile Flagged for Report", profile.FlaggedForReport); + eb.AddField("Profile Tags", profile.Tags != null && profile.Tags.Length > 0 ? string.Join(", ", profile.Tags) : "(No tags set)"); + } eb.AddField("Last Online (UTC)", dbUser.LastLoggedIn.ToString("U")); eb.AddField("Currently online ", !string.IsNullOrEmpty(identity)); eb.AddField("Hashed Secret Key", auth.HashedKey); From 47fec97e81961df466572d0237a6dc6a711734be Mon Sep 17 00:00:00 2001 From: defnotken Date: Tue, 11 Nov 2025 10:29:54 -0600 Subject: [PATCH 08/17] Testing user info part 2 --- .../Discord/MareModule.cs | 77 +++++++++++++++++-- 1 file changed, 72 insertions(+), 5 deletions(-) diff --git a/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs b/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs index 146afa2..5c48cdd 100644 --- a/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs +++ b/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs @@ -45,9 +45,33 @@ public class LightlessModule : InteractionModuleBase { EmbedBuilder eb = new(); - eb = await HandleUserInfo(eb, Context.User.Id, secondaryUid, discordUser?.Id ?? null, uid); + using var scope = _services.CreateScope(); + var db = scope.ServiceProvider.GetRequiredService(); + await using (db.ConfigureAwait(false)) + { + eb = await HandleUserInfo(eb, db, Context.User.Id, secondaryUid, discordUser?.Id ?? null, uid); - await RespondAsync(embeds: new[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); + if(eb.Fields.Any(f => string.Equals(f.Name, "Profile Description", StringComparison.Ordinal))) + { + string uidToGet = await GetUserUID(db, secondaryUid, discordUser?.Id ?? null, uid).ConfigureAwait(false); + byte[] profileImage = await GetProfileImage(db, uid).ConfigureAwait(false); + using (MemoryStream ms = new(profileImage)) + { + eb.WithImageUrl("attachment://profileimage.png"); + await RespondWithFileAsync( + ms, + "profileimage.png", + embeds: new[] { eb.Build() }, + ephemeral: true).ConfigureAwait(false); + } + } + else + { + await RespondAsync( + embeds: new[] { eb.Build() }, + ephemeral: true).ConfigureAwait(false); + } + } } catch (Exception ex) { @@ -423,12 +447,20 @@ public class LightlessModule : InteractionModuleBase return embed.Build(); } + + private async Task GetProfileImage(LightlessDbContext db, string uid) + { + var profile = await db.UserProfileData.Where(u => u.UserUID == uid).SingleOrDefaultAsync().ConfigureAwait(false); + if (profile != null && profile.Base64ProfileImage != null && profile.Base64ProfileImage.Length > 0) + { + return Convert.FromBase64String(profile.Base64ProfileImage); + } + return Array.Empty(); + } - private async Task HandleUserInfo(EmbedBuilder eb, ulong id, string? secondaryUserUid = null, ulong? optionalUser = null, string? uid = null) + private async Task HandleUserInfo(EmbedBuilder eb, LightlessDbContext db, ulong id, string? secondaryUserUid = null, ulong? optionalUser = null, string? uid = null) { bool showForSecondaryUser = secondaryUserUid != null; - using var scope = _services.CreateScope(); - await using var db = scope.ServiceProvider.GetRequiredService(); var primaryUser = await db.LodeStoneAuth.Include(u => u.User).SingleOrDefaultAsync(u => u.DiscordId == id).ConfigureAwait(false); @@ -540,4 +572,39 @@ public class LightlessModule : InteractionModuleBase return eb; } + + private async Task GetUserUID(LightlessDbContext db, string? secondaryUserUid = null, ulong? optionalUser = null, string? uid = null) + { + var primaryUser = await db.LodeStoneAuth.Include(u => u.User).SingleOrDefaultAsync(u => u.DiscordId == Context.User.Id).ConfigureAwait(false); + ulong userToCheckForDiscordId = Context.User.Id; + + if ((optionalUser != null || uid != null)) + { + LodeStoneAuth userInDb = null; + if (optionalUser != null) + { + userInDb = await db.LodeStoneAuth.Include(u => u.User).SingleOrDefaultAsync(u => u.DiscordId == optionalUser).ConfigureAwait(false); + } + else if (uid != null) + { + userInDb = await db.LodeStoneAuth.Include(u => u.User).SingleOrDefaultAsync(u => u.User.UID == uid || u.User.Alias == uid).ConfigureAwait(false); + } + if (userInDb == null) + { + throw new Exception("The Discord user has no valid Lightless account"); + } + userToCheckForDiscordId = userInDb.DiscordId; + } + var lodestoneUser = await db.LodeStoneAuth.Include(u => u.User).SingleOrDefaultAsync(u => u.DiscordId == userToCheckForDiscordId).ConfigureAwait(false); + var dbUser = lodestoneUser.User; + if (secondaryUserUid != null) + { + dbUser = (await db.Auth.Include(u => u.User).SingleOrDefaultAsync(u => u.PrimaryUserUID == dbUser.UID && u.UserUID == secondaryUserUid))?.User; + if (dbUser == null) + { + throw new Exception($"A secondary UID {secondaryUserUid} was not found attached to your primary UID {primaryUser.User.UID}."); + } + } + return dbUser.UID; + } } From a63742df83f61e33cd265bc07cc8de57348258eb Mon Sep 17 00:00:00 2001 From: defnotken Date: Tue, 11 Nov 2025 10:44:57 -0600 Subject: [PATCH 09/17] Lets try this again --- .../LightlessSyncServices/Discord/MareModule.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs b/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs index 5c48cdd..63ff80d 100644 --- a/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs +++ b/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs @@ -54,13 +54,15 @@ public class LightlessModule : InteractionModuleBase if(eb.Fields.Any(f => string.Equals(f.Name, "Profile Description", StringComparison.Ordinal))) { string uidToGet = await GetUserUID(db, secondaryUid, discordUser?.Id ?? null, uid).ConfigureAwait(false); + _logger.LogInformation("Fetching profile image for UID: {uid}", uidToGet); byte[] profileImage = await GetProfileImage(db, uid).ConfigureAwait(false); - using (MemoryStream ms = new(profileImage)) + MemoryStream ms = new(profileImage); + await using (ms.ConfigureAwait(false)) { eb.WithImageUrl("attachment://profileimage.png"); await RespondWithFileAsync( - ms, - "profileimage.png", + fileStream: ms, + fileName: "profileimage.png", embeds: new[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); } From f4ac99ba05ade3151f942eacfcef634d124e6963 Mon Sep 17 00:00:00 2001 From: defnotken Date: Tue, 11 Nov 2025 10:50:54 -0600 Subject: [PATCH 10/17] reeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee --- .../Discord/MareModule.cs | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs b/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs index 63ff80d..972341e 100644 --- a/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs +++ b/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs @@ -51,9 +51,10 @@ public class LightlessModule : InteractionModuleBase { eb = await HandleUserInfo(eb, db, Context.User.Id, secondaryUid, discordUser?.Id ?? null, uid); - if(eb.Fields.Any(f => string.Equals(f.Name, "Profile Description", StringComparison.Ordinal))) + string uidToGet = await GetUserUID(db, secondaryUid, discordUser?.Id ?? null, uid).ConfigureAwait(false); + var profileData = await GetUserProfileData(db, uidToGet).ConfigureAwait(false); + if (profileData != null) { - string uidToGet = await GetUserUID(db, secondaryUid, discordUser?.Id ?? null, uid).ConfigureAwait(false); _logger.LogInformation("Fetching profile image for UID: {uid}", uidToGet); byte[] profileImage = await GetProfileImage(db, uid).ConfigureAwait(false); MemoryStream ms = new(profileImage); @@ -449,16 +450,6 @@ public class LightlessModule : InteractionModuleBase return embed.Build(); } - - private async Task GetProfileImage(LightlessDbContext db, string uid) - { - var profile = await db.UserProfileData.Where(u => u.UserUID == uid).SingleOrDefaultAsync().ConfigureAwait(false); - if (profile != null && profile.Base64ProfileImage != null && profile.Base64ProfileImage.Length > 0) - { - return Convert.FromBase64String(profile.Base64ProfileImage); - } - return Array.Empty(); - } private async Task HandleUserInfo(EmbedBuilder eb, LightlessDbContext db, ulong id, string? secondaryUserUid = null, ulong? optionalUser = null, string? uid = null) { @@ -609,4 +600,19 @@ public class LightlessModule : InteractionModuleBase } return dbUser.UID; } + private async Task GetProfileImage(LightlessDbContext db, string uid) + { + var profile = await db.UserProfileData.Where(u => u.UserUID == uid).SingleOrDefaultAsync().ConfigureAwait(false); + if (profile != null && profile.Base64ProfileImage != null && profile.Base64ProfileImage.Length > 0) + { + return Convert.FromBase64String(profile.Base64ProfileImage); + } + return Array.Empty(); + } + + private async Task GetUserProfileData(LightlessDbContext db, string uid) + { + var profile = await db.UserProfileData.Where(u => u.UserUID == uid).SingleOrDefaultAsync().ConfigureAwait(false); + return profile; + } } From fac5b3caefa5bb06ac42314ad632101f3f262391 Mon Sep 17 00:00:00 2001 From: defnotken Date: Tue, 11 Nov 2025 10:54:24 -0600 Subject: [PATCH 11/17] Log warning --- LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs b/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs index 972341e..57d7e43 100644 --- a/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs +++ b/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs @@ -55,7 +55,7 @@ public class LightlessModule : InteractionModuleBase var profileData = await GetUserProfileData(db, uidToGet).ConfigureAwait(false); if (profileData != null) { - _logger.LogInformation("Fetching profile image for UID: {uid}", uidToGet); + _logger.LogWarning("Fetching profile image for UID: {uid}", uidToGet); byte[] profileImage = await GetProfileImage(db, uid).ConfigureAwait(false); MemoryStream ms = new(profileImage); await using (ms.ConfigureAwait(false)) From 44dc35ff996bd9b532adf09d2e6d06c9b987c772 Mon Sep 17 00:00:00 2001 From: defnotken Date: Tue, 11 Nov 2025 10:59:02 -0600 Subject: [PATCH 12/17] logging image --- LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs b/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs index 57d7e43..f3d37d0 100644 --- a/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs +++ b/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs @@ -57,6 +57,7 @@ public class LightlessModule : InteractionModuleBase { _logger.LogWarning("Fetching profile image for UID: {uid}", uidToGet); byte[] profileImage = await GetProfileImage(db, uid).ConfigureAwait(false); + _logger.LogWarning("Image in Bytes: {img}", profileImage); MemoryStream ms = new(profileImage); await using (ms.ConfigureAwait(false)) { From 3b93ebb9e5e2e5521dd674a9de1505cee184ae6f Mon Sep 17 00:00:00 2001 From: defnotken Date: Tue, 11 Nov 2025 11:04:39 -0600 Subject: [PATCH 13/17] more logging --- .../LightlessSyncServices/Discord/MareModule.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs b/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs index f3d37d0..c38ed04 100644 --- a/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs +++ b/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs @@ -56,7 +56,7 @@ public class LightlessModule : InteractionModuleBase if (profileData != null) { _logger.LogWarning("Fetching profile image for UID: {uid}", uidToGet); - byte[] profileImage = await GetProfileImage(db, uid).ConfigureAwait(false); + byte[] profileImage = await GetProfileImage(profileData).ConfigureAwait(false); _logger.LogWarning("Image in Bytes: {img}", profileImage); MemoryStream ms = new(profileImage); await using (ms.ConfigureAwait(false)) @@ -601,11 +601,12 @@ public class LightlessModule : InteractionModuleBase } return dbUser.UID; } - private async Task GetProfileImage(LightlessDbContext db, string uid) + private async Task GetProfileImage(UserProfileData profile) { - var profile = await db.UserProfileData.Where(u => u.UserUID == uid).SingleOrDefaultAsync().ConfigureAwait(false); + _logger.LogWarning("Fetching image: {img}", profile.Base64ProfileImage); if (profile != null && profile.Base64ProfileImage != null && profile.Base64ProfileImage.Length > 0) { + _logger.LogWarning("Fetching image complete"); return Convert.FromBase64String(profile.Base64ProfileImage); } return Array.Empty(); From ac370204299125c6285d3efed5e0ff8ffcebef1a Mon Sep 17 00:00:00 2001 From: defnotken Date: Tue, 11 Nov 2025 11:16:12 -0600 Subject: [PATCH 14/17] Lets try banners --- .../Discord/MareModule.cs | 34 ++++++++++++------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs b/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs index c38ed04..bdb4e2e 100644 --- a/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs +++ b/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs @@ -56,18 +56,17 @@ public class LightlessModule : InteractionModuleBase if (profileData != null) { _logger.LogWarning("Fetching profile image for UID: {uid}", uidToGet); - byte[] profileImage = await GetProfileImage(profileData).ConfigureAwait(false); + byte[] profileImage = GetProfileImage(profileData); + byte[] bannerImage = GetBannerImage(profileData); _logger.LogWarning("Image in Bytes: {img}", profileImage); - MemoryStream ms = new(profileImage); - await using (ms.ConfigureAwait(false)) - { - eb.WithImageUrl("attachment://profileimage.png"); - await RespondWithFileAsync( - fileStream: ms, - fileName: "profileimage.png", - embeds: new[] { eb.Build() }, - ephemeral: true).ConfigureAwait(false); - } + using MemoryStream profileImgStream = new(profileImage); + using MemoryStream bannerImgStream = new(bannerImage); + eb.WithThumbnailUrl("attachment://profileimage.png"); + eb.WithImageUrl("attachment://bannerimage.png"); + await RespondWithFilesAsync( + new[] { new FileAttachment(profileImgStream, "profileimage.png"), new FileAttachment(bannerImgStream, "bannerimage.png") }, + embeds: new[] { eb.Build() }, + ephemeral: true).ConfigureAwait(false); } else { @@ -601,7 +600,7 @@ public class LightlessModule : InteractionModuleBase } return dbUser.UID; } - private async Task GetProfileImage(UserProfileData profile) + private byte[] GetProfileImage(UserProfileData profile) { _logger.LogWarning("Fetching image: {img}", profile.Base64ProfileImage); if (profile != null && profile.Base64ProfileImage != null && profile.Base64ProfileImage.Length > 0) @@ -612,6 +611,17 @@ public class LightlessModule : InteractionModuleBase return Array.Empty(); } + private byte[] GetBannerImage(UserProfileData profile) + { + _logger.LogWarning("Fetching image: {img}", profile.Base64BannerImage); + if (profile != null && profile.Base64BannerImage != null && profile.Base64BannerImage.Length > 0) + { + _logger.LogWarning("Fetching image complete"); + return Convert.FromBase64String(profile.Base64BannerImage); + } + return Array.Empty(); + } + private async Task GetUserProfileData(LightlessDbContext db, string uid) { var profile = await db.UserProfileData.Where(u => u.UserUID == uid).SingleOrDefaultAsync().ConfigureAwait(false); From 72b5b21624c4268784565caed8ce44ffd472e1b3 Mon Sep 17 00:00:00 2001 From: defnotken Date: Tue, 11 Nov 2025 11:29:09 -0600 Subject: [PATCH 15/17] Working User Info Changes. --- .../LightlessSyncServices/Discord/MareModule.cs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs b/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs index bdb4e2e..5d531a9 100644 --- a/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs +++ b/LightlessSyncServer/LightlessSyncServices/Discord/MareModule.cs @@ -55,10 +55,8 @@ public class LightlessModule : InteractionModuleBase var profileData = await GetUserProfileData(db, uidToGet).ConfigureAwait(false); if (profileData != null) { - _logger.LogWarning("Fetching profile image for UID: {uid}", uidToGet); byte[] profileImage = GetProfileImage(profileData); byte[] bannerImage = GetBannerImage(profileData); - _logger.LogWarning("Image in Bytes: {img}", profileImage); using MemoryStream profileImgStream = new(profileImage); using MemoryStream bannerImgStream = new(bannerImage); eb.WithThumbnailUrl("attachment://profileimage.png"); @@ -602,10 +600,8 @@ public class LightlessModule : InteractionModuleBase } private byte[] GetProfileImage(UserProfileData profile) { - _logger.LogWarning("Fetching image: {img}", profile.Base64ProfileImage); if (profile != null && profile.Base64ProfileImage != null && profile.Base64ProfileImage.Length > 0) { - _logger.LogWarning("Fetching image complete"); return Convert.FromBase64String(profile.Base64ProfileImage); } return Array.Empty(); @@ -613,10 +609,8 @@ public class LightlessModule : InteractionModuleBase private byte[] GetBannerImage(UserProfileData profile) { - _logger.LogWarning("Fetching image: {img}", profile.Base64BannerImage); if (profile != null && profile.Base64BannerImage != null && profile.Base64BannerImage.Length > 0) { - _logger.LogWarning("Fetching image complete"); return Convert.FromBase64String(profile.Base64BannerImage); } return Array.Empty(); From 10cb6e9c2cdb5187501a0aedb0b9c22efc79f626 Mon Sep 17 00:00:00 2001 From: defnotken Date: Tue, 11 Nov 2025 11:47:44 -0600 Subject: [PATCH 16/17] update reference --- LightlessAPI | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LightlessAPI b/LightlessAPI index cec110d..3500db9 160000 --- a/LightlessAPI +++ b/LightlessAPI @@ -1 +1 @@ -Subproject commit cec110d972d98904fe3237330054ff5bd17a907a +Subproject commit 3500db98c20cb7dcfd5e326f05cc2f7dc6bbfcfd From 50c9268e7619ba33ce0e1b62847e5e8271cb15a1 Mon Sep 17 00:00:00 2001 From: cake Date: Tue, 11 Nov 2025 18:59:50 +0100 Subject: [PATCH 17/17] updated submodule --- LightlessAPI | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LightlessAPI b/LightlessAPI index bb88bea..0170ac3 160000 --- a/LightlessAPI +++ b/LightlessAPI @@ -1 +1 @@ -Subproject commit bb88bea5aade4fb3fce9d5a729ba37102e68a4d6 +Subproject commit 0170ac377d7d2341c0d0e206ab871af22ac4767b