summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-12-20 23:50:27 +0100
committerDimitri Sokolyuk <demon@dim13.org>2016-12-20 23:50:27 +0100
commitc2eaea7276945057ac18b31d06b79a6326932b57 (patch)
tree874cb3ac5f3d40957fd84cc5be8ccfa23456acc1
parenta037c25326bceabc471f679ab2203d99e248ab0e (diff)
cleanup main
-rw-r--r--main.go84
1 files changed, 61 insertions, 23 deletions
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")
}