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)