From 8f8d68eb09bafc794c5920beb9643dc2bdc2860a Mon Sep 17 00:00:00 2001 From: Simon Kim Date: Tue, 20 Oct 2026 22:10:46 -0700 Subject: [PATCH] refactoring code a wee bit --- bot.go | 34 ++++++++++++++++++++++++++++++ config.go | 35 ++++++++++++++++++++++++++++++ main.go | 62 ++++++++++++++++-------------------------------------- matcher.go | 7 ++++++ 4 files changed, 94 insertions(+), 44 deletions(-) create mode 100644 bot.go create mode 100644 config.go create mode 100644 matcher.go diff --git a/bot.go b/bot.go new file mode 100644 index 0000000..1ac07fb --- /dev/null +++ b/bot.go @@ -0,0 +1,34 @@ +package main + +import ( + "log" + + "github.com/bwmarrin/discordgo" +) + +type Bot struct { + gifURL string +} + +func newBot(cfg Config) *Bot { + return &Bot{gifURL: cfg.GIFURL} +} + +func (b *Bot) onReady(s *discordgo.Session, r *discordgo.Ready) { + user := r.User + log.Printf("logged in as %v", user.Username) +} + +func (b *Bot) onMessage(s *discordgo.Session, m *discordgo.MessageCreate) { + if m.Author.Bot { + return + } + + if !shouldReply(m.Content) { + return + } + + if _, err := s.ChannelMessageSendReply(m.ChannelID, b.gifURL, m.Reference()); err != nil { + log.Printf("failed to send messages with %v", err) + } +} diff --git a/config.go b/config.go new file mode 100644 index 0000000..4bcc40a --- /dev/null +++ b/config.go @@ -0,0 +1,35 @@ +package main + +import ( + "errors" + "log" + "os" + + "github.com/joho/godotenv" +) + +type Config struct { + Token string + GIFURL string +} + +func loadConfig() (Config, error) { + if err := godotenv.Load(); err != nil { + log.Printf(".env file is missing, using environment variable") + } + + botToken := os.Getenv("DISCORD_TOKEN") + if len(botToken) == 0 { + return Config{}, errors.New("bot token is empty") + } + + giflink := os.Getenv("KEEP_YOUR_SECRETS") + if len(giflink) == 0 { + return Config{}, errors.New("GIFURL is empty") + } + + return Config{ + Token: botToken, + GIFURL: giflink, + }, nil +} diff --git a/main.go b/main.go index 16b60f9..1a04b62 100644 --- a/main.go +++ b/main.go @@ -5,74 +5,48 @@ import ( "log" "os" "os/signal" - "strings" + "syscall" "github.com/bwmarrin/discordgo" - "github.com/joho/godotenv" ) -var KeepYourSecrets string - func main() { - err := godotenv.Load() - if err != nil { - log.Fatalf("failed to load env file %s", err) + if err := run(); err != nil { + log.Fatalf("exiting with error: %v", err) } +} - botToken := os.Getenv("DISCORD_TOKEN") - if len(botToken) == 0 { - log.Fatal("bot token is empty") - } - KeepYourSecrets = os.Getenv("KEEP_YOUR_SECRETS") - if len(KeepYourSecrets) == 0 { - log.Fatal("gif link is empty") +func run() error { + cfg, err := loadConfig() + if err != nil { + return fmt.Errorf("config failed: %w", err) } - discord, err := discordgo.New("Bot " + botToken) + discord, err := discordgo.New("Bot " + cfg.Token) if err != nil { - log.Fatalf("failed to init bot with token %s", err) + return fmt.Errorf("bot failed to init: %w", err) } - discord.AddHandler(Ready) - discord.AddHandler(MessageWatcher) + bot := newBot(cfg) + discord.AddHandler(bot.onReady) + discord.AddHandler(bot.onMessage) discord.Identify.Intents = discordgo.IntentsMessageContent | discordgo.IntentsGuildMessages // open session err = discord.Open() if err != nil { - log.Fatalf("failed to open discord session, %s", err) + return fmt.Errorf("failed to open discord session: %w", err) } - // this runs after main + // executes after run returns defer discord.Close() - fmt.Println("Bot is running") + fmt.Println("bot is running") c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) + signal.Notify(c, syscall.SIGTERM) <-c -} -func Ready(session *discordgo.Session, ready *discordgo.Ready) { - user := ready.User - log.Printf("Logged in as %s", user.Username) -} - -func MessageWatcher(session *discordgo.Session, m *discordgo.MessageCreate) { - if m.Author.ID == session.State.User.ID { - return - } - if m.Author.Bot == true { - return - } - - userMessage := strings.ToLower(m.Content) - log.Printf("%s was sent by %s", userMessage, m.Author.Username) - - if strings.Contains(userMessage, "secret") { - _, err := session.ChannelMessageSendReply(m.ChannelID, KeepYourSecrets, m.Reference()) - if err != nil { - log.Fatalf("Failed to send messages with %s", err) - } - } + return nil } diff --git a/matcher.go b/matcher.go new file mode 100644 index 0000000..60aeb46 --- /dev/null +++ b/matcher.go @@ -0,0 +1,7 @@ +package main + +import "strings" + +func shouldReply(content string) bool { + return strings.Contains(strings.ToLower(content), "secret") +}