2021-05-18 12:11:30 +02:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"log"
|
|
|
|
"os"
|
|
|
|
"os/signal"
|
2021-05-31 11:43:27 +02:00
|
|
|
"strconv"
|
2021-05-18 12:11:30 +02:00
|
|
|
"syscall"
|
2021-05-31 10:58:16 +02:00
|
|
|
"time"
|
2021-05-18 12:11:30 +02:00
|
|
|
|
|
|
|
"github.com/bwmarrin/discordgo"
|
2021-05-31 10:58:16 +02:00
|
|
|
"quenten.nl/pepebot/limiter"
|
2021-05-18 12:11:30 +02:00
|
|
|
"quenten.nl/pepebot/models/mysql"
|
|
|
|
)
|
|
|
|
|
|
|
|
/* Application struct contains the logging objects.
|
|
|
|
It also has many methods for the different functions of the bot.
|
|
|
|
These methods are mostly located in discord.go */
|
|
|
|
type application struct {
|
2021-05-31 10:58:16 +02:00
|
|
|
errorLog *log.Logger
|
|
|
|
infoLog *log.Logger
|
|
|
|
badwords *mysql.BadwordModel
|
|
|
|
adminroles *mysql.AdminRolesModel
|
|
|
|
trigger string
|
2021-05-18 12:11:30 +02:00
|
|
|
allBadWords map[string][]string
|
2021-09-08 22:32:36 +02:00
|
|
|
pepeServer string
|
2021-05-31 10:58:16 +02:00
|
|
|
limiter *limiter.Limiter
|
2021-05-25 11:15:41 +02:00
|
|
|
|
|
|
|
active bool
|
2021-05-31 10:58:16 +02:00
|
|
|
stop bool
|
2021-05-18 12:11:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
dbUser := os.Getenv("DB_USER")
|
|
|
|
dbPass := os.Getenv("DB_PASS")
|
|
|
|
discordToken := os.Getenv("DISCORD_TOKEN")
|
2021-05-31 11:43:27 +02:00
|
|
|
rateLimit := os.Getenv("RATE_LIMIT")
|
|
|
|
timeLimit := os.Getenv("TIME_LIMIT")
|
2021-09-08 22:32:36 +02:00
|
|
|
pepeServer := os.Getenv("PEPE_SERVER")
|
2021-05-18 12:11:30 +02:00
|
|
|
dsn := fmt.Sprintf("%s:%s@tcp(db:3306)/badwords?parseTime=true", dbUser, dbPass)
|
|
|
|
infoLog := log.New(os.Stdout, "INFO\t", log.Ldate|log.Ltime)
|
|
|
|
errorLog := log.New(os.Stderr, "ERROR\t", log.Ldate|log.Ltime|log.Lshortfile)
|
|
|
|
|
|
|
|
db, err := openDB(dsn)
|
|
|
|
if err != nil {
|
|
|
|
errorLog.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2021-05-31 11:43:27 +02:00
|
|
|
rateLim, err := strconv.Atoi(rateLimit)
|
|
|
|
if err != nil {
|
|
|
|
errorLog.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
timeLim, err := strconv.Atoi(timeLimit)
|
|
|
|
if err != nil {
|
|
|
|
errorLog.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2021-05-31 10:58:16 +02:00
|
|
|
limiter := &limiter.Limiter{
|
2021-05-31 11:43:27 +02:00
|
|
|
RateLimit: rateLim,
|
|
|
|
TimeLimit: time.Duration(timeLim * int(time.Second)),
|
2021-05-31 11:21:30 +02:00
|
|
|
Logs: make(map[string][]*limiter.Action),
|
2021-05-31 10:58:16 +02:00
|
|
|
}
|
|
|
|
|
2021-05-18 12:11:30 +02:00
|
|
|
app := &application{
|
2021-05-31 10:58:16 +02:00
|
|
|
infoLog: infoLog,
|
|
|
|
errorLog: errorLog,
|
|
|
|
badwords: &mysql.BadwordModel{DB: db},
|
2021-05-18 12:11:30 +02:00
|
|
|
adminroles: &mysql.AdminRolesModel{DB: db},
|
2021-05-31 10:58:16 +02:00
|
|
|
trigger: "!pepe",
|
|
|
|
limiter: limiter,
|
2021-09-08 22:32:36 +02:00
|
|
|
pepeServer: pepeServer,
|
2021-05-18 12:11:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
app.allBadWords, err = app.badwords.AllWords()
|
|
|
|
if err != nil {
|
|
|
|
app.errorLog.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
/* token, err := app.readAuthToken()
|
|
|
|
if err != nil {
|
|
|
|
app.errorLog.Fatal(err)
|
|
|
|
} */
|
|
|
|
|
|
|
|
discord, err := discordgo.New("Bot " + discordToken)
|
|
|
|
if err != nil {
|
|
|
|
app.errorLog.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
discord.AddHandler(app.messageCreate)
|
|
|
|
|
|
|
|
discord.Identify.Intents = discordgo.IntentsGuildMessages
|
|
|
|
|
|
|
|
err = discord.Open()
|
|
|
|
if err != nil {
|
|
|
|
app.errorLog.Fatal(err)
|
|
|
|
}
|
|
|
|
defer discord.Close()
|
|
|
|
|
|
|
|
fmt.Println("Bot is now running. Press CTRL-C to exit.")
|
|
|
|
sc := make(chan os.Signal, 1)
|
|
|
|
signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill)
|
|
|
|
<-sc
|
|
|
|
|
|
|
|
// Cleanly close down the Discord session.
|
|
|
|
discord.Close()
|
|
|
|
}
|