package main import ( "container/ring" "fmt" "log" "strconv" "strings" "time" "dim13.org/theo" "github.com/thoj/go-ircevent" ) const ( server = "irc.rusnet.org.ru:6660" room = "#lor" name = "theo" ) var ( buffer = ring.New(10) cmds = make(map[string]CmdFn) dscr []string lastNews time.Time ) type CmdFn func(*irc.Event, []string) func last(e *irc.Event, _ []string) { conn := e.Connection nick := e.Nick buffer.Do(func(v interface{}) { if v != nil { ev := v.(*irc.Event) conn.Privmsgf(nick, "%v: %v", ev.Nick, ev.Message()) } }) } func metar(e *irc.Event, arg []string) { conn := e.Connection metar, err := FetchMetar(arg[0]) if err != nil { conn.Privmsg(room, err.Error()) } else { conn.Privmsg(room, metar[1]) } } func help(e *irc.Event, _ []string) { for _, m := range dscr { e.Connection.Privmsg(room, m) } } func news(e *irc.Event, arg []string) { conn := e.Connection n := 5 if len(arg) > 0 { i, err := strconv.Atoi(arg[0]) if err == nil { n = i } } if time.Since(lastNews) > time.Minute { for _, n := range FetchNews(n) { conn.Privmsg(room, n) lastNews = time.Now() } } else { conn.Privmsg(room, e.Nick+", me just said it") } } func register(cmd string, f func(*irc.Event, []string), help string) { cmds[cmd] = f h := fmt.Sprintf("!%v %v", cmd, help) dscr = append(dscr, h) } func privmsg(e *irc.Event) { conn := e.Connection msg := e.Message() nick := e.Nick log.Println(nick, msg) switch msg[0] { case '!': arg := strings.Fields(msg[1:]) if cmd, ok := cmds[arg[0]]; ok { go cmd(e, arg[1:]) } default: if strings.Contains(msg, name) { conn.Privmsg(room, theo.Theo()) } buffer.Value = e buffer = buffer.Next() } } func init() { register("last", last, "shows last 10 messages") register("metar", metar, " shows weather report") register("help", help, "shows this message") register("top", news, "shows top 10 news") } // 001 Welcome // 332 Topic // 333 Unix Time // 353 Names list // 366 End of NAMES List // JOIN // CTCP_ACTION /me // PRIVMSG func main() { con := irc.IRC(name, name) err := con.Connect(server) if err != nil { log.Fatal(err) } con.AddCallback("001", func(e *irc.Event) { e.Connection.Join(room) log.Println("joined", room) }) con.AddCallback("PRIVMSG", privmsg) con.Loop() }