From 6f756f7f5e0f196476ea2b7910d38e6bab6e2f47 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sun, 25 Dec 2016 10:52:43 +0100 Subject: wip --- main.go | 97 +++++++++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 65 insertions(+), 32 deletions(-) diff --git a/main.go b/main.go index e1fd32f..79fd538 100644 --- a/main.go +++ b/main.go @@ -10,28 +10,61 @@ import ( irc "github.com/fluffle/goirc/client" ) -const maxLen = 500 +type bot struct { + room string + conn *irc.Conn + notice chan string + kick chan string + last *ring.Ring +} -var buffer = ring.New(10) +func New(name, node, room string, ssl bool) *bot { + conf := irc.NewConfig(name) + conf.Server = node + conf.SSL = ssl + conn := irc.Client(conf) + return &bot{ + room: room, + conn: conn, + notice: notify(conn, room), + kick: kicker(conn, room), + last: ring.New(10), + } +} -func push(l *irc.Line) { - buffer.Value = l - buffer = buffer.Next() +func (b *bot) push(line *irc.Line) { + b.last.Value = line + b.last = b.last.Next() +} + +func (b *bot) find(c chan string, nick string) { + var msg string + b.last.Do(func(v interface{}) { + if v != nil { + l := v.(*irc.Line) + if l.Nick == nick { + msg = l.Text() + } + } + }) + if msg != "" { + c <- msg + } } -func last(target string) { - buffer.Do(func(v interface{}) { +func (b *bot) lastMsgs(c chan string) { + b.last.Do(func(v interface{}) { if v != nil { l := v.(*irc.Line) - s := fmt.Sprintf("%v <%v> %v", + c <- fmt.Sprintf("%v <%v> %v", l.Time.UTC().Format(time.Kitchen), l.Nick, l.Text()) - conn.Notice(target, s) } }) } func notify(conn *irc.Conn, target string) chan string { + const maxLen = 500 c := make(chan string, 1) go func() { for msg := range c { @@ -58,9 +91,9 @@ func kicker(conn *irc.Conn, channel string) chan string { return c } -func join(room string) irc.HandlerFunc { +func (b *bot) join() irc.HandlerFunc { return func(conn *irc.Conn, _ *irc.Line) { - conn.Join(room) + conn.Join(b.room) } } @@ -70,16 +103,21 @@ func discon(c chan struct{}) irc.HandlerFunc { } } -func privmsg(n, k chan string, room string) irc.HandlerFunc { - l := links(n) +func (b *bot) privmsg() irc.HandlerFunc { + l := links(b.notice) return func(conn *irc.Conn, line *irc.Line) { if isFlood(line.Text()) { - k <- line.Nick + b.kick <- line.Nick } - if line.Text() == "last" { - last(line.Nick) - } else { - push(line) + switch line.Text() { + case "last": + c := notify(conn, line.Nick) + defer close(c) + b.lastMsgs(c) + case "find": + b.find(b.notice, line.Nick) + default: + b.push(line) } l <- line.Text() } @@ -92,15 +130,10 @@ func main() { name := flag.String("name", "dim13", "Bots Name") flag.Parse() - conf := irc.NewConfig(*name) - conf.Server = *node - conf.SSL = *ssl - conn := irc.Client(conf) - //conn.EnableStateTracking() // XXX + b := New(*name, *node, *room, *ssl) + done := make(chan struct{}) - n := notify(conn, *room) - k := kicker(conn, *room) - go Watch(n, Feeds) // TODO shall it be there? + go Watch(b.notice, Feeds) // TODO shall it be there? // setup event handler handler := []struct { @@ -108,19 +141,19 @@ func main() { f irc.HandlerFunc }{ {irc.DISCONNECTED, discon(done)}, - {irc.CONNECTED, join(*room)}, - {irc.KICK, join(*room)}, - {irc.PRIVMSG, privmsg(n, k, *room)}, + {irc.CONNECTED, b.join()}, + {irc.KICK, b.join()}, + {irc.PRIVMSG, b.privmsg()}, } for _, h := range handler { - conn.HandleFunc(h.ev, h.f) + b.conn.HandleFunc(h.ev, h.f) } - log.Println("Connect to", conf.Server) - if err := conn.Connect(); err != nil { + if err := b.conn.Connect(); err != nil { log.Fatal(err) } + log.Println("Connected") <-done log.Println("Disconnected") } -- cgit v1.2.3