From ef3b5bdfe4c005758dd4aabcb3ef082270b03e19 Mon Sep 17 00:00:00 2001 From: Christine Dodrill Date: Sat, 8 Dec 2018 09:10:55 -0800 Subject: litbot --- discord/frequency/main.go | 109 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 discord/frequency/main.go 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 +} -- cgit v1.2.3