| @@ -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) | ||||
| { | { | ||||