//! ISC License //! //! Copyright (c) 2024-2025 Yuzu //! //! Permission to use, copy, modify, and/or distribute this software for any //! purpose with or without fee is hereby granted, provided that the above //! copyright notice and this permission notice appear in all copies. //! //! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH //! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY //! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, //! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM //! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR //! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR //! PERFORMANCE OF THIS SOFTWARE. const Snowflake = @import("snowflake.zig").Snowflake; /// https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-rule-object pub const AutoModerationRule = struct { /// The id of this rule id: Snowflake, /// The guild id of the rule guild_id: Snowflake, /// The name of the rule name: []const u8, /// The id of the user who created this rule. creator_id: Snowflake, /// Indicates in what event context a rule should be checked. event_type: AutoModerationEventTypes, /// The type of trigger for this rule trigger_type: AutoModerationTriggerTypes, /// The metadata used to determine whether a rule should be triggered. trigger_metadata: AutoModerationRuleTriggerMetadata, /// Actions which will execute whenever a rule is triggered. actions: []AutoModerationAction, /// Whether the rule is enabled. enabled: bool, /// The role ids that are whitelisted. Max 20. exempt_roles: [][]const u8, /// The channel ids that are whitelisted. Max 50. exempt_channels: [][]const u8, }; pub const AutoModerationEventTypes = enum(u4) { /// When a user sends a message MessageSend = 1, /// Wen a member edits their profile MemberUpdate, }; pub const AutoModerationTriggerTypes = enum(u4) { /// Check if content contains words from a user defined list of keywords. Max 6 per guild Keyword = 1, /// Check if content represents generic spam. Max 1 per guild Spam = 3, /// Check if content contains words from internal pre-defined word sets. Max 1 per guild KeywordPreset, /// Check if content contains more unique mentions than allowed. Max 1 per guild MentionSpam, /// Check if member profile contains words from a user defined list of keywords. Max 1 per guild MemberProfile, }; pub const AutoModerationRuleTriggerMetadata = struct { /// /// The keywords needed to match. /// /// @remarks /// Only present with {@link AutoModerationTriggerTypes.Keyword}; and {@link AutoModerationTriggerTypes.MemberProfile};. /// /// Can have up to 1000 elements in the array and each []const u8 can have up to 60 characters /// keyword_filter: ?[][]const u8 = null, /// /// Regular expression patterns which will be matched against content. /// /// @remarks /// Only present with {@link AutoModerationTriggerTypes.Keyword}; and {@link AutoModerationTriggerTypes.MemberProfile};. /// /// Can have up to 10 elements in the array and each []const u8 can have up to 260 characters /// regex_patterns: [][]const u8, /// /// The pre-defined lists of words to match from. /// /// @remarks /// Only present with {@link AutoModerationTriggerTypes.KeywordPreset};. /// presets: ?[]AutoModerationRuleTriggerMetadataPresets = null, /// /// The substrings which will exempt from triggering the preset trigger type. /// /// @remarks /// Only present with {@link AutoModerationTriggerTypes.Keyword};, {@link AutoModerationTriggerTypes.KeywordPreset}; and {@link AutoModerationTriggerTypes.MemberProfile};. /// /// When used with {@link AutoModerationTriggerTypes.Keyword}; and {@link AutoModerationTriggerTypes.MemberProfile}; there can have up to 100 elements in the array and each []const u8 can have up to 60 characters. /// When used with {@link AutoModerationTriggerTypes.KeywordPreset}; there can have up to 1000 elements in the array and each []const u8 can have up to 60 characters. /// allow_list: ?[][]const u8 = null, /// /// Total isize of mentions (role & user) allowed per message. /// /// @remarks /// Only present with {@link AutoModerationTriggerTypes.MentionSpam};. /// /// Maximum of 50 /// mention_total_limit: ?isize = null, /// /// Whether to automatically detect mention raids. /// /// @remarks /// Only present with {@link AutoModerationTriggerTypes.MentionSpam};. /// mention_raid_protection_enabled: ?bool = null, }; pub const AutoModerationRuleTriggerMetadataPresets = enum(u4) { /// Words that may be considered forms of swearing or cursing Profanity = 1, /// Words that refer to sexually explicit behavior or activity SexualContent, /// Personal insults or words that may be considered hate speech Slurs, }; pub const AutoModerationAction = struct { /// The type of action to take when a rule is triggered type: AutoModerationActionType, /// additional metadata needed during execution for this specific action type metadata: AutoModerationActionMetadata, }; pub const AutoModerationActionType = enum(u4) { /// Blocks the content of a message according to the rule BlockMessage = 1, /// Logs user content to a specified channel SendAlertMessage, /// /// Times out user for specified duration /// /// @remarks /// A timeout action can only be set up for {@link AutoModerationTriggerTypes.Keyword}; and {@link AutoModerationTriggerTypes.MentionSpam}; rules. /// /// The `MODERATE_MEMBERS` permission is required to use the timeout action type. /// Timeout, /// prevents a member from using text, voice, or other interactions BlockMemberInteraction, }; pub const AutoModerationActionMetadata = struct { /// The id of channel to which user content should be logged. Only in ActionType.SendAlertMessage channel_id: ?Snowflake = null, /// Additional explanation that will be shown to members whenever their message is blocked. Maximum of 150 characters. Only supported for AutoModerationActionType.BlockMessage custom_message: ?[]const u8 = null, /// Timeout duration in seconds maximum of 2419200 seconds (4 weeks). Only supported for TriggerType.Keyword && Only in ActionType.Timeout duration_seconds: ?isize = null, }; /// https://discord.com/developers/docs/topics/gateway-events#auto-moderation-action-execution-auto-moderation-action-execution-event-fields pub const AutoModerationActionExecution = struct { /// The id of the guild guild_id: Snowflake, /// The id of the rule that was executed rule_id: Snowflake, /// The id of the user which generated the content which triggered the rule user_id: Snowflake, /// The content from the user content: []const u8, /// Action which was executed action: AutoModerationAction, /// The trigger type of the rule that was executed. rule_trigger_type: AutoModerationTriggerTypes, /// The id of the channel in which user content was posted channel_id: ?Snowflake = null, /// The id of the message. Will not exist if message was blocked by automod or content was not part of any message message_id: ?Snowflake = null, /// The id of any system auto moderation messages posted as a result of this action alert_system_message_id: ?Snowflake = null, /// The word or phrase that triggerred the rule. matched_keyword: ?[]const u8 = null, /// The substring in content that triggered the rule matched_content: ?[]const u8 = null, };