aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristine Dodrill <me@christine.website>2018-12-08 09:10:55 -0800
committerChristine Dodrill <me@christine.website>2018-12-08 09:16:24 -0800
commitef3b5bdfe4c005758dd4aabcb3ef082270b03e19 (patch)
treef2bad4153525ac1b65f4101af363c1de7fd52c59
parent89a18d1e99ec7fd816ba7ab7755600e00f41664f (diff)
downloadx-ef3b5bdfe4c005758dd4aabcb3ef082270b03e19.tar.xz
x-ef3b5bdfe4c005758dd4aabcb3ef082270b03e19.zip
litbot
-rw-r--r--discord/frequency/main.go109
1 files changed, 109 insertions, 0 deletions
diff --git a/discord/frequency/main.go b/discord/frequency/main.go
new file mode 100644
index 0000000..cb1fc7b
--- /dev/null
+++ b/discord/frequency/main.go
@@ -0,0 +1,109 @@
+package main
+
+import (
+ "flag"
+ "fmt"
+ "log"
+ "os"
+ "os/signal"
+ "strings"
+ "syscall"
+ "time"
+
+ "github.com/bwmarrin/discordgo"
+ "github.com/garyburd/redigo/redis"
+ _ "github.com/joho/godotenv/autoload"
+)
+
+// Variables used for command line parameters
+var (
+ token = os.Getenv("DISCORD_TOKEN")
+ redisurl = os.Getenv("REDIS_URL")
+)
+
+func init() {
+ flag.Parse()
+}
+
+func main() {
+ // Create a new Discord session using the provided bot token.
+ dg, err := discordgo.New("Bot " + token)
+ if err != nil {
+ fmt.Println("error creating Discord session,", err)
+ return
+ }
+
+ p, err := NewPool(redisurl)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ // Register the messageCreate func as a callback for MessageCreate events.
+ dg.AddHandler(messageCreate(p))
+
+ // Open a websocket connection to Discord and begin listening.
+ err = dg.Open()
+ if err != nil {
+ fmt.Println("error opening connection,", err)
+ return
+ }
+
+ // Wait here until CTRL-C or other term signal is received.
+ 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.
+ dg.Close()
+}
+
+// This function will be called (due to AddHandler above) every time a new
+// message is created on any channel that the autenticated bot has access to.
+func messageCreate(p *redis.Pool) func(*discordgo.Session, *discordgo.MessageCreate) {
+ return func(s *discordgo.Session, m *discordgo.MessageCreate) {
+ // Ignore all messages created by the bot itself
+ // This isn't required in this specific example but it's a good practice.
+ if m.Author.ID == s.State.User.ID {
+ return
+ }
+
+ if strings.Contains(m.Content, "🅱️") {
+ go s.MessageReactionAdd(m.ChannelID, m.Message.ID, "🅱️")
+ }
+ if strings.Contains(m.Content, "shit") {
+ go s.MessageReactionAdd(m.ChannelID, m.Message.ID, "💩")
+ }
+ if strings.Contains(m.Content, "🔥") {
+ go s.MessageReactionAdd(m.ChannelID, m.Message.ID, "🔥")
+ }
+ if strings.Contains(strings.ToLower(m.Content), "lit") {
+ go s.MessageReactionAdd(m.ChannelID, m.Message.ID, "🔥")
+ }
+
+ conn := p.Get()
+ defer conn.Close()
+
+ _, err := conn.Do("INCR", "counts:"+m.Author.ID)
+ if err != nil {
+ log.Fatal(err)
+ }
+ log.Println(m.Author.ID, m.ChannelID, m.ContentWithMentionsReplaced())
+ }
+}
+
+// NewPool creates a new redis pool with default "sane" settings.
+func NewPool(uri string) (*redis.Pool, error) {
+ return &redis.Pool{
+ MaxIdle: 3,
+ IdleTimeout: 4 * time.Minute,
+ Dial: func() (redis.Conn, error) { return redis.DialURL(uri) },
+ TestOnBorrow: func(c redis.Conn, t time.Time) error {
+ if time.Since(t) < time.Minute {
+ return nil
+ }
+ _, err := c.Do("PING")
+ return err
+ },
+ }, nil
+}