@@ -1282,7 +1282,7 @@ namespace Discord | |||||
/// <returns> | /// <returns> | ||||
/// A task that represents the asynchronous creation operation. The task result contains a <see cref="IAutoModRule"/>. | /// A task that represents the asynchronous creation operation. The task result contains a <see cref="IAutoModRule"/>. | ||||
/// </returns> | /// </returns> | ||||
Task<IAutoModRule> GetAutoModRuleAsync(RequestOptions options = null); | |||||
Task<IAutoModRule> GetAutoModRuleAsync(ulong ruleId, RequestOptions options = null); | |||||
/// <summary> | /// <summary> | ||||
/// Creates a new auto moderation rule. | /// Creates a new auto moderation rule. | ||||
@@ -10,6 +10,7 @@ using Model = Discord.API.Guild; | |||||
using RoleModel = Discord.API.Role; | using RoleModel = Discord.API.Role; | ||||
using ImageModel = Discord.API.Image; | using ImageModel = Discord.API.Image; | ||||
using System.IO; | using System.IO; | ||||
using System.Runtime.CompilerServices; | |||||
namespace Discord.Rest | namespace Discord.Rest | ||||
{ | { | ||||
@@ -1068,15 +1069,11 @@ namespace Discord.Rest | |||||
throw new NotImplementedException(); | throw new NotImplementedException(); | ||||
} | } | ||||
public static Task<AutoModerationRule> GetAutoModRuleAsync(IGuild guild, BaseDiscordClient client, RequestOptions options) | |||||
{ | |||||
throw new NotImplementedException(); | |||||
} | |||||
public static async Task<AutoModerationRule> GetAutoModRuleAsync(ulong ruleId, IGuild guild, BaseDiscordClient client, RequestOptions options) | |||||
=> await client.ApiClient.GetGuildAutoModRuleAsync(guild.Id, ruleId, options); | |||||
public static Task<AutoModerationRule[]> GetAutoModRulesAsync(IGuild guild, BaseDiscordClient client, RequestOptions options) | |||||
{ | |||||
throw new NotImplementedException(); | |||||
} | |||||
public static async Task<AutoModerationRule[]> GetAutoModRulesAsync(IGuild guild, BaseDiscordClient client, RequestOptions options) | |||||
=> await client.ApiClient.GetGuildAutoModRulesAsync(guild.Id, options); | |||||
public static Task<AutoModerationRule> ModifyRuleAsync(BaseDiscordClient client, IAutoModRule rule, Action<AutoModRuleProperties> func, RequestOptions options) | public static Task<AutoModerationRule> ModifyRuleAsync(BaseDiscordClient client, IAutoModRule rule, Action<AutoModRuleProperties> func, RequestOptions options) | ||||
{ | { | ||||
@@ -1203,17 +1203,17 @@ namespace Discord.Rest | |||||
/// <inheritdoc cref="IGuild.GetAutoModRuleAsync"/> | /// <inheritdoc cref="IGuild.GetAutoModRuleAsync"/> | ||||
public async Task<RestAutoModRule> GetAutoModRuleAsync(RequestOptions options = null) | |||||
public async Task<RestAutoModRule> 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); | |||||
} | } | ||||
/// <inheritdoc cref="IGuild.GetAutoModRulesAsync"/> | /// <inheritdoc cref="IGuild.GetAutoModRulesAsync"/> | ||||
public async Task<RestAutoModRule[]> GetAutoModRulesAsync(RequestOptions options = null) | public async Task<RestAutoModRule[]> 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(); | |||||
} | } | ||||
/// <inheritdoc cref="IGuild.CreateAutoModRuleAsync"/> | /// <inheritdoc cref="IGuild.CreateAutoModRuleAsync"/> | ||||
@@ -1572,8 +1572,8 @@ namespace Discord.Rest | |||||
/// <inheritdoc/> | /// <inheritdoc/> | ||||
async Task<IAutoModRule> IGuild.GetAutoModRuleAsync(RequestOptions options) | |||||
=> await GetAutoModRuleAsync(options).ConfigureAwait(false); | |||||
async Task<IAutoModRule> IGuild.GetAutoModRuleAsync(ulong ruleId, RequestOptions options) | |||||
=> await GetAutoModRuleAsync(ruleId, options).ConfigureAwait(false); | |||||
/// <inheritdoc/> | /// <inheritdoc/> | ||||
async Task<IAutoModRule[]> IGuild.GetAutoModRulesAsync(RequestOptions options) | async Task<IAutoModRule[]> IGuild.GetAutoModRulesAsync(RequestOptions options) | ||||
@@ -2957,10 +2957,15 @@ namespace Discord.WebSocket | |||||
return null; | return null; | ||||
}); | }); | ||||
var rule = new Cacheable<IAutoModRule, ulong>(null, data.RuleId, false, () => null); | |||||
var cachedRule = guild.GetAutoModRule(data.RuleId); | |||||
var cacheableRule = new Cacheable<IAutoModRule, ulong>(cachedRule, | |||||
data.RuleId, | |||||
cachedRule is not null, | |||||
async () => await guild.GetAutoModRuleAsync(data.RuleId)); | |||||
var eventData = new AutoModActionExecutedData( | var eventData = new AutoModActionExecutedData( | ||||
rule, | |||||
cacheableRule, | |||||
data.TriggerType, | data.TriggerType, | ||||
cacheableUser, | cacheableUser, | ||||
cacheableChannel, | cacheableChannel, | ||||
@@ -22,6 +22,7 @@ using UserModel = Discord.API.User; | |||||
using VoiceStateModel = Discord.API.VoiceState; | using VoiceStateModel = Discord.API.VoiceState; | ||||
using StickerModel = Discord.API.Sticker; | using StickerModel = Discord.API.Sticker; | ||||
using EventModel = Discord.API.GuildScheduledEvent; | using EventModel = Discord.API.GuildScheduledEvent; | ||||
using AutoModRuleModel = Discord.API.AutoModerationRule; | |||||
using System.IO; | using System.IO; | ||||
namespace Discord.WebSocket | namespace Discord.WebSocket | ||||
@@ -43,7 +44,7 @@ namespace Discord.WebSocket | |||||
private ConcurrentDictionary<ulong, SocketVoiceState> _voiceStates; | private ConcurrentDictionary<ulong, SocketVoiceState> _voiceStates; | ||||
private ConcurrentDictionary<ulong, SocketCustomSticker> _stickers; | private ConcurrentDictionary<ulong, SocketCustomSticker> _stickers; | ||||
private ConcurrentDictionary<ulong, SocketGuildEvent> _events; | private ConcurrentDictionary<ulong, SocketGuildEvent> _events; | ||||
//private ConcurrentDictionary<ulong, SocketAutoModRule> _automodRules; | |||||
private ConcurrentDictionary<ulong, SocketAutoModRule> _automodRules; | |||||
private ImmutableArray<GuildEmote> _emotes; | private ImmutableArray<GuildEmote> _emotes; | ||||
private AudioClient _audioClient; | private AudioClient _audioClient; | ||||
@@ -392,6 +393,7 @@ namespace Discord.WebSocket | |||||
{ | { | ||||
_audioLock = new SemaphoreSlim(1, 1); | _audioLock = new SemaphoreSlim(1, 1); | ||||
_emotes = ImmutableArray.Create<GuildEmote>(); | _emotes = ImmutableArray.Create<GuildEmote>(); | ||||
_automodRules = new ConcurrentDictionary<ulong, SocketAutoModRule>(); | |||||
} | } | ||||
internal static SocketGuild Create(DiscordSocketClient discord, ClientState state, ExtendedModel model) | internal static SocketGuild Create(DiscordSocketClient discord, ClientState state, ExtendedModel model) | ||||
{ | { | ||||
@@ -1812,22 +1814,47 @@ namespace Discord.WebSocket | |||||
#region AutoMod | #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; | |||||
} | |||||
/// <inheritdoc cref="IGuild.GetAutoModRuleAsync"/> | /// <inheritdoc cref="IGuild.GetAutoModRuleAsync"/> | ||||
public async Task<RestAutoModRule> GetAutoModRuleAsync(RequestOptions options = null) | |||||
public async Task<SocketAutoModRule> 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); | |||||
} | } | ||||
/// <inheritdoc cref="IGuild.GetAutoModRulesAsync"/> | /// <inheritdoc cref="IGuild.GetAutoModRulesAsync"/> | ||||
public async Task<RestAutoModRule[]> GetAutoModRulesAsync(RequestOptions options = null) | |||||
public async Task<SocketAutoModRule[]> 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(); | |||||
} | } | ||||
/// <inheritdoc cref="IGuild.CreateAutoModRuleAsync"/> | /// <inheritdoc cref="IGuild.CreateAutoModRuleAsync"/> | ||||
public async Task<RestAutoModRule> CreateAutoModRuleAsync(RequestOptions options = null) | |||||
public async Task<SocketAutoModRule> CreateAutoModRuleAsync(RequestOptions options = null) | |||||
{ | { | ||||
var rule = await GuildHelper.CreateAutoModRuleAsync(this, Discord, options); | var rule = await GuildHelper.CreateAutoModRuleAsync(this, Discord, options); | ||||
throw new NotImplementedException(); | throw new NotImplementedException(); | ||||
@@ -2081,8 +2108,8 @@ namespace Discord.WebSocket | |||||
} | } | ||||
/// <inheritdoc/> | /// <inheritdoc/> | ||||
async Task<IAutoModRule> IGuild.GetAutoModRuleAsync(RequestOptions options) | |||||
=> await GetAutoModRuleAsync(options).ConfigureAwait(false); | |||||
async Task<IAutoModRule> IGuild.GetAutoModRuleAsync(ulong ruleId, RequestOptions options) | |||||
=> await GetAutoModRuleAsync(ruleId, options).ConfigureAwait(false); | |||||
/// <inheritdoc/> | /// <inheritdoc/> | ||||
async Task<IAutoModRule[]> IGuild.GetAutoModRulesAsync(RequestOptions options) | async Task<IAutoModRule[]> IGuild.GetAutoModRulesAsync(RequestOptions options) | ||||