package main import ( "flag" "fmt" "log" "strings" irc "github.com/fluffle/goirc/client" ) func notify(conn *irc.Conn, target string) chan string { const maxLen = 500 c := make(chan string, 1) go func() { for msg := range c { if len(msg) > maxLen { msg = msg[:maxLen] + "..." } log.Println("send", msg) conn.Notice(target, msg) } }() return c } func kicker(conn *irc.Conn, channel string) chan string { c := make(chan string, 1) go func() { for nick := range c { if nick != conn.Me().Nick { log.Println("kick", nick) conn.Kick(channel, nick) } } }() return c } func privmsg(note, kick chan string) irc.HandlerFunc { last := NewLastBuf(10) links := linker(note) return func(conn *irc.Conn, line *irc.Line) { switch t := line.Text(); { case isFlood(t): kick <- line.Nick case t == "last": c := notify(conn, line.Nick) last.Dump(c) close(c) case strings.HasPrefix(t, "s"): tofix := last.Last(line.Nick) if fixed := re(tofix, t); fixed != "" { note <- fmt.Sprintf("%v meant to say: %v", line.Nick, fixed) return } fallthrough default: links <- t last.Push(line.Time, line.Nick, t) } } } func main() { node := flag.String("node", "irc.freenode.org", "IRC Server") ssl := flag.Bool("ssl", false, "Use SSL") room := flag.String("room", "#lor", "IRC Channel") name := flag.String("name", "dim13", "Bots Name") flag.Parse() conf := irc.NewConfig(*name) conf.Server = *node conf.SSL = *ssl conn := irc.Client(conf) note := notify(conn, *room) kick := kicker(conn, *room) done := make(chan struct{}) conn.HandleFunc(irc.DISCONNECTED, func(_ *irc.Conn, _ *irc.Line) { close(done) }) conn.HandleFunc(irc.CONNECTED, func(conn *irc.Conn, _ *irc.Line) { conn.Join(*room) go Watch(note, Feeds) }) conn.HandleFunc(irc.PRIVMSG, privmsg(note, kick)) conn.HandleFunc(irc.KICK, func(conn *irc.Conn, _ *irc.Line) { conn.Join(*room) }) if err := conn.Connect(); err != nil { log.Fatal(err) } <-done }