From 7b96813780291a8d49b86469c4bd1290b253366d Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Tue, 7 Jul 2015 16:36:33 +0200 Subject: Switch to goirc --- main.go | 157 ++++++++++++++++++++++++++-------------------------------------- 1 file changed, 64 insertions(+), 93 deletions(-) (limited to 'main.go') diff --git a/main.go b/main.go index bfef975..ab058aa 100644 --- a/main.go +++ b/main.go @@ -5,130 +5,101 @@ import ( "flag" "fmt" "log" - "strconv" "strings" "time" - "dim13.org/theo" - "github.com/thoj/go-ircevent" + 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") - name = flag.String("name", "theo", "Bot Name") + // 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) - cmds = make(map[string]CmdFn) - dscr []string - lastNews time.Time -) +var buffer = ring.New(10) + +func init() { + flag.Parse() +} -type CmdFn func(*irc.Event, []string) +var cmds = map[string]irc.HandlerFunc{ + "last": last, + "theo": theo, + "news": news, +} -func last(e *irc.Event, _ []string) { - conn := e.Connection - nick := e.Nick +func last(conn *irc.Conn, line *irc.Line) { buffer.Do(func(v interface{}) { if v != nil { - ev := v.(*irc.Event) - conn.Privmsgf(nick, "%v: %v", ev.Nick, ev.Message()) + 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 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 theo(conn *irc.Conn, line *irc.Line) { + conn.Privmsg(line.Target(), tdr.Theo()) } -func help(e *irc.Event, _ []string) { - for _, m := range dscr { - e.Connection.Privmsg(*room, m) +func news(conn *irc.Conn, line *irc.Line) { + n := 0 + if line.Public() { + n = 3 } -} - -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 - } + for _, s := range FetchNews(n) { + conn.Privmsg(line.Target(), s) } - 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 +func privmsg(conn *irc.Conn, line *irc.Line) { + log.Println(line) - log.Println(nick, msg) + if line.Public() && line.Nick != conn.Me().Nick { + buffer.Value = line + buffer = buffer.Next() + } - switch msg[0] { - case '!': - arg := strings.Fields(msg[1:]) - if cmd, ok := cmds[arg[0]]; ok { - go cmd(e, arg[1:]) + if f := strings.Fields(line.Text()); len(f) > 0 { + if c, ok := cmds[f[0]]; ok { + c(conn, line) } - default: - if strings.Contains(msg, *name) { - conn.Privmsg(*room, theo.Theo()) + } + 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) } - buffer.Value = e - buffer = buffer.Next() } } -func init() { - flag.Parse() - 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") -} +func main() { + c := irc.SimpleClient(*name) -// 001 Welcome -// 332 Topic -// 333 Unix Time -// 353 Names list -// 366 End of NAMES List -// JOIN -// CTCP_ACTION /me -// PRIVMSG + quit := make(chan bool) + c.HandleFunc(irc.DISCONNECTED, + func(conn *irc.Conn, line *irc.Line) { quit <- true }) -func main() { - con := irc.IRC(*name, *name) - err := con.Connect(*server) - if err != nil { + 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) } - con.AddCallback("001", func(e *irc.Event) { - e.Connection.Join(*room) - log.Println("joined", *room) - }) - con.AddCallback("PRIVMSG", privmsg) - con.Loop() + + <-quit } -- cgit v1.2.3