diff --git a/.gitignore b/.gitignore index 66fd13c..1921129 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,5 @@ # Dependency directories (remove the comment below to include it) # vendor/ + +.env diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..fb2b6a3 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,20 @@ +FROM golang:1.15-alpine as dev + +WORKDIR /go/src/prepbot +COPY ./go.mod . +COPY ./go.sum . + +RUN go mod download + +COPY . . +RUN go install github.com/dustinpianalto/prepbot/... + +CMD [ "go", "run", "cmd/prepbot/main.go"] + +from alpine + +WORKDIR /bin + +COPY --from=dev /go/bin/prepbot ./prepbot + +CMD [ "prepbot" ] diff --git a/cmd/prepbot/main.go b/cmd/prepbot/main.go new file mode 100644 index 0000000..6b158bc --- /dev/null +++ b/cmd/prepbot/main.go @@ -0,0 +1,79 @@ +package main + +import ( + "fmt" + "os" + "os/signal" + "syscall" + + "github.com/bwmarrin/discordgo" + "github.com/dustinpianalto/disgoman" + "github.com/dustinpianalto/prepbot/internal/exts/messages" +) + +func main() { + Token := os.Getenv("DISCORD_TOKEN") + dg, err := discordgo.New("Bot " + Token) + if err != nil { + fmt.Println("There was an error when creating the Discord Session, ", err) + return + } + dg.State.MaxMessageCount = 100 + dg.StateEnabled = true + + dg.Identify = discordgo.Identify{ + Intents: discordgo.MakeIntent(discordgo.IntentsAll), + } + + owners := []string{ + "351794468870946827", + } + + manager := disgoman.CommandManager{ + Prefixes: getPrefixes, + Owners: owners, + StatusManager: disgoman.GetDefaultStatusManager(), + ErrorChannel: make(chan disgoman.CommandError, 10), + Commands: make(map[string]*disgoman.Command), + IgnoreBots: true, + CheckPermissions: false, + } + + dg.AddHandler(messages.OnMessage) + + err = dg.Open() + if err != nil { + fmt.Println("There was an error opening the connection, ", err) + return + } + + // Start the Error handler in a goroutine + go ErrorHandler(manager.ErrorChannel) + + fmt.Println("The Bot is now running.") + sc := make(chan os.Signal, 1) + signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill) + <-sc + + fmt.Println("Shutting Down...") + err = dg.Close() + if err != nil { + fmt.Println(err) + } + +} + +func getPrefixes(guildID string) []string { + return []string{"!"} +} + +func ErrorHandler(ErrorChan chan disgoman.CommandError) { + for ce := range ErrorChan { + msg := ce.Message + if msg == "" { + msg = ce.Error.Error() + } + _, _ = ce.Context.Send(msg) + fmt.Println(ce.Error) + } +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..3250630 --- /dev/null +++ b/go.mod @@ -0,0 +1,8 @@ +module github.com/dustinpianalto/prepbot + +go 1.14 + +require ( + github.com/bwmarrin/discordgo v0.22.0 + github.com/dustinpianalto/disgoman v0.0.15 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..932b752 --- /dev/null +++ b/go.sum @@ -0,0 +1,10 @@ +github.com/bwmarrin/discordgo v0.20.2/go.mod h1:O9S4p+ofTFwB02em7jkpkV8M3R0/PUVOwN61zSZ0r4Q= +github.com/bwmarrin/discordgo v0.22.0 h1:uBxY1HmlVCsW1IuaPjpCGT6A2DBwRn0nvOguQIxDdFM= +github.com/bwmarrin/discordgo v0.22.0/go.mod h1:c1WtWUGN6nREDmzIpyTp/iD3VYt4Fpx+bVyfBG7JE+M= +github.com/dustinpianalto/disgoman v0.0.15 h1:kdIw6jhC82WBut7+4BarqxBw06dozU+Hu47LQzkkoGM= +github.com/dustinpianalto/disgoman v0.0.15/go.mod h1:v3FM6n+4dH9XlvO+IDx6MN3DUnGq6YVDBvy1A1k202g= +github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16 h1:y6ce7gCWtnH+m3dCjzQ1PCuwl28DDIc3VNnvY29DlIA= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= diff --git a/internal/exts/messages/message_events.go b/internal/exts/messages/message_events.go new file mode 100644 index 0000000..2fb293c --- /dev/null +++ b/internal/exts/messages/message_events.go @@ -0,0 +1,49 @@ +package messages + +import ( + "log" + "regexp" + "strings" + + "github.com/bwmarrin/discordgo" +) + +func OnMessage(s *discordgo.Session, message *discordgo.MessageCreate) { + defer func() { + if r := recover(); r != nil { + log.Println("Recovered from panic in OnMessage") + } + }() + if message.Author.Bot { + return + } + content := message.Content + amazonRegexString := `(http|https):\/\/((?:[\w-_\.]+)amazon(?:\.[\w\-_]+)+)([\w\/\-\.,@?^=%&~\+#]*[\w\-\@?^=%&/~\+#])?` + amazonRegex := regexp.MustCompile(amazonRegexString) + urls := amazonRegex.FindAllString(message.Content, -1) + if len(urls) == 0 { + return + } + for _, url := range urls { + if strings.Contains(url, "ref=") || strings.Contains(url, "?") { + parts := strings.Split(url, "/") + new := strings.Join(parts[:len(parts)-1], "/") + content = strings.ReplaceAll(content, url, new) + } + } + webhook, err := s.WebhookCreate(message.ChannelID, message.ID, "") + if err != nil { + return + } + defer s.WebhookDelete(webhook.ID) + params := &discordgo.WebhookParams{ + Content: content, + Username: message.Author.Username, + AvatarURL: message.Author.AvatarURL(""), + } + _, err = s.WebhookExecute(webhook.ID, webhook.Token, true, params) + if err != nil { + return + } + s.ChannelMessageDelete(message.ChannelID, message.ID) +}