Add all the bot logic
This commit is contained in:
parent
0517c2ef75
commit
5e9f3d2c75
5
go.mod
5
go.mod
|
@ -1,3 +1,8 @@
|
||||||
module kolaente.dev/konrad/discord-kaenguru
|
module kolaente.dev/konrad/discord-kaenguru
|
||||||
|
|
||||||
go 1.16
|
go 1.16
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/bwmarrin/discordgo v0.23.2 // indirect
|
||||||
|
github.com/dustin/go-humanize v1.0.0 // indirect
|
||||||
|
)
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
github.com/bwmarrin/discordgo v0.23.2 h1:BzrtTktixGHIu9Tt7dEE6diysEF9HWnXeHuoJEt2fH4=
|
||||||
|
github.com/bwmarrin/discordgo v0.23.2/go.mod h1:c1WtWUGN6nREDmzIpyTp/iD3VYt4Fpx+bVyfBG7JE+M=
|
||||||
|
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
|
||||||
|
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||||
|
github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
|
||||||
|
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||||
|
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=
|
|
@ -0,0 +1,159 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/bwmarrin/discordgo"
|
||||||
|
"github.com/dustin/go-humanize"
|
||||||
|
"math/rand"
|
||||||
|
"os"
|
||||||
|
"os/signal"
|
||||||
|
"regexp"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"syscall"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
tokenEnvName = `DISCORD_TOKEN`
|
||||||
|
numberRegExConst = `([0-9](\.|,)?)+`
|
||||||
|
dmFactor = 2
|
||||||
|
omFactor = 2
|
||||||
|
omBlackMarketFactor = 4
|
||||||
|
davonHätteManDieDDREntschuldenKönnen = 172_000_000_000 * dmFactor * omFactor
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
moneyRegEx = regexp.MustCompile(`((kostet ?` + numberRegExConst + `)|(` + numberRegExConst + ` ?(€|euro)))`)
|
||||||
|
numberRegEx = regexp.MustCompile(numberRegExConst)
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
rand.Seed(time.Now().Unix())
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
bot, err := createBot()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Could not create bot:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
bot.AddHandler(messageOstmarkHandler)
|
||||||
|
err = bot.Open()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error opening Discord session: ", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait here until CTRL-C or other term signal is received.
|
||||||
|
fmt.Println("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.
|
||||||
|
_ = bot.Close()
|
||||||
|
|
||||||
|
fmt.Println("Bye!")
|
||||||
|
}
|
||||||
|
|
||||||
|
func createBot() (bot *discordgo.Session, err error) {
|
||||||
|
token := os.Getenv(tokenEnvName)
|
||||||
|
if token == "" {
|
||||||
|
return nil, fmt.Errorf("token cannot be empty. Please set the " + tokenEnvName + " env variable")
|
||||||
|
}
|
||||||
|
|
||||||
|
return discordgo.New("Bot " + token)
|
||||||
|
}
|
||||||
|
|
||||||
|
func messageOstmarkHandler(s *discordgo.Session, m *discordgo.MessageCreate) {
|
||||||
|
|
||||||
|
if m.Author.ID == s.State.User.ID {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
match := moneyRegEx.FindString(m.Message.Content)
|
||||||
|
|
||||||
|
if len(match) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
amountMatch := numberRegEx.FindString(match)
|
||||||
|
amountMatch = strings.ReplaceAll(amountMatch, ",", ".")
|
||||||
|
amount, err := strconv.ParseFloat(amountMatch, 64)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error parsing amount:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("Found amount: ", amount)
|
||||||
|
|
||||||
|
messages := []string{
|
||||||
|
"Ganze " + fmtCommaf(amount) + " €!",
|
||||||
|
}
|
||||||
|
|
||||||
|
currentMax := amount
|
||||||
|
stuffNum := 5 + rand.Int63n(95)
|
||||||
|
iter := 0
|
||||||
|
for {
|
||||||
|
messages = append(messages,
|
||||||
|
fmt.Sprintf("%s D-Mark", fmtCommaf(currentMax*dmFactor)),
|
||||||
|
fmt.Sprintf("%s Ostmark", fmtCommaf(currentMax*dmFactor*omFactor)),
|
||||||
|
fmt.Sprintf("%s Ostmark auf dem Schwarzmarkt", fmtCommaf(currentMax*dmFactor*omBlackMarketFactor)),
|
||||||
|
)
|
||||||
|
|
||||||
|
if currentMax > davonHätteManDieDDREntschuldenKönnen {
|
||||||
|
currentMax = currentMax * dmFactor * omBlackMarketFactor
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
currentMax = float64(stuffNum) * currentMax
|
||||||
|
|
||||||
|
messages = append(messages,
|
||||||
|
fmt.Sprintf("Dafür hätte man das gleiche Ding damals in der DDR bestimmt %s mal bekommen", fmtComma(stuffNum)),
|
||||||
|
fmt.Sprintf("Wenn man das heute %s mal kaufen will, müsste man %s € dafür ausgeben", fmtComma(stuffNum), fmtCommaf(currentMax)),
|
||||||
|
)
|
||||||
|
stuffNum = rand.Int63n(30) * stuffNum
|
||||||
|
|
||||||
|
if iter == 2 {
|
||||||
|
messages = append(messages, "Ich weiß was ihr denkt:")
|
||||||
|
}
|
||||||
|
|
||||||
|
iter++
|
||||||
|
}
|
||||||
|
|
||||||
|
messages = append(messages,
|
||||||
|
fmt.Sprintf("%s Ostmark!", fmtCommaf(currentMax)),
|
||||||
|
"Davon hätte man die DDR entschulden können!",
|
||||||
|
"So teuer ist das alles geworden!",
|
||||||
|
)
|
||||||
|
|
||||||
|
err = sendLoop(s, m.ChannelID, messages)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Could not send message: ", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func sendLoop(s *discordgo.Session, channelID string, messages []string) error {
|
||||||
|
for _, message := range messages {
|
||||||
|
time.Sleep(time.Duration(100+rand.Intn(1500)) * time.Millisecond)
|
||||||
|
if _, err := s.ChannelMessageSend(channelID, message); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func fmtCommaf(num float64) string {
|
||||||
|
if (num - float64(int64(num))) > 0 {
|
||||||
|
return humanize.FormatFloat("#.###,##", num)
|
||||||
|
}
|
||||||
|
|
||||||
|
return humanize.FormatFloat("#.###,", num)
|
||||||
|
}
|
||||||
|
|
||||||
|
func fmtComma(num int64) string {
|
||||||
|
return fmtCommaf(float64(num))
|
||||||
|
}
|
Loading…
Reference in New Issue