diff --git a/discord/commands/archive.go b/discord/commands/archive.go index 0ad5c67..7b73672 100644 --- a/discord/commands/archive.go +++ b/discord/commands/archive.go @@ -13,6 +13,9 @@ func Archive(args []string, s *discordgo.Session, m *discordgo.MessageCreate) { if !requireGroupMembership(m, "archive", allowedGroups) { return } + if !requireNotThread(s, m, "archive") { + return + } if _, err := service.GetArchivedChannel(m.ChannelID); err == nil { service.SendDisappearingMessage(m.ChannelID, fmt.Sprintf("<@%s> this channel is already archived.", m.Author.ID), commandReplyTTL) return diff --git a/discord/commands/handler.go b/discord/commands/handler.go index 315a5ef..b9231dd 100644 --- a/discord/commands/handler.go +++ b/discord/commands/handler.go @@ -36,6 +36,25 @@ func requireGroupMembership(m *discordgo.MessageCreate, command string, allowedG return false } +// requireNotThread rejects commands run in a thread, forum post, or forum/media channel. +func requireNotThread(s *discordgo.Session, m *discordgo.MessageCreate, command string) bool { + channel, err := s.State.Channel(m.ChannelID) + if err != nil { + channel, err = s.Channel(m.ChannelID) + } + if err != nil { + logger.SugarLogger.Errorf("%s: failed to fetch channel %s: %v", command, m.ChannelID, err) + service.SendDisappearingMessage(m.ChannelID, fmt.Sprintf("<@%s> something went wrong, try again in a minute.", m.Author.ID), commandReplyTTL) + return false + } + switch channel.Type { + case discordgo.ChannelTypeGuildNewsThread, discordgo.ChannelTypeGuildPublicThread, discordgo.ChannelTypeGuildPrivateThread, discordgo.ChannelTypeGuildForum, discordgo.ChannelTypeGuildMedia: + service.SendDisappearingMessage(m.ChannelID, fmt.Sprintf("<@%s> `%s%s` can't be used in a thread.", m.Author.ID, config.DiscordPrefix, command), commandReplyTTL) + return false + } + return true +} + // readyOnce guards the startup sweep so a gateway reconnect (which also // fires Ready) doesn't repeatedly kick the sweep. Subsequent reconnects // are covered by the periodic cron + per-user event reconciles anyway. diff --git a/discord/commands/unarchive.go b/discord/commands/unarchive.go index 67e798a..2f865c6 100644 --- a/discord/commands/unarchive.go +++ b/discord/commands/unarchive.go @@ -13,6 +13,9 @@ func Unarchive(args []string, s *discordgo.Session, m *discordgo.MessageCreate) if !requireGroupMembership(m, "unarchive", allowedGroups) { return } + if !requireNotThread(s, m, "unarchive") { + return + } record, err := service.UnarchiveChannel(m.ChannelID) if err != nil {