package main import ( "flag" "log" 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 { links := linker(note) return func(conn *irc.Conn, line *irc.Line) { switch t := line.Text(); { case isFlood(t): kick <- line.Nick default: links <- 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 }