Compare commits

...

3 Commits
v0.2.5 ... main

Author SHA1 Message Date
113fcbf2d1
adding author id to message struct 2025-06-25 19:12:34 -04:00
dd20b73b76 adding log level option (#1)
Reviewed-on: #1
Co-authored-by: jake <jake.young.dev@gmail.com>
Co-committed-by: jake <jake.young.dev@gmail.com>
2025-06-25 22:51:32 +00:00
5f72f58c74
readme update 2025-06-11 17:37:59 -04:00
4 changed files with 35 additions and 9 deletions

View File

@ -29,10 +29,6 @@ type Payload func(msg Message) (string, error)
package main
import (
"log"
"os"
"os/signal"
"syscall"
"time"
"code.jakeyoungdev.com/jake/bolt"
@ -42,7 +38,7 @@ import (
func main() {
//bolt defaults the command indicator to '.' however that can be changed with the options
//Example: bolt.New(bolt.WithIndicator('!')) would support commands like !ping
b := bolt.New()
b := bolt.New(bolt.WithLogLevel(bolt.LogLevelCmd))
b.AddCommands(
// .ping can be run at any time by anyone and will respond with 'pong'

22
bolt.go
View File

@ -28,6 +28,7 @@ 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
}
type Bolt interface {
@ -63,13 +64,14 @@ func New(opts ...Option) Bolt {
b := &bolt{
Session: bot,
commands: make(map[string]Command, 0),
logLvl: LogLevelAll,
}
//set default command indicator
b.indicator = "."
//apply options to bolt
for _, o := range opts {
o(b)
for _, opt := range opts {
opt(b)
}
return b
@ -130,11 +132,17 @@ func (b *bolt) messageHandler(s *dg.Session, msg *dg.MessageCreate) {
msg.Content = "GIF/IMAGE"
}
//log message
log.Printf("< %s | %s | %s > %s\n", server.Name, channel.Name, msg.Author.Username, msg.Content)
if b.logLvl == LogLevelAll {
//log message
log.Printf("< %s | %s | %s > %s\n", server.Name, channel.Name, msg.Author.Username, msg.Content)
}
//the bot will ignore it's own messages to prevent command loops
if msg.Author.ID == s.State.User.ID {
if b.logLvl == LogLevelCmd {
//log commands
log.Printf("< %s | %s | %s > %s\n", server.Name, channel.Name, msg.Author.Username, msg.Content)
}
return
}
@ -151,6 +159,11 @@ func (b *bolt) messageHandler(s *dg.Session, msg *dg.MessageCreate) {
// parses command from message and handles timeout checks, role checks, and command execution. All command responses are sent back to Discord
func (b *bolt) handleCommand(msg *dg.MessageCreate, s *dg.Session, server *dg.Guild, channel *dg.Channel, lg int) error {
if b.logLvl == LogLevelCmd {
//log commands
log.Printf("< %s | %s | %s > %s\n", server.Name, channel.Name, msg.Author.Username, msg.Content)
}
words := strings.Split(msg.Content, " ")
run, ok := b.commands[words[0][lg:]]
if !ok {
@ -180,6 +193,7 @@ func (b *bolt) handleCommand(msg *dg.MessageCreate, s *dg.Session, server *dg.Gu
//run command payload
res, err := run.Payload(Message{
Author: msg.Author.Username,
ID: msg.Author.ID,
Words: words,
Content: msg.Content,
Channel: channel.Name,

View File

@ -17,6 +17,7 @@ type Payload func(msg Message) (string, error)
// message information passed to payload function
type Message struct {
Author string //username of message author
ID string //discord ID of message author
Words []string //words from message split on whitespace
Content string //entire message content
Channel string //message channel

View File

@ -2,9 +2,24 @@ package bolt
type Option func(b *bolt)
type LogLevel int
const (
LogLevelAll LogLevel = iota //logs all messages, and errors
LogLevelCmd LogLevel = iota //log only commands and responses, and errors
LogLevelErr LogLevel = iota //logs only errors
)
// sets the substring that must be present at the beginning of the message to indicate a command
func WithIndicator(i string) Option {
return func(b *bolt) {
b.indicator = i
}
}
// sets the log level to determine how much bolt logs
func WithLogLevel(lvl LogLevel) Option {
return func(b *bolt) {
b.logLvl = lvl
}
}