Change-Id: If519e789a91fbf427373daa383c6ae00ba5e0b6c Reviewed-on: https://cl.tvl.fyi/c/depot/+/2007 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in>
		
			
				
	
	
		
			99 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package main
 | 
						|
 | 
						|
import (
 | 
						|
	"crypto/tls"
 | 
						|
	"encoding/json"
 | 
						|
	"fmt"
 | 
						|
	"log"
 | 
						|
	"os"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/go-redis/redis"
 | 
						|
	"gopkg.in/irc.v3"
 | 
						|
)
 | 
						|
 | 
						|
var messageBeat chan bool
 | 
						|
 | 
						|
func main() {
 | 
						|
	conn, err := tls.Dial("tcp", "bnc.irccloud.com:6697", nil)
 | 
						|
	if err != nil {
 | 
						|
		log.Fatalln(err)
 | 
						|
	}
 | 
						|
 | 
						|
	messageBeat = make(chan bool)
 | 
						|
	go ircKeepalive()
 | 
						|
 | 
						|
	redisc := redis.NewClient(&redis.Options{
 | 
						|
		Addr:     fmt.Sprintf("127.0.0.1:%d", 6379),
 | 
						|
		Password: "", // no password set
 | 
						|
		DB:       0,  // use default DB
 | 
						|
	})
 | 
						|
 | 
						|
	go func() {
 | 
						|
		for {
 | 
						|
			time.Sleep(time.Second)
 | 
						|
			r := redisc.Ping()
 | 
						|
			if r.Err() != nil {
 | 
						|
				redisc = redis.NewClient(&redis.Options{
 | 
						|
					Addr:     fmt.Sprintf("127.0.0.1:%d", 6379),
 | 
						|
					Password: "", // no password set
 | 
						|
					DB:       0,  // use default DB
 | 
						|
				})
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}()
 | 
						|
 | 
						|
	config := irc.ClientConfig{
 | 
						|
		Nick: "Benjojo",
 | 
						|
		Pass: os.Getenv("IRCCLOUD"),
 | 
						|
		User: "Benjojo",
 | 
						|
		Name: "Ben Cox",
 | 
						|
		Handler: irc.HandlerFunc(func(c *irc.Client, m *irc.Message) {
 | 
						|
			b, _ := json.Marshal(m)
 | 
						|
			// log.Printf("%#v", string(b))
 | 
						|
 | 
						|
			messageBeat <- true
 | 
						|
			res := redisc.Publish("irccloud", string(b))
 | 
						|
			if res.Err() != nil {
 | 
						|
				log.Printf("Publish error! %#v", err)
 | 
						|
			}
 | 
						|
			// if m.Command == "001" {
 | 
						|
			// 	// 001 is a welcome event, so we join channels there
 | 
						|
			// 	// c.Write("JOIN #bot-test-chan")
 | 
						|
			// } else if m.Command == "PRIVMSG" && c.FromChannel(m) {
 | 
						|
			// 	// // Create a handler on all messages.
 | 
						|
			// 	// c.WriteMessage(&irc.Message{
 | 
						|
			// 	// 	Command: "PRIVMSG",
 | 
						|
			// 	// 	Params: []string{
 | 
						|
			// 	// 		m.Params[0],
 | 
						|
			// 	// 		m.Trailing(),
 | 
						|
			// 	// 	},
 | 
						|
			// 	// })
 | 
						|
			// }
 | 
						|
		}),
 | 
						|
	}
 | 
						|
 | 
						|
	// Create the client
 | 
						|
	client := irc.NewClient(conn, config)
 | 
						|
	err = client.Run()
 | 
						|
	if err != nil {
 | 
						|
		log.Fatalln(err)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func ircKeepalive() {
 | 
						|
	tt := time.NewTimer(time.Second)
 | 
						|
	lastPing := time.Now()
 | 
						|
	for {
 | 
						|
		select {
 | 
						|
		case <-tt.C:
 | 
						|
			if time.Since(lastPing) > time.Minute*5 {
 | 
						|
				log.Fatalf("It's been too long since the last IRC message, blowing up")
 | 
						|
			}
 | 
						|
			break
 | 
						|
		case <-messageBeat:
 | 
						|
			lastPing = time.Now()
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
}
 |