Skip to content

Commit

Permalink
api: Add initial implementation for automoderator API (#444)
Browse files Browse the repository at this point in the history
* Add initial implementation for automoderator api

* Move AutoModerationRuleID to snowflake.go and go generate

* Combine a struct and document all the things

* Add audit log reasons to modify and delete in automoderation

* Update docstrings and change how data is passed in

* Rename plurals to singulars and update data stuff

* fixup

* Update to use optional

* Move params out of data

* fixup and add types
  • Loading branch information
hi117 authored Aug 6, 2024
1 parent af0a612 commit acbed83
Show file tree
Hide file tree
Showing 4 changed files with 205 additions and 1 deletion.
87 changes: 87 additions & 0 deletions api/automoderation.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package api

import (
"github.com/diamondburned/arikawa/v3/discord"
"github.com/diamondburned/arikawa/v3/utils/httputil"
"github.com/diamondburned/arikawa/v3/utils/json/option"
)

// ListAutoModerationRules gets a list of all rules currently configured for the guild. Returns a list of auto moderation rule objects for the given guild.
//
// This endpoint requires the MANAGE_GUILD permission.
func (c *Client) ListAutoModerationRules(guildID discord.GuildID) ([]discord.AutoModerationRule, error) {
var rules []discord.AutoModerationRule
return rules, c.RequestJSON(
&rules, "GET",
EndpointGuilds+guildID.String()+"/auto-moderation/rules",
)
}

// GetAutoModerationRule gets a single rule. Returns an auto moderation rule object.
//
// This endpoint requires the MANAGE_GUILD permission.
func (c *Client) GetAutoModerationRule(guildID discord.GuildID, ruleID discord.AutoModerationRuleID) (discord.AutoModerationRule, error) {
var rule discord.AutoModerationRule
return rule, c.RequestJSON(
&rule, "GET",
EndpointGuilds+guildID.String()+"/auto-moderation/rules/"+ruleID.String(),
)
}

// CreateAutoModerationRule creates a new rule. Returns an auto moderation rule on success. Fires an Auto Moderation Rule Create Gateway event.
//
// This endpoint requires the MANAGE_GUILD permission.
//
// This endpoint supports the X-Audit-Log-Reason header.
func (c *Client) CreateAutoModerationRule(guildID discord.GuildID, rule discord.AutoModerationRule) (*discord.AutoModerationRule, error) {
var ret *discord.AutoModerationRule
return ret, c.RequestJSON(&ret, "POST", EndpointGuilds+guildID.String()+"/auto-moderation/rules",
httputil.WithJSONBody(rule),
)
}

type ModifyAutoModerationRuleData struct {
// the rule name
Name option.String `json:"name,omitempty"`
// the event type
EventType option.Optional[discord.AutoModerationEventType] `json:"event_type,omitempty"`
// the trigger metadata
TriggerMetadata option.Optional[discord.AutoModerationTriggerMetadata] `json:"triggr_metadata,omitempty"`
// the actions which will execute when the rule is triggered
Actions option.Optional[[]discord.AutoModerationAction] `json:"actions,omitempty"`
// whether the rule is enabled
Enabled option.Bool `json:"enabled,omitempty"`
// the role ids that should not be affected by the rule (Maximum of 20)
ExemptRules option.Optional[[]discord.RoleID] `json:"exempt_roles,omitempty"`
// the channel ids that should not be affected by the rule (Maximum of 50)
ExemptChannels option.Optional[[]discord.ChannelID] `json:"exempt_channels,omitempty"`
AuditLogReason
}

// ModifyAutoModerationRule modifies an existing rule. Returns an auto moderation rule on success. Fires an Auto Moderation Rule Update Gateway event.
//
// Requires MANAGE_GUILD permissions.
//
// All parameters for this endpoint are optional.
//
// This endpoint supports the X-Audit-Log-Reason header.
func (c *Client) ModifyAutoModerationRule(GuildID discord.GuildID, RuleID discord.AutoModerationRuleID, data ModifyAutoModerationRuleData) (*discord.AutoModerationRule, error) {
var ret *discord.AutoModerationRule
return ret, c.RequestJSON(&ret, "PATCH", EndpointGuilds+GuildID.String()+"/auto-moderation/rules/"+RuleID.String(),
httputil.WithJSONBody(data),
httputil.WithHeaders(data.Header()),
)
}

type DeleteAutoModerationRuleData struct {
AuditLogReason `json:"-"`
}

// DeleteAutoModerationRule deletes a rule. Returns a 204 on success. Fires an Auto Moderation Rule Delete Gateway event.
//
// This endpoint requires the MANAGE_GUILD permission.
//
// This endpoint supports the X-Audit-Log-Reason header.
func (c *Client) DeleteAutoModerationRule(GuildID discord.GuildID, RuleID discord.AutoModerationRuleID, data DeleteAutoModerationRuleData) error {
return c.FastRequest("DELETE", EndpointGuilds+GuildID.String()+"/auto-moderation/rules/"+RuleID.String(), httputil.WithHeaders(data.Header()))
}
93 changes: 93 additions & 0 deletions discord/automoderation.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package discord

type AutoModerationEventType uint32

const (
AutoModerationMessageSend AutoModerationEventType = 1 + iota
AutoModerationMemberUpdate
)

type AutoModerationTriggerType uint32

const (
AutoModerationKeyword AutoModerationTriggerType = 1 + iota
AutoModerationSpam
AutoModerationKeywordPreset
AutoModerationMentionSpam
AutoModerationMemberProfile
)

type AutoModerationKeywordPresetType uint32

const (
AutoModeratorProfanity AutoModerationKeywordPresetType = 1 + iota
AutoModeratorSexualContent
AutoModeratorSlurs
)

type AutoModerationTriggerMetadata struct {
// substrings which will be searched for in content (Maximum of 1000)
KeywordFilter []string `json:"keyword_filter"`
// regular expression patterns which will be matched against content (Maximum of 10)
RegexPatterns []string `json:"regex_patterns"`
// the internally pre-defined wordsets which will be searched for in content
Presets []AutoModerationKeywordPresetType `json:"presets"`
// substrings which should not trigger the rule (Maximum of 100 or 1000)
AllowList []string `json:"allow_list"`
// total number of unique role and user mentions allowed per message (Maximum of 50)
MentionTotalLimit int `json:"mention_total_limit"`
// whether to automatically detect mention raids
MentionRaidProtectionEnabled bool `json:"mention_raid_protection_enabled"`
}

type AutoModerationActionMetadata struct {
// channel to which user content should be logged
ChannelID ChannelID `json:"channel_id"`
// timeout duration in seconds
// maximum of 2419200 seconds (4 weeks)
DurationSeconds int `json:"duration_seconds"`
// additional explanation that will be shown to members whenever their message is blocked
// maximum of 150 characters
CustomMessage string `json:"custom_message,omitempty"`
}

type AutoModerationActionType uint32

const (
AutoModerationBlockMessage AutoModerationActionType = 1 + iota
AutoModerationSendAlertMessage
AutoModerationTimeout
AutoModerationBlockMemberInteraction
)

type AutoModerationAction struct {
// the type of action
Type AutoModerationActionType `json:"type"`
// additional metadata needed during execution for this specific action type
Metadata AutoModerationActionMetadata `json:"metadata,omitempty"`
}

type AutoModerationRule struct {
// the id of this rule
ID AutoModerationRuleID `json:"id"`
// the id of the guild which this rule belongs to
GuildID GuildID `json:"guild_id"`
// the rule name
Name string `json:"name"`
// the user which first created this rule
CreatorID UserID `json:"creator_id,omitempty"`
// the rule event type
EventType AutoModerationEventType `json:"event_type"`
// the rule trigger type
TriggerType AutoModerationTriggerType
// the rule trigger metadata
TriggerMetadata AutoModerationTriggerMetadata `json:"trigger_metadata,omitempty"`
// the actions which will execute when the rule is triggered
Actions []AutoModerationAction `json:"actions"`
// whether the rule is enabled
Enabled bool `json:"enabled,omitempty"`
// the role ids that should not be affected by the rule (Maximum of 20)
ExemptRoles []RoleID `json:"exempt_roles,omitempty"`
// the channel ids that should not be affected by the rule (Maximum of 50)
ExemptChannels []ChannelID `json:"exempt_channels,omitempty"`
}
2 changes: 1 addition & 1 deletion discord/snowflake.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ func DurationSinceEpoch(t time.Time) time.Duration {
return time.Duration(t.UnixNano()) - Epoch
}

//go:generate go run ../utils/cmd/gensnowflake -o snowflake_types.go AppID AttachmentID AuditLogEntryID ChannelID CommandID EmojiID GuildID IntegrationID InteractionID MessageID RoleID StageID StickerID StickerPackID TagID TeamID UserID WebhookID EventID EntityID
//go:generate go run ../utils/cmd/gensnowflake -o snowflake_types.go AppID AttachmentID AuditLogEntryID ChannelID CommandID EmojiID GuildID IntegrationID InteractionID MessageID RoleID StageID StickerID StickerPackID TagID TeamID UserID WebhookID EventID EntityID AutoModerationRuleID

// Mention generates the mention syntax for this channel ID.
func (s ChannelID) Mention() string { return "<#" + s.String() + ">" }
Expand Down
24 changes: 24 additions & 0 deletions discord/snowflake_types.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit acbed83

Please sign in to comment.