Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions bot.go
Original file line number Diff line number Diff line change
@@ -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)
}
}
35 changes: 35 additions & 0 deletions config.go
Original file line number Diff line number Diff line change
@@ -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
}
62 changes: 18 additions & 44 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
7 changes: 7 additions & 0 deletions matcher.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package main

import "strings"

func shouldReply(content string) bool {
return strings.Contains(strings.ToLower(content), "secret")
}
Loading