From 4ab46e0d6347384002c3fae78e79dcc70b30fa66 Mon Sep 17 00:00:00 2001 From: Misha133 Date: Sun, 29 Jan 2023 13:48:32 +0300 Subject: [PATCH] working events --- .../BaseSocketClient.Events.cs | 4 ++-- .../DiscordSocketClient.cs | 22 +++++++++++++++++++ .../Entities/Guilds/SocketAutoModRule.cs | 2 ++ .../Entities/Guilds/SocketGuild.cs | 10 +++++++++ 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs index 815703867..82e677300 100644 --- a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs +++ b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs @@ -900,7 +900,7 @@ namespace Discord.WebSocket add => _autoModRuleCreated.Add(value); remove => _autoModRuleCreated.Remove(value); } - internal readonly AsyncEvent> _autoModRuleCreated = new AsyncEvent>(); + internal readonly AsyncEvent> _autoModRuleCreated = new (); public event Func, SocketAutoModRule, Task> AutoModRuleUpdated { @@ -914,7 +914,7 @@ namespace Discord.WebSocket add => _autoModRuleDeleted.Add(value); remove => _autoModRuleDeleted.Remove(value); } - internal readonly AsyncEvent> _autoModRuleDeleted = new AsyncEvent>(); + internal readonly AsyncEvent> _autoModRuleDeleted = new (); public event Func AutoModActionExecuted { diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 1de529a95..818e2b726 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -2889,19 +2889,41 @@ namespace Discord.WebSocket case "AUTO_MODERATION_RULE_CREATE": { + var data = (payload as JToken).ToObject(_serializer); + var guild = State.GetGuild(data.GuildId); + + var rule = guild.AddOrUpdateAutoModRule(data); + + await TimedInvokeAsync(_autoModRuleCreated, nameof(AutoModRuleCreated), rule); } break; case "AUTO_MODERATION_RULE_UPDATE": { + var data = (payload as JToken).ToObject(_serializer); + + var guild = State.GetGuild(data.GuildId); + var cachedRule = guild.GetAutoModRule(data.Id); + var cacheableBefore = new Cacheable(cachedRule.Clone(), + data.Id, + cachedRule is not null, + async () => await guild.GetAutoModRuleAsync(data.Id)); + + await TimedInvokeAsync(_autoModRuleUpdated, nameof(AutoModRuleUpdated), cacheableBefore, guild.AddOrUpdateAutoModRule(data)); } break; case "AUTO_MODERATION_RULE_DELETE": { + var data = (payload as JToken).ToObject(_serializer); + + var guild = State.GetGuild(data.GuildId); + + var rule = guild.RemoveAutoModRule(data); + await TimedInvokeAsync(_autoModRuleDeleted, nameof(AutoModRuleDeleted), rule); } break; diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketAutoModRule.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketAutoModRule.cs index 7dcd1f050..c9f92eb70 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketAutoModRule.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketAutoModRule.cs @@ -108,6 +108,8 @@ namespace Discord.WebSocket public Task DeleteAsync(RequestOptions options = null) => GuildHelper.DeleteRuleAsync(Discord, this, options); + internal SocketAutoModRule Clone() => MemberwiseClone() as SocketAutoModRule; + #region IAutoModRule IReadOnlyCollection IAutoModRule.ExemptRoles => ExemptRoles.Select(x => x.Id).ToImmutableArray(); IReadOnlyCollection IAutoModRule.ExemptChannels => ExemptChannels.Select(x => x.Id).ToImmutableArray(); diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index ad592d75f..c5c99f009 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -1837,6 +1837,16 @@ namespace Discord.WebSocket 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; + } + /// public async Task GetAutoModRuleAsync(ulong ruleId, RequestOptions options = null) {