From d54c636a29d3a5aa28a2ad82e07c8d61dbbb20b2 Mon Sep 17 00:00:00 2001 From: HiLleywyn Date: Fri, 17 Apr 2026 21:04:30 +0000 Subject: [PATCH 1/2] feat: add ModifyGuildIncidentActions REST helper Wraps Discord's PUT /guilds/{id}/incident-actions endpoint so callers can toggle the Pause DMs / Pause Invites timers from the Security Actions panel. Each timer is hard-capped at 24h server-side, so callers that want the panel kept on indefinitely have to re-issue the request before the current window lapses. --- guild_incidents.go | 55 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 guild_incidents.go diff --git a/guild_incidents.go b/guild_incidents.go new file mode 100644 index 0000000..a57ab85 --- /dev/null +++ b/guild_incidents.go @@ -0,0 +1,55 @@ +package discord + +// guild_incidents.go - Guild Security Actions (Pause Invites / Pause DMs). +// +// Wraps Discord REST API v10's +// PUT /guilds/{guild.id}/incident-actions +// endpoint, which sets the same "Security Actions" panel that staff operate +// from the guild's Safety Setup settings. Requires the MANAGE_GUILD +// permission. Each timer is capped at 24 hours by Discord - to keep the +// panel active indefinitely the caller must re-issue the request before the +// current window elapses. + +import ( + "net/http" + "time" +) + +// IncidentsData mirrors Discord's guild "incidents_data" object. All four +// fields are RFC3339 timestamp strings (or nil) and are pointers so the +// caller can explicitly tell the difference between "leave unchanged" +// (absent) and "clear the timer" (null). DMSpamDetectedAt and +// RaidDetectedAt are read-only fields populated by Discord when it +// auto-detects activity; they are included here so the decoded response +// is not silently dropped. +type IncidentsData struct { + InvitesDisabledUntil *string `json:"invites_disabled_until,omitempty"` + DMsDisabledUntil *string `json:"dms_disabled_until,omitempty"` + DMSpamDetectedAt *string `json:"dm_spam_detected_at,omitempty"` + RaidDetectedAt *string `json:"raid_detected_at,omitempty"` +} + +// ModifyGuildIncidentActions toggles the guild's "Security Actions" timers +// (Pause Invites / Pause DMs). Pass a non-nil time.Time to set a timer +// until that instant; pass nil to clear the corresponding timer. Discord +// caps each timer at 24 hours; values further out are still accepted by +// the API but will be truncated to the 24-hour limit server-side. +// +// Requires MANAGE_GUILD. +func (r *RestClient) ModifyGuildIncidentActions(guildID string, invitesDisabledUntil, dmsDisabledUntil *time.Time) (*IncidentsData, error) { + body := map[string]interface{}{ + "invites_disabled_until": nil, + "dms_disabled_until": nil, + } + if invitesDisabledUntil != nil { + body["invites_disabled_until"] = invitesDisabledUntil.UTC().Format(time.RFC3339) + } + if dmsDisabledUntil != nil { + body["dms_disabled_until"] = dmsDisabledUntil.UTC().Format(time.RFC3339) + } + var out IncidentsData + if err := r.do(http.MethodPut, "/guilds/"+guildID+"/incident-actions", body, &out); err != nil { + return nil, err + } + return &out, nil +} From 1b24e0371e641f0b1b6834f2e90c8664c5968643 Mon Sep 17 00:00:00 2001 From: HiLleywyn Date: Fri, 17 Apr 2026 21:13:16 +0000 Subject: [PATCH 2/2] style: gofmt events.go and permissions.go Whitespace-only realignment after column drift; CI rejects unformatted files. --- events.go | 10 +++--- permissions.go | 84 +++++++++++++++++++++++++------------------------- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/events.go b/events.go index 6f34331..6b1be1a 100644 --- a/events.go +++ b/events.go @@ -202,11 +202,11 @@ type eventDispatcher struct { msgCache *dispatchMsgCache // in-memory message cache for snipe/edit context - onReady []ReadyHandler - onMessageCreate []MessageCreateHandler - onMessageUpdate []MessageUpdateHandler - onMessageUpdateEvent []MessageUpdateEventHandler - onMessageDelete []MessageDeleteHandler + onReady []ReadyHandler + onMessageCreate []MessageCreateHandler + onMessageUpdate []MessageUpdateHandler + onMessageUpdateEvent []MessageUpdateEventHandler + onMessageDelete []MessageDeleteHandler onGuildCreate []GuildCreateHandler onGuildDelete []GuildDeleteHandler onReactionAdd []ReactionAddHandler diff --git a/permissions.go b/permissions.go index a01a82f..4e42753 100644 --- a/permissions.go +++ b/permissions.go @@ -438,50 +438,50 @@ func (p Permission) String() string { // --------------------------------------------------------------------------- const ( - PermissionCreateInstantInvite = PermCreateInstantInvite - PermissionKickMembers = PermKickMembers - PermissionBanMembers = PermBanMembers - PermissionAdministrator = PermAdministrator - PermissionManageChannels = PermManageChannels - PermissionManageGuild = PermManageGuild - PermissionAddReactions = PermAddReactions - PermissionViewAuditLog = PermViewAuditLog - PermissionPrioritySpeaker = PermPrioritySpeaker - PermissionStream = PermStream - PermissionViewChannel = PermViewChannel - PermissionSendMessages = PermSendMessages - PermissionSendTTSMessages = PermSendTTSMessages - PermissionManageMessages = PermManageMessages - PermissionEmbedLinks = PermEmbedLinks - PermissionAttachFiles = PermAttachFiles - PermissionReadMessageHistory = PermReadMessageHistory - PermissionMentionEveryone = PermMentionEveryone - PermissionUseExternalEmojis = PermUseExternalEmojis - PermissionViewGuildInsights = PermViewGuildInsights - PermissionConnect = PermConnect - PermissionSpeak = PermSpeak - PermissionMuteMembers = PermMuteMembers - PermissionDeafenMembers = PermDeafenMembers - PermissionMoveMembers = PermMoveMembers - PermissionUseVAD = PermUseVAD - PermissionChangeNickname = PermChangeNickname - PermissionManageNicknames = PermManageNicknames - PermissionManageRoles = PermManageRoles - PermissionManageWebhooks = PermManageWebhooks + PermissionCreateInstantInvite = PermCreateInstantInvite + PermissionKickMembers = PermKickMembers + PermissionBanMembers = PermBanMembers + PermissionAdministrator = PermAdministrator + PermissionManageChannels = PermManageChannels + PermissionManageGuild = PermManageGuild + PermissionAddReactions = PermAddReactions + PermissionViewAuditLog = PermViewAuditLog + PermissionPrioritySpeaker = PermPrioritySpeaker + PermissionStream = PermStream + PermissionViewChannel = PermViewChannel + PermissionSendMessages = PermSendMessages + PermissionSendTTSMessages = PermSendTTSMessages + PermissionManageMessages = PermManageMessages + PermissionEmbedLinks = PermEmbedLinks + PermissionAttachFiles = PermAttachFiles + PermissionReadMessageHistory = PermReadMessageHistory + PermissionMentionEveryone = PermMentionEveryone + PermissionUseExternalEmojis = PermUseExternalEmojis + PermissionViewGuildInsights = PermViewGuildInsights + PermissionConnect = PermConnect + PermissionSpeak = PermSpeak + PermissionMuteMembers = PermMuteMembers + PermissionDeafenMembers = PermDeafenMembers + PermissionMoveMembers = PermMoveMembers + PermissionUseVAD = PermUseVAD + PermissionChangeNickname = PermChangeNickname + PermissionManageNicknames = PermManageNicknames + PermissionManageRoles = PermManageRoles + PermissionManageWebhooks = PermManageWebhooks PermissionManageGuildExpressions = PermManageGuildExpressions PermissionUseApplicationCommands = PermUseApplicationCommands - PermissionRequestToSpeak = PermRequestToSpeak - PermissionManageEvents = PermManageEvents - PermissionManageThreads = PermManageThreads - PermissionCreatePublicThreads = PermCreatePublicThreads - PermissionCreatePrivateThreads = PermCreatePrivateThreads - PermissionUseExternalStickers = PermUseExternalStickers - PermissionSendMessagesInThreads = PermSendMessagesInThreads - PermissionUseEmbeddedActivities = PermUseEmbeddedActivities - PermissionModerateMembers = PermModerateMembers - PermissionSendVoiceMessages = PermSendVoiceMessages - PermissionSendPolls = PermSendPolls - PermissionUseExternalApps = PermUseExternalApps + PermissionRequestToSpeak = PermRequestToSpeak + PermissionManageEvents = PermManageEvents + PermissionManageThreads = PermManageThreads + PermissionCreatePublicThreads = PermCreatePublicThreads + PermissionCreatePrivateThreads = PermCreatePrivateThreads + PermissionUseExternalStickers = PermUseExternalStickers + PermissionSendMessagesInThreads = PermSendMessagesInThreads + PermissionUseEmbeddedActivities = PermUseEmbeddedActivities + PermissionModerateMembers = PermModerateMembers + PermissionSendVoiceMessages = PermSendVoiceMessages + PermissionSendPolls = PermSendPolls + PermissionUseExternalApps = PermUseExternalApps ) // HasPermission reports whether the member holds the given permission bit.