package main import ( "flag" "log" irc "github.com/fluffle/goirc/client" ) func notify(conn *irc.Conn, target string) chan string { c := make(chan string) go func() { for msg := range c { conn.Notice(target, msg) } }() return c } func kicker(conn *irc.Conn, channel string) chan string { c := make(chan string) go func() { for nick := range c { conn.Kick(channel, nick) } }() return c } func join(room string) irc.HandlerFunc { return func(conn *irc.Conn, _ *irc.Line) { conn.Join(room) } } func discon(c chan struct{}) irc.HandlerFunc { return func(_ *irc.Conn, _ *irc.Line) { close(c) } } func privmsg(room string) irc.HandlerFunc { return func(conn *irc.Conn, line *irc.Line) { go Links(conn, line) if line.Public() && line.Nick != conn.Me().Nick { if isFlood(line.Text()) { log.Println("flood", line.Nick) conn.Kick(room, line.Nick, "flood") } } } } func main() { node := flag.String("node", "irc.freenode.org:6667", "IRC Server") room := flag.String("room", "#lor", "IRC Channel") name := flag.String("name", "dim13", "Bots Name") flag.Parse() c := irc.SimpleClient(*name) c.EnableStateTracking() // XXX done := make(chan struct{}) // setup event handler handler := []struct { ev string f irc.HandlerFunc }{ {irc.DISCONNECTED, discon(done)}, {irc.CONNECTED, join(*room)}, {irc.KICK, join(*room)}, {irc.PRIVMSG, privmsg(*room)}, } for _, h := range handler { c.HandleFunc(h.ev, h.f) } log.Println("Connect to", *node) if err := c.ConnectTo(*node); err != nil { log.Fatal(err) } n := notify(c, *room) go watchNews(n) <-done log.Println("Disconnected") }