@@ -900,7 +900,7 @@ namespace Discord.WebSocket | |||||
add => _autoModRuleCreated.Add(value); | add => _autoModRuleCreated.Add(value); | ||||
remove => _autoModRuleCreated.Remove(value); | remove => _autoModRuleCreated.Remove(value); | ||||
} | } | ||||
internal readonly AsyncEvent<Func<SocketAutoModRule, Task>> _autoModRuleCreated = new AsyncEvent<Func<SocketAutoModRule, Task>>(); | |||||
internal readonly AsyncEvent<Func<SocketAutoModRule, Task>> _autoModRuleCreated = new (); | |||||
public event Func<Cacheable<SocketAutoModRule, ulong>, SocketAutoModRule, Task> AutoModRuleUpdated | public event Func<Cacheable<SocketAutoModRule, ulong>, SocketAutoModRule, Task> AutoModRuleUpdated | ||||
{ | { | ||||
@@ -914,7 +914,7 @@ namespace Discord.WebSocket | |||||
add => _autoModRuleDeleted.Add(value); | add => _autoModRuleDeleted.Add(value); | ||||
remove => _autoModRuleDeleted.Remove(value); | remove => _autoModRuleDeleted.Remove(value); | ||||
} | } | ||||
internal readonly AsyncEvent<Func<SocketAutoModRule, Task>> _autoModRuleDeleted = new AsyncEvent<Func<SocketAutoModRule, Task>>(); | |||||
internal readonly AsyncEvent<Func<SocketAutoModRule, Task>> _autoModRuleDeleted = new (); | |||||
public event Func<SocketGuild, AutoModRuleAction, AutoModActionExecutedData, Task> AutoModActionExecuted | public event Func<SocketGuild, AutoModRuleAction, AutoModActionExecutedData, Task> AutoModActionExecuted | ||||
{ | { | ||||
@@ -2889,19 +2889,41 @@ namespace Discord.WebSocket | |||||
case "AUTO_MODERATION_RULE_CREATE": | case "AUTO_MODERATION_RULE_CREATE": | ||||
{ | { | ||||
var data = (payload as JToken).ToObject<AutoModerationRule>(_serializer); | |||||
var guild = State.GetGuild(data.GuildId); | |||||
var rule = guild.AddOrUpdateAutoModRule(data); | |||||
await TimedInvokeAsync(_autoModRuleCreated, nameof(AutoModRuleCreated), rule); | |||||
} | } | ||||
break; | break; | ||||
case "AUTO_MODERATION_RULE_UPDATE": | case "AUTO_MODERATION_RULE_UPDATE": | ||||
{ | { | ||||
var data = (payload as JToken).ToObject<AutoModerationRule>(_serializer); | |||||
var guild = State.GetGuild(data.GuildId); | |||||
var cachedRule = guild.GetAutoModRule(data.Id); | |||||
var cacheableBefore = new Cacheable<SocketAutoModRule, ulong>(cachedRule.Clone(), | |||||
data.Id, | |||||
cachedRule is not null, | |||||
async () => await guild.GetAutoModRuleAsync(data.Id)); | |||||
await TimedInvokeAsync(_autoModRuleUpdated, nameof(AutoModRuleUpdated), cacheableBefore, guild.AddOrUpdateAutoModRule(data)); | |||||
} | } | ||||
break; | break; | ||||
case "AUTO_MODERATION_RULE_DELETE": | case "AUTO_MODERATION_RULE_DELETE": | ||||
{ | { | ||||
var data = (payload as JToken).ToObject<AutoModerationRule>(_serializer); | |||||
var guild = State.GetGuild(data.GuildId); | |||||
var rule = guild.RemoveAutoModRule(data); | |||||
await TimedInvokeAsync(_autoModRuleDeleted, nameof(AutoModRuleDeleted), rule); | |||||
} | } | ||||
break; | break; | ||||
@@ -108,6 +108,8 @@ namespace Discord.WebSocket | |||||
public Task DeleteAsync(RequestOptions options = null) | public Task DeleteAsync(RequestOptions options = null) | ||||
=> GuildHelper.DeleteRuleAsync(Discord, this, options); | => GuildHelper.DeleteRuleAsync(Discord, this, options); | ||||
internal SocketAutoModRule Clone() => MemberwiseClone() as SocketAutoModRule; | |||||
#region IAutoModRule | #region IAutoModRule | ||||
IReadOnlyCollection<ulong> IAutoModRule.ExemptRoles => ExemptRoles.Select(x => x.Id).ToImmutableArray(); | IReadOnlyCollection<ulong> IAutoModRule.ExemptRoles => ExemptRoles.Select(x => x.Id).ToImmutableArray(); | ||||
IReadOnlyCollection<ulong> IAutoModRule.ExemptChannels => ExemptChannels.Select(x => x.Id).ToImmutableArray(); | IReadOnlyCollection<ulong> IAutoModRule.ExemptChannels => ExemptChannels.Select(x => x.Id).ToImmutableArray(); | ||||
@@ -1837,6 +1837,16 @@ namespace Discord.WebSocket | |||||
return _automodRules.TryRemove(id, out var rule) ? rule : null; | return _automodRules.TryRemove(id, out var rule) ? rule : null; | ||||
} | } | ||||
internal SocketAutoModRule RemoveAutoModRule(AutoModRuleModel model) | |||||
{ | |||||
if (_automodRules.TryRemove(model.Id, out var rule)) | |||||
{ | |||||
rule.Update(model); | |||||
} | |||||
return rule is null ? SocketAutoModRule.Create(Discord, this, model) : rule; | |||||
} | |||||
/// <inheritdoc cref="IGuild.GetAutoModRuleAsync"/> | /// <inheritdoc cref="IGuild.GetAutoModRuleAsync"/> | ||||
public async Task<SocketAutoModRule> GetAutoModRuleAsync(ulong ruleId, RequestOptions options = null) | public async Task<SocketAutoModRule> GetAutoModRuleAsync(ulong ruleId, RequestOptions options = null) | ||||
{ | { | ||||