From b47c979e3b3bc79f86ff1d8b8a20fe3e515324e9 Mon Sep 17 00:00:00 2001 From: jake Date: Wed, 13 Aug 2025 15:42:06 -0400 Subject: [PATCH] pushing code for channel lockdowns - honestly not sure if its worth adding --- bolt.go | 44 ++++++++++++++++++++++++++++++++------------ message.go | 2 ++ option.go | 7 +++++++ 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/bolt.go b/bolt.go index 104096c..b964d9f 100644 --- a/bolt.go +++ b/bolt.go @@ -14,7 +14,9 @@ import ( ) const ( - TOKEN_ENV_VAR = "DISCORD_TOKEN" //label for token environment variable + //Discord auth token must be saved as an environment variable using this label/name + //in order for bolt to detect it + TOKEN_ENV_VAR = "DISCORD_TOKEN" BOT_INTENTS = dg.IntentGuilds | dg.IntentGuildMembers | @@ -24,12 +26,12 @@ const ( dg.IntentGuildMessageReactions ) -// basic bot structure containing discordgo connection as well as the command map type bolt struct { *dg.Session //holds discordgo internals commands map[string]Command //maps trigger phrase to command struct for fast lookup indicator string //the indicator used to detect whether a message is a command logLvl LogLevel //determines how much the bot logs + channels []string //optional list of channels that the bot listens in, all channels are used if list is empty } type Bolt interface { @@ -45,7 +47,7 @@ type Bolt interface { timeoutCheck(msg *dg.MessageCreate, s *dg.Session, run Command) (bool, error) } -// create a new bolt interface +// creates and returns a new bolt interface after ensuring token is present and applying option functions func New(opts ...Option) (Bolt, error) { _, check := os.LookupEnv(TOKEN_ENV_VAR) if !check { @@ -75,9 +77,9 @@ func New(opts ...Option) (Bolt, error) { } // starts the bot, commands are added and the connection to Discord is opened, this is a BLOCKING -// call that handles safe shutdown of the bot +// call that handles safe shutdown func (b *bolt) Start() error { - //register commands and open connection + //registers the message handler used internally to detect commands b.AddHandler(b.messageHandler) err := b.Open() @@ -104,25 +106,43 @@ func (b *bolt) stop() error { // adds commands to bot command map for use func (b *bolt) AddCommands(cmd ...Command) { + //command trigger words are mapped directly to payload functions to prevent + //extra loops when searching for the appropriate payload for _, c := range cmd { b.commands[c.Trigger] = c } } -// handler function that parses message data and executes any command payloads +// internal message handler function. Ensure's the message is a message the bot should interpret +// and checks to see if it contains a command then executes the proper payload function func (b *bolt) messageHandler(s *dg.Session, msg *dg.MessageCreate) { - //get server information - server, err := s.Guild(msg.GuildID) - if err != nil { - log.Printf("failed to get guild: %e\n", err) - return - } + //get channel name to, idk if i like this channel, err := s.Channel(msg.ChannelID) if err != nil { log.Printf("failed to get channel from guild: %e\n", err) return } + if len(b.channels) > 0 { + var check bool + for _, c := range b.channels { + if channel.Name == c { + check = true + } + } + + //not a channel we care about + if !check { + return + } + } + + server, err := s.Guild(msg.GuildID) + if err != nil { + log.Printf("failed to get guild: %e\n", err) + return + } + //if there is no content it is likely an image, gif, or sticker, updating message content for //better logging and to avoid confusion if len(msg.Content) == 0 { diff --git a/message.go b/message.go index c08093c..74df282 100644 --- a/message.go +++ b/message.go @@ -37,6 +37,8 @@ const ( ReactionSpeakingHead Reaction = "🗣️" ReactionGreenCheck Reaction = "✅" ReactionDragon Reaction = "🐉" + ReactionLizard Reaction = "🦎" + ReactionTakeAKnee Reaction = "🧎‍♂️‍➡️" ) // information about attachments to messages diff --git a/option.go b/option.go index 9cac768..78e4156 100644 --- a/option.go +++ b/option.go @@ -23,3 +23,10 @@ func WithLogLevel(lvl LogLevel) Option { b.logLvl = lvl } } + +// restrict the channels the bot listens in and responds to, must be a list of channel names +func WithListenChannels(channels []string) Option { + return func(b *bolt) { + b.channels = channels + } +}