package main import ( "flag" "fmt" "log" "strings" irc "github.com/fluffle/goirc/client" ) type Notify struct { conn *irc.Conn target string } func NewNotify(conn *irc.Conn, target string) *Notify { return &Notify{conn: conn, target: target} } func (n *Notify) Write(p []byte) (int, error) { const maxLen = 500 sz := len(p) if sz > maxLen { p = append(p[:maxLen], []byte("...")...) } log.Println("Send", p) n.conn.Notice(n.target, string(p)) return sz, nil } func privmsg(room string) irc.HandlerFunc { last := make(map[string]string) return func(conn *irc.Conn, line *irc.Line) { switch t := line.Text(); { case isFlood(t): if line.Nick != conn.Me().Nick { log.Println("Kick", line.Nick) conn.Kick(room, line.Nick) } case strings.HasPrefix(t, "s"): global := strings.HasSuffix(t, "g") if tofix, ok := last[line.Nick]; ok { fixed := re(tofix, t[1:], global) if fixed != "" && fixed != tofix { fmt.Fprintf(NewNotify(conn, line.Target()), "%v meant to say: %q", line.Nick, fixed) last[line.Nick] = fixed } } default: for _, v := range getLinks(t) { title, err := getTitle(v) if err != nil { log.Println(v, err) } if title != "" { fmt.Fprintf(NewNotify(conn, line.Target()), "Title: %v", title) } } last[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) 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) Watch(NewNotify(conn, *room), Feeds) }) conn.HandleFunc(irc.PRIVMSG, privmsg(*room)) conn.HandleFunc(irc.KICK, func(conn *irc.Conn, _ *irc.Line) { conn.Join(*room) }) if err := conn.Connect(); err != nil { log.Fatal(err) } <-done }