package main import ( "container/ring" "flag" "fmt" "log" "strings" "time" tdr "dim13.org/theo" irc "github.com/fluffle/goirc/client" ) var ( // server = flag.String("server", "irc.rusnet.org.ru:6660", "IRC Server") // room = flag.String("room", "#lor", "IRC Channel") server = flag.String("server", "irc.stealth.net:6668", "IRC Server") room = flag.String("room", "#mbi", "IRC Channel") name = flag.String("name", "MbI", "Bot Name") ) var buffer = ring.New(10) func init() { flag.Parse() } var cmds = map[string]irc.HandlerFunc{ "last": last, "theo": theo, "news": news, } func last(conn *irc.Conn, line *irc.Line) { buffer.Do(func(v interface{}) { if v != nil { l := v.(*irc.Line) s := fmt.Sprintf("%v <%v> %v", l.Time.Format(time.Kitchen), l.Nick, l.Text()) conn.Privmsg(line.Nick, s) } }) } func theo(conn *irc.Conn, line *irc.Line) { conn.Privmsg(line.Target(), tdr.Theo()) } func news(conn *irc.Conn, line *irc.Line) { n := 0 if line.Public() { n = 3 } for _, s := range FetchNews(n) { conn.Privmsg(line.Target(), s) } } func privmsg(conn *irc.Conn, line *irc.Line) { log.Println(line) if line.Public() && line.Nick != conn.Me().Nick { buffer.Value = line buffer = buffer.Next() } if f := strings.Fields(line.Text()); len(f) > 0 { if c, ok := cmds[f[0]]; ok { c(conn, line) } } if strings.Contains(line.Text(), "http") { s := line.Text() if i := strings.Index(s, "http"); i >= 0 { s = s[i:] } if i := strings.IndexAny(s, " ,"); i > 0 { s = s[:i] } if t, err := FetchTitle(s); err == nil { conn.Privmsg(line.Target(), "Title: "+t) } } } func main() { c := irc.SimpleClient(*name) quit := make(chan bool) c.HandleFunc(irc.DISCONNECTED, func(conn *irc.Conn, line *irc.Line) { quit <- true }) c.HandleFunc(irc.CONNECTED, func(conn *irc.Conn, line *irc.Line) { conn.Join(*room) }) c.HandleFunc(irc.PRIVMSG, privmsg) if err := c.ConnectTo(*server); err != nil { log.Fatal(err) } <-quit }