@@ -1282,7 +1282,7 @@ namespace Discord | |||
/// <returns> | |||
/// A task that represents the asynchronous creation operation. The task result contains a <see cref="IAutoModRule"/>. | |||
/// </returns> | |||
Task<IAutoModRule> GetAutoModRuleAsync(RequestOptions options = null); | |||
Task<IAutoModRule> GetAutoModRuleAsync(ulong ruleId, RequestOptions options = null); | |||
/// <summary> | |||
/// Creates a new auto moderation rule. | |||
@@ -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<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) | |||
{ | |||
@@ -1203,17 +1203,17 @@ namespace Discord.Rest | |||
/// <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"/> | |||
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"/> | |||
@@ -1572,8 +1572,8 @@ namespace Discord.Rest | |||
/// <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/> | |||
async Task<IAutoModRule[]> IGuild.GetAutoModRulesAsync(RequestOptions options) | |||
@@ -2957,10 +2957,15 @@ namespace Discord.WebSocket | |||
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( | |||
rule, | |||
cacheableRule, | |||
data.TriggerType, | |||
cacheableUser, | |||
cacheableChannel, | |||
@@ -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<ulong, SocketVoiceState> _voiceStates; | |||
private ConcurrentDictionary<ulong, SocketCustomSticker> _stickers; | |||
private ConcurrentDictionary<ulong, SocketGuildEvent> _events; | |||
//private ConcurrentDictionary<ulong, SocketAutoModRule> _automodRules; | |||
private ConcurrentDictionary<ulong, SocketAutoModRule> _automodRules; | |||
private ImmutableArray<GuildEmote> _emotes; | |||
private AudioClient _audioClient; | |||
@@ -392,6 +393,7 @@ namespace Discord.WebSocket | |||
{ | |||
_audioLock = new SemaphoreSlim(1, 1); | |||
_emotes = ImmutableArray.Create<GuildEmote>(); | |||
_automodRules = new ConcurrentDictionary<ulong, SocketAutoModRule>(); | |||
} | |||
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; | |||
} | |||
/// <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"/> | |||
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"/> | |||
public async Task<RestAutoModRule> CreateAutoModRuleAsync(RequestOptions options = null) | |||
public async Task<SocketAutoModRule> CreateAutoModRuleAsync(RequestOptions options = null) | |||
{ | |||
var rule = await GuildHelper.CreateAutoModRuleAsync(this, Discord, options); | |||
throw new NotImplementedException(); | |||
@@ -2081,8 +2108,8 @@ namespace Discord.WebSocket | |||
} | |||
/// <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/> | |||
async Task<IAutoModRule[]> IGuild.GetAutoModRulesAsync(RequestOptions options) | |||