From ef1c0362dff7794c527999b522a06107ba7cf3e4 Mon Sep 17 00:00:00 2001 From: Misha133 Date: Sun, 29 Jan 2023 13:18:28 +0300 Subject: [PATCH] started working on rule cache --- .../Entities/Guilds/IGuild.cs | 2 +- .../Entities/Guilds/GuildHelper.cs | 13 ++--- .../Entities/Guilds/RestGuild.cs | 14 +++--- .../DiscordSocketClient.cs | 9 +++- .../Entities/Guilds/SocketGuild.cs | 47 +++++++++++++++---- 5 files changed, 57 insertions(+), 28 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs index ccd0bb6d0..deb8a010f 100644 --- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs +++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs @@ -1282,7 +1282,7 @@ namespace Discord /// /// A task that represents the asynchronous creation operation. The task result contains a . /// - Task GetAutoModRuleAsync(RequestOptions options = null); + Task GetAutoModRuleAsync(ulong ruleId, RequestOptions options = null); /// /// Creates a new auto moderation rule. diff --git a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs index cd75c28a0..6a78cbd53 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs @@ -10,6 +10,7 @@ using Model = Discord.API.Guild; using RoleModel = Discord.API.Role; using ImageModel = Discord.API.Image; using System.IO; +using System.Runtime.CompilerServices; namespace Discord.Rest { @@ -1068,15 +1069,11 @@ namespace Discord.Rest throw new NotImplementedException(); } - public static Task GetAutoModRuleAsync(IGuild guild, BaseDiscordClient client, RequestOptions options) - { - throw new NotImplementedException(); - } + public static async Task GetAutoModRuleAsync(ulong ruleId, IGuild guild, BaseDiscordClient client, RequestOptions options) + => await client.ApiClient.GetGuildAutoModRuleAsync(guild.Id, ruleId, options); - public static Task GetAutoModRulesAsync(IGuild guild, BaseDiscordClient client, RequestOptions options) - { - throw new NotImplementedException(); - } + public static async Task GetAutoModRulesAsync(IGuild guild, BaseDiscordClient client, RequestOptions options) + => await client.ApiClient.GetGuildAutoModRulesAsync(guild.Id, options); public static Task ModifyRuleAsync(BaseDiscordClient client, IAutoModRule rule, Action func, RequestOptions options) { diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index 22371e19a..ef6754b8c 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -1203,17 +1203,17 @@ namespace Discord.Rest /// - public async Task GetAutoModRuleAsync(RequestOptions options = null) + public async Task GetAutoModRuleAsync(ulong ruleId, RequestOptions options = null) { - var rule = await GuildHelper.GetAutoModRuleAsync(this, Discord, options); - throw new NotImplementedException(); + var rule = await GuildHelper.GetAutoModRuleAsync(ruleId, this, Discord, options); + return RestAutoModRule.Create(Discord, rule); } /// public async Task GetAutoModRulesAsync(RequestOptions options = null) { - var rule = await GuildHelper.GetAutoModRulesAsync(this, Discord, options); - throw new NotImplementedException(); + var rules = await GuildHelper.GetAutoModRulesAsync(this, Discord, options); + return rules.Select(x => RestAutoModRule.Create(Discord, x)).ToArray(); } /// @@ -1572,8 +1572,8 @@ namespace Discord.Rest /// - async Task IGuild.GetAutoModRuleAsync(RequestOptions options) - => await GetAutoModRuleAsync(options).ConfigureAwait(false); + async Task IGuild.GetAutoModRuleAsync(ulong ruleId, RequestOptions options) + => await GetAutoModRuleAsync(ruleId, options).ConfigureAwait(false); /// async Task IGuild.GetAutoModRulesAsync(RequestOptions options) diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 63f4ef221..1de529a95 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -2957,10 +2957,15 @@ namespace Discord.WebSocket return null; }); - var rule = new Cacheable(null, data.RuleId, false, () => null); + var cachedRule = guild.GetAutoModRule(data.RuleId); + + var cacheableRule = new Cacheable(cachedRule, + data.RuleId, + cachedRule is not null, + async () => await guild.GetAutoModRuleAsync(data.RuleId)); var eventData = new AutoModActionExecutedData( - rule, + cacheableRule, data.TriggerType, cacheableUser, cacheableChannel, diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 31ee9841a..ad592d75f 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -22,6 +22,7 @@ using UserModel = Discord.API.User; using VoiceStateModel = Discord.API.VoiceState; using StickerModel = Discord.API.Sticker; using EventModel = Discord.API.GuildScheduledEvent; +using AutoModRuleModel = Discord.API.AutoModerationRule; using System.IO; namespace Discord.WebSocket @@ -43,7 +44,7 @@ namespace Discord.WebSocket private ConcurrentDictionary _voiceStates; private ConcurrentDictionary _stickers; private ConcurrentDictionary _events; - //private ConcurrentDictionary _automodRules; + private ConcurrentDictionary _automodRules; private ImmutableArray _emotes; private AudioClient _audioClient; @@ -392,6 +393,7 @@ namespace Discord.WebSocket { _audioLock = new SemaphoreSlim(1, 1); _emotes = ImmutableArray.Create(); + _automodRules = new ConcurrentDictionary(); } internal static SocketGuild Create(DiscordSocketClient discord, ClientState state, ExtendedModel model) { @@ -1812,22 +1814,47 @@ namespace Discord.WebSocket #region AutoMod + internal SocketAutoModRule AddOrUpdateAutoModRule(AutoModRuleModel model) + { + if (_automodRules.TryGetValue(model.Id, out var rule)) + { + rule.Update(model); + return rule; + } + + var socketRule = SocketAutoModRule.Create(Discord, this, model); + _automodRules.TryAdd(model.Id, socketRule); + return socketRule; + } + + internal SocketAutoModRule GetAutoModRule(ulong id) + { + return _automodRules.TryGetValue(id, out var rule) ? rule : null; + } + + internal SocketAutoModRule RemoveAutoModRule(ulong id) + { + return _automodRules.TryRemove(id, out var rule) ? rule : null; + } + /// - public async Task GetAutoModRuleAsync(RequestOptions options = null) + public async Task GetAutoModRuleAsync(ulong ruleId, RequestOptions options = null) { - var rule = await GuildHelper.GetAutoModRuleAsync(this, Discord, options); - throw new NotImplementedException(); + var rule = await GuildHelper.GetAutoModRuleAsync(ruleId, this, Discord, options); + + return AddOrUpdateAutoModRule(rule); } /// - public async Task GetAutoModRulesAsync(RequestOptions options = null) + public async Task GetAutoModRulesAsync(RequestOptions options = null) { - var rule = await GuildHelper.GetAutoModRulesAsync(this, Discord, options); - throw new NotImplementedException(); + var rules = await GuildHelper.GetAutoModRulesAsync(this, Discord, options); + + return rules.Select(AddOrUpdateAutoModRule).ToArray(); } /// - public async Task CreateAutoModRuleAsync(RequestOptions options = null) + public async Task CreateAutoModRuleAsync(RequestOptions options = null) { var rule = await GuildHelper.CreateAutoModRuleAsync(this, Discord, options); throw new NotImplementedException(); @@ -2081,8 +2108,8 @@ namespace Discord.WebSocket } /// - async Task IGuild.GetAutoModRuleAsync(RequestOptions options) - => await GetAutoModRuleAsync(options).ConfigureAwait(false); + async Task IGuild.GetAutoModRuleAsync(ulong ruleId, RequestOptions options) + => await GetAutoModRuleAsync(ruleId, options).ConfigureAwait(false); /// async Task IGuild.GetAutoModRulesAsync(RequestOptions options)