From a6e8ad040193c2a8dd3d98bb00921bf7eb8943f5 Mon Sep 17 00:00:00 2001 From: Eveldee Date: Sun, 26 Mar 2023 17:57:46 +0200 Subject: [PATCH] [CompositeRoles] Add fix command --- .../CompositeRolesListener.cs | 2 +- .../CompositeRoles/CompositeRolesModule.cs | 88 +++++++++++++++++++ Cocotte/Program.cs | 1 + Cocotte/Services/CocotteService.cs | 4 + 4 files changed, 94 insertions(+), 1 deletion(-) rename Cocotte/Modules/{Activities => CompositeRoles}/CompositeRolesListener.cs (98%) create mode 100644 Cocotte/Modules/CompositeRoles/CompositeRolesModule.cs diff --git a/Cocotte/Modules/Activities/CompositeRolesListener.cs b/Cocotte/Modules/CompositeRoles/CompositeRolesListener.cs similarity index 98% rename from Cocotte/Modules/Activities/CompositeRolesListener.cs rename to Cocotte/Modules/CompositeRoles/CompositeRolesListener.cs index 16c5ce8..4beb438 100644 --- a/Cocotte/Modules/Activities/CompositeRolesListener.cs +++ b/Cocotte/Modules/CompositeRoles/CompositeRolesListener.cs @@ -3,7 +3,7 @@ using Discord; using Discord.WebSocket; using Microsoft.Extensions.Options; -namespace Cocotte.Modules.Activities; +namespace Cocotte.Modules.CompositeRoles; public class CompositeRolesListener { diff --git a/Cocotte/Modules/CompositeRoles/CompositeRolesModule.cs b/Cocotte/Modules/CompositeRoles/CompositeRolesModule.cs new file mode 100644 index 0000000..b8473ac --- /dev/null +++ b/Cocotte/Modules/CompositeRoles/CompositeRolesModule.cs @@ -0,0 +1,88 @@ +using Cocotte.Options; +using Cocotte.Utils; +using Discord; +using Discord.Interactions; +using Discord.WebSocket; +using Microsoft.Extensions.Options; + +namespace Cocotte.Modules.CompositeRoles; + +[Group("autoroles", "Commandes liées aux rôles composés")] +public class CompositeRolesModule : InteractionModuleBase +{ + private readonly ILogger _logger; + private readonly CompositeRolesOptions _compositeRolesOptions; + + public CompositeRolesModule(ILogger logger, IOptions options) + { + _logger = logger; + + _compositeRolesOptions = options.Value; + } + + [RequireOwner] + [SlashCommand("fix", "Réattribuer les roles composés")] + public async Task FixRoles() + { + var count = 0; + + await RespondAsync("***`Checking autoroles for guild users...`***", ephemeral: true); + + // Check if there's composite roles for this guild + if (!_compositeRolesOptions.CompositeRoles.TryGetValue(Context.Guild.Id, out var compositeRoles)) + { + await ModifyOriginalResponseAsync(properties => + { + properties.Content = ""; + properties.Embed = EmbedUtils.InfoEmbed("Il n'y a pas de rôle composé pour ce serveur").Build(); + }); + + return; + } + + // Check for all guild members + await Context.Guild.DownloadUsersAsync(); + foreach (var guildUser in Context.Guild.Users) + { + var roles = ((SocketGuildUser)guildUser).Roles; + + // Check for each target role if they have at least one of the composite roles + foreach (var compositeRole in compositeRoles) + { + // If the user has the target role, check if we need to remove it + if (roles.FirstOrDefault(r => r.Id == compositeRole.TargetRoleId) is { } presentTargetRole) + { + // Check that the user no associated role + if (!roles.Any(r => compositeRole.CompositeRolesIds.Contains(r.Id))) + { + await guildUser.RemoveRoleAsync(presentTargetRole); + + _logger.LogInformation("CompositeRoles removed role {Role} from {User}", presentTargetRole.Name, guildUser.DisplayName); + + count++; + } + } + // It the user doesn't have the target role, check if we need to add it + else + { + // Check that the user has at least one of the desired roles + if (roles.Any(r => compositeRole.CompositeRolesIds.Contains(r.Id))) + { + var missingTargetRole = guildUser.Guild.GetRole(compositeRole.TargetRoleId); + await guildUser.AddRoleAsync(missingTargetRole); + + _logger.LogInformation("CompositeRoles added role {Role} from {User}", missingTargetRole.Name, guildUser.DisplayName); + + count++; + } + } + } + } + + await ModifyOriginalResponseAsync(properties => + { + properties.Content = ""; + properties.Embed = EmbedUtils.InfoEmbed($"Les rôles de **{count}** utilisateurs ont été mis à jour").Build(); + }); + } +} \ No newline at end of file diff --git a/Cocotte/Program.cs b/Cocotte/Program.cs index 8df348a..c33fd66 100644 --- a/Cocotte/Program.cs +++ b/Cocotte/Program.cs @@ -1,5 +1,6 @@ using Cocotte.Modules.Activities; using Cocotte.Modules.Activities.Models; +using Cocotte.Modules.CompositeRoles; using Cocotte.Modules.Raids; using Cocotte.Options; using Cocotte.Services; diff --git a/Cocotte/Services/CocotteService.cs b/Cocotte/Services/CocotteService.cs index 651a9d5..aeaf3ab 100644 --- a/Cocotte/Services/CocotteService.cs +++ b/Cocotte/Services/CocotteService.cs @@ -1,5 +1,6 @@ using System.Reflection; using Cocotte.Modules.Activities; +using Cocotte.Modules.CompositeRoles; using Cocotte.Options; using Discord; using Discord.Interactions; @@ -53,10 +54,13 @@ public class CocotteService : BackgroundService // Initialize modules and commands using var scope = _serviceProvider.CreateScope(); + #if DEBUG await _interactionService.AddModuleAsync(typeof(Modules.Ping.PingModule), scope.ServiceProvider); #endif + await _interactionService.AddModuleAsync(typeof(ActivityModule), scope.ServiceProvider); + await _interactionService.AddModuleAsync(typeof(CompositeRolesModule), scope.ServiceProvider); _client.Ready += ClientOnReady; _client.InteractionCreated += HandleInteraction;