| @@ -1267,5 +1267,29 @@ namespace Discord | |||
| /// A task that represents the asynchronous creation operation. The task result contains a <see cref="WelcomeScreen"/>. | |||
| /// </returns> | |||
| Task<WelcomeScreen> ModifyWelcomeScreenAsync(bool enabled, WelcomeScreenChannelProperties[] channels, string description = null, RequestOptions options = null); | |||
| /// <summary> | |||
| /// Get a list of all rules currently configured for the guild. | |||
| /// </summary> | |||
| /// <returns> | |||
| /// A task that represents the asynchronous creation operation. The task result contains a collection of <see cref="IAutoModRule"/>. | |||
| /// </returns> | |||
| Task<IAutoModRule[]> GetAutoModRulesAsync(RequestOptions options = null); | |||
| /// <summary> | |||
| /// Gets a single rule configured in a guild. Returns <see langword="null"/> if the rule was not found. | |||
| /// </summary> | |||
| /// <returns> | |||
| /// A task that represents the asynchronous creation operation. The task result contains a <see cref="IAutoModRule"/>. | |||
| /// </returns> | |||
| Task<IAutoModRule> GetAutoModRuleAsync(RequestOptions options = null); | |||
| /// <summary> | |||
| /// Creates a new auto moderation rule. | |||
| /// </summary> | |||
| /// <returns> | |||
| /// A task that represents the asynchronous creation operation. The task result contains the created <see cref="WelcomeScreen"/>. | |||
| /// </returns> | |||
| Task<IAutoModRule> CreateAutoModRuleAsync(RequestOptions options = null); | |||
| } | |||
| } | |||
| @@ -0,0 +1,96 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Collections.Immutable; | |||
| using System.Linq; | |||
| using System.Threading.Tasks; | |||
| using Model = Discord.API.AutoModerationRule; | |||
| namespace Discord.Rest; | |||
| public class RestAutoModRule : RestEntity<ulong>, IAutoModRule | |||
| { | |||
| /// <inheritdoc /> | |||
| public DateTimeOffset CreatedAt { get; private set; } | |||
| /// <inheritdoc /> | |||
| public ulong GuildId { get; private set; } | |||
| /// <inheritdoc /> | |||
| public string Name { get; private set; } | |||
| /// <inheritdoc /> | |||
| public ulong CreatorId { get; private set; } | |||
| /// <inheritdoc /> | |||
| public AutoModEventType EventType { get; private set; } | |||
| /// <inheritdoc /> | |||
| public AutoModTriggerType TriggerType { get; private set; } | |||
| /// <inheritdoc /> | |||
| public IReadOnlyCollection<string> KeywordFilter { get; private set; } | |||
| /// <inheritdoc /> | |||
| public IReadOnlyCollection<string> RegexPatterns { get; private set; } | |||
| /// <inheritdoc /> | |||
| public IReadOnlyCollection<string> AllowList { get; private set; } | |||
| /// <inheritdoc /> | |||
| public IReadOnlyCollection<KeywordPresetTypes> Presets { get; private set; } | |||
| /// <inheritdoc /> | |||
| public int? MentionTotalLimit { get; private set; } | |||
| /// <inheritdoc /> | |||
| public IReadOnlyCollection<AutoModRuleAction> Actions { get; private set; } | |||
| /// <inheritdoc /> | |||
| public bool Enabled { get; private set; } | |||
| /// <inheritdoc /> | |||
| public IReadOnlyCollection<ulong> ExemptRoles { get; private set; } | |||
| /// <inheritdoc /> | |||
| public IReadOnlyCollection<ulong> ExemptChannels { get; private set; } | |||
| internal RestAutoModRule(BaseDiscordClient discord, ulong id) : base(discord, id) | |||
| { | |||
| } | |||
| internal static RestAutoModRule Create(BaseDiscordClient discord, Model model) | |||
| { | |||
| var entity = new RestAutoModRule(discord, model.Id); | |||
| entity.Update(model); | |||
| return entity; | |||
| } | |||
| internal void Update(Model model) | |||
| { | |||
| Name = model.Name; | |||
| CreatorId = model.CreatorId; | |||
| GuildId = model.GuildId; | |||
| EventType = model.EventType; | |||
| TriggerType = model.TriggerType; | |||
| KeywordFilter = model.TriggerMetadata.KeywordFilter.GetValueOrDefault(Array.Empty<string>()).ToImmutableArray(); | |||
| Presets = model.TriggerMetadata.Presets.GetValueOrDefault(Array.Empty<KeywordPresetTypes>()).ToImmutableArray(); | |||
| RegexPatterns = model.TriggerMetadata.RegexPatterns.GetValueOrDefault(Array.Empty<string>()).ToImmutableArray(); | |||
| AllowList = model.TriggerMetadata.AllowList.GetValueOrDefault(Array.Empty<string>()).ToImmutableArray(); | |||
| MentionTotalLimit = model.TriggerMetadata.MentionLimit.IsSpecified | |||
| ? model.TriggerMetadata.MentionLimit.Value | |||
| : null; | |||
| Actions = model.Actions.Select(x => new AutoModRuleAction(x.Type, x.Metadata.GetValueOrDefault()?.ChannelId.ToNullable(), x.Metadata.GetValueOrDefault()?.DurationSeconds.ToNullable())).ToImmutableArray(); | |||
| Enabled = model.Enabled; | |||
| ExemptRoles = model.ExemptRoles.ToImmutableArray(); | |||
| ExemptChannels = model.ExemptChannels.ToImmutableArray(); | |||
| } | |||
| /// <inheritdoc /> | |||
| public Task ModifyAsync(Action<AutoModRuleProperties> func, RequestOptions options = null) => throw new NotImplementedException(); | |||
| /// <inheritdoc /> | |||
| public Task DeleteAsync(RequestOptions options = null) => throw new NotImplementedException(); | |||
| } | |||
| @@ -1199,6 +1199,22 @@ namespace Discord.Rest | |||
| #endregion | |||
| #region AutoMod | |||
| /// <inheritdoc cref="IGuild.GetAutoModRuleAsync"/> | |||
| public Task<RestAutoModRule> GetAutoModRuleAsync(RequestOptions options = null) | |||
| => GuildHelper.GetAutoModRuleAsync(this, Discord, options); | |||
| /// <inheritdoc cref="IGuild.GetAutoModRulesAsync"/> | |||
| public Task<RestAutoModRule[]> GetAutoModRulesAsync(RequestOptions options = null) | |||
| => GuildHelper.GetAutoModRulesAsync(this, Discord, options); | |||
| /// <inheritdoc cref="IGuild.CreateAutoModRuleAsync"/> | |||
| public Task<RestAutoModRule> CreateAutoModRuleAsync(RequestOptions options = null) | |||
| => GuildHelper.CreateAutoModRuleAsync(this, Discord, options); | |||
| #endregion | |||
| #region IGuild | |||
| /// <inheritdoc /> | |||
| bool IGuild.Available => Available; | |||
| @@ -1543,6 +1559,19 @@ namespace Discord.Rest | |||
| public Task<WelcomeScreen> ModifyWelcomeScreenAsync(bool enabled, WelcomeScreenChannelProperties[] channels, string description = null, RequestOptions options = null) | |||
| => GuildHelper.ModifyWelcomeScreenAsync(enabled, description, channels, this, Discord, options); | |||
| /// <inheritdoc/> | |||
| async Task<IAutoModRule> IGuild.GetAutoModRuleAsync(RequestOptions options) | |||
| => await GetAutoModRuleAsync(options).ConfigureAwait(false); | |||
| /// <inheritdoc/> | |||
| async Task<IAutoModRule[]> IGuild.GetAutoModRulesAsync(RequestOptions options) | |||
| => await GetAutoModRulesAsync(options).ConfigureAwait(false); | |||
| /// <inheritdoc/> | |||
| async Task<IAutoModRule> IGuild.CreateAutoModRuleAsync(RequestOptions options) | |||
| => await CreateAutoModRuleAsync(options).ConfigureAwait(false); | |||
| #endregion | |||
| } | |||
| } | |||
| @@ -4,22 +4,62 @@ namespace Discord.WebSocket; | |||
| public class AutoModActionExecutedData | |||
| { | |||
| /// <summary> | |||
| /// Gets the id of the rule which action belongs to. | |||
| /// </summary> | |||
| public Cacheable<IAutoModRule, ulong> Rule { get; } | |||
| /// <summary> | |||
| /// Gets the trigger type of rule which was triggered. | |||
| /// </summary> | |||
| public AutoModTriggerType TriggerType { get; } | |||
| /// <summary> | |||
| /// Gets the user which generated the content which triggered the rule. | |||
| /// </summary> | |||
| public Cacheable<SocketGuildUser, ulong> User { get; } | |||
| /// <summary> | |||
| /// Gets the channel in which user content was posted. | |||
| /// </summary> | |||
| public Cacheable<ISocketMessageChannel, ulong> Channel { get; } | |||
| /// <summary> | |||
| /// Gets the message that triggered the action. | |||
| /// </summary> | |||
| /// <remarks> | |||
| /// This property will be <see langword="null"/> if the message was blocked byt automod. | |||
| /// </remarks> | |||
| public Cacheable<IUserMessage, ulong> Message { get; } | |||
| /// <summary> | |||
| /// Gets the id of the system auto moderation messages posted as a result of this action. | |||
| /// </summary> | |||
| /// <remarks> | |||
| /// This property will be <see langword="null"/> if this event does not correspond to an action | |||
| /// with type <see cref="AutoModActionType.SendAlertMessage"/>. | |||
| /// </remarks> | |||
| public ulong AlertMessageId { get; } | |||
| /// <summary> | |||
| /// Gets the user-generated text content. | |||
| /// </summary> | |||
| /// <remarks> | |||
| /// This property will be empty if <see cref="GatewayIntents.MessageContent"/> is disabled. | |||
| /// </remarks> | |||
| public string Content { get; } | |||
| /// <summary> | |||
| /// Gets the substring in content that triggered the rule. | |||
| /// </summary> | |||
| /// <remarks> | |||
| /// This property will be empty if <see cref="GatewayIntents.MessageContent"/> is disabled. | |||
| /// </remarks> | |||
| public string MatchedContent { get; } | |||
| /// <summary> | |||
| /// Gets the word or phrase configured in the rule that triggered the rule. | |||
| /// </summary> | |||
| public string MatchedKeyword { get; } | |||
| internal AutoModActionExecutedData(Cacheable<IAutoModRule, ulong> rule, | |||
| @@ -1810,6 +1810,22 @@ namespace Discord.WebSocket | |||
| internal SocketGuild Clone() => MemberwiseClone() as SocketGuild; | |||
| #endregion | |||
| #region AutoMod | |||
| /// <inheritdoc cref="IGuild.GetAutoModRuleAsync"/> | |||
| public Task<RestAutoModRule> GetAutoModRuleAsync(RequestOptions options = null) | |||
| => GuildHelper.GetAutoModRuleAsync(this, Discord, options); | |||
| /// <inheritdoc cref="IGuild.GetAutoModRulesAsync"/> | |||
| public Task<RestAutoModRule[]> GetAutoModRulesAsync(RequestOptions options = null) | |||
| => GuildHelper.GetAutoModRulesAsync(this, Discord, options); | |||
| /// <inheritdoc cref="IGuild.CreateAutoModRuleAsync"/> | |||
| public Task<RestAutoModRule> CreateAutoModRuleAsync(RequestOptions options = null) | |||
| => GuildHelper.CreateAutoModRuleAsync(this, Discord, options); | |||
| #endregion | |||
| #region IGuild | |||
| /// <inheritdoc /> | |||
| ulong? IGuild.AFKChannelId => AFKChannelId; | |||
| @@ -2054,6 +2070,19 @@ namespace Discord.WebSocket | |||
| _audioLock?.Dispose(); | |||
| _audioClient?.Dispose(); | |||
| } | |||
| /// <inheritdoc/> | |||
| async Task<IAutoModRule> IGuild.GetAutoModRuleAsync(RequestOptions options) | |||
| => await GetAutoModRuleAsync(options).ConfigureAwait(false); | |||
| /// <inheritdoc/> | |||
| async Task<IAutoModRule[]> IGuild.GetAutoModRulesAsync(RequestOptions options) | |||
| => await GetAutoModRulesAsync(options).ConfigureAwait(false); | |||
| /// <inheritdoc/> | |||
| async Task<IAutoModRule> IGuild.CreateAutoModRuleAsync(RequestOptions options) | |||
| => await CreateAutoModRuleAsync(options).ConfigureAwait(false); | |||
| #endregion | |||
| } | |||
| } | |||