package main import ( "fmt" "log" "strings" "dim13.org/rfc" irc "github.com/fluffle/goirc/client" ) type RFC struct{} var ( rfcMap = make(map[int]rfc.Entry) rfcKW = make(map[string][]string) ) func (_ RFC) Handle(conn *irc.Conn, line *irc.Line) { if f := strings.Fields(line.Text()); len(f) > 1 { kw := strings.ToLower(f[1]) if e, ok := rfcKW[kw]; ok { if line.Public() && len(e) > 10 { n := fmt.Sprint("... ", len(e), " total") e = append(e[:10], n) } s := strings.Join(e, ", ") conn.Notice(line.Target(), s) } else { conn.Notice(line.Target(), "no matches") } } } func (_ RFC) Help() string { return "search rfc by keyword (msg privat to see all matches)" } func ExtractRFC(conn *irc.Conn, line *irc.Line) { for _, v := range strings.Fields(line.Text()) { var id int w := strings.ToUpper(v) if _, err := fmt.Sscanf(w, "RFC%d", &id); err == nil { if entry, ok := rfcMap[id]; ok { s := fmt.Sprint(entry) conn.Notice(line.Target(), s) } } } } func init() { fd, err := rfc.Open() if err != nil { log.Fatal(err) } entries, err := rfc.Decode(fd) if err != nil { log.Fatal(err) } for _, e := range entries { id := e.ID() rfcMap[id] = e for _, w := range e.Keywords { for _, f := range strings.Fields(w) { kw := strings.ToLower(f) rfcKW[kw] = append(rfcKW[kw], e.DocID) } } } Register("rfc", &RFC{}) }