From c2eaea7276945057ac18b31d06b79a6326932b57 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Tue, 20 Dec 2016 23:50:27 +0100 Subject: cleanup main --- main.go | 84 +++++++++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 61 insertions(+), 23 deletions(-) (limited to 'main.go') diff --git a/main.go b/main.go index 0ca82c3..442ef56 100644 --- a/main.go +++ b/main.go @@ -7,45 +7,83 @@ import ( irc "github.com/fluffle/goirc/client" ) -func main() { - node := flag.String("node", "irc.freenode.org:6667", "IRC Server") - room := flag.String("room", "#lor", "IRC Channel") - name := flag.String("name", "dim13", "Bots Name") - flag.Parse() - - c := irc.SimpleClient(*name) - c.EnableStateTracking() +func notify(conn *irc.Conn, target string) chan string { + c := make(chan string) + go func() { + for msg := range c { + conn.Notice(target, msg) + } + }() + return c +} - discon := make(chan struct{}) - c.HandleFunc(irc.DISCONNECTED, func(conn *irc.Conn, line *irc.Line) { - close(discon) - }) +func kicker(conn *irc.Conn, target string) chan string { + c := make(chan string) + go func() { + for nick := range c { + conn.Kick(target, nick) + } + }() + return c +} - c.HandleFunc(irc.CONNECTED, func(conn *irc.Conn, line *irc.Line) { - conn.Join(*room) - go WatchNews(conn, *room) - }) +func join(room string) irc.HandlerFunc { + return func(conn *irc.Conn, _ *irc.Line) { + conn.Join(room) + } +} - c.HandleFunc(irc.KICK, func(conn *irc.Conn, line *irc.Line) { - conn.Join(*room) - }) +func discon(c chan struct{}) irc.HandlerFunc { + return func(_ *irc.Conn, _ *irc.Line) { + close(c) + } +} - c.HandleFunc(irc.PRIVMSG, func(conn *irc.Conn, line *irc.Line) { +func privmsg(room string) irc.HandlerFunc { + return func(conn *irc.Conn, line *irc.Line) { go Dispatch(conn, line) go Links(conn, line) if line.Public() && line.Nick != conn.Me().Nick { if isFlood(line.Text()) { log.Println("flood", line.Nick) - conn.Kick(*room, line.Nick, "flood") + conn.Kick(room, line.Nick, "flood") } Push(line) } - }) + } +} + +func main() { + node := flag.String("node", "irc.freenode.org:6667", "IRC Server") + room := flag.String("room", "#lor", "IRC Channel") + name := flag.String("name", "dim13", "Bots Name") + flag.Parse() + + c := irc.SimpleClient(*name) + c.EnableStateTracking() // XXX + done := make(chan struct{}) + + // setup event handler + handler := []struct { + ev string + f irc.HandlerFunc + }{ + {irc.DISCONNECTED, discon(done)}, + {irc.CONNECTED, join(*room)}, + {irc.KICK, join(*room)}, + {irc.PRIVMSG, privmsg(*room)}, + } + for _, h := range handler { + c.HandleFunc(h.ev, h.f) + } log.Println("Connect to", *node) if err := c.ConnectTo(*node); err != nil { log.Fatal(err) } - <-discon + + go WatchNews(c, *room) + + <-done log.Println("Disconnected") } -- cgit v1.2.3