summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'main.go')
-rw-r--r--main.go85
1 files changed, 60 insertions, 25 deletions
diff --git a/main.go b/main.go
index 84b0d6b..d7c6e38 100644
--- a/main.go
+++ b/main.go
@@ -7,45 +7,80 @@ import (
irc "github.com/fluffle/goirc/client"
)
+func notify(conn *irc.Conn, target string) chan string {
+ const maxLen = 500
+ c := make(chan string, 1)
+ go func() {
+ for msg := range c {
+ if len(msg) > maxLen {
+ msg = msg[:maxLen] + "..."
+ }
+ log.Println("send", msg)
+ conn.Notice(target, msg)
+ }
+ }()
+ return c
+}
+
+func kicker(conn *irc.Conn, channel string) chan string {
+ c := make(chan string, 1)
+ go func() {
+ for nick := range c {
+ if nick != conn.Me().Nick {
+ log.Println("kick", nick)
+ conn.Kick(channel, nick)
+ }
+ }
+ }()
+ return c
+}
+
+func privmsg(note, kick chan string) irc.HandlerFunc {
+ links := linker(note)
+ return func(conn *irc.Conn, line *irc.Line) {
+ switch t := line.Text(); {
+ case isFlood(t):
+ kick <- line.Nick
+ default:
+ links <- t
+ }
+ }
+}
+
func main() {
- node := flag.String("node", "irc.freenode.org:6667", "IRC Server")
+ node := flag.String("node", "irc.freenode.org", "IRC Server")
+ ssl := flag.Bool("ssl", false, "Use SSL")
room := flag.String("room", "#lor", "IRC Channel")
name := flag.String("name", "dim13", "Bots Name")
flag.Parse()
- c := irc.SimpleClient(*name)
- c.EnableStateTracking()
+ conf := irc.NewConfig(*name)
+ conf.Server = *node
+ conf.SSL = *ssl
+ conn := irc.Client(conf)
- discon := make(chan struct{})
- c.HandleFunc(irc.DISCONNECTED, func(conn *irc.Conn, line *irc.Line) {
- close(discon)
- })
+ note := notify(conn, *room)
+ kick := kicker(conn, *room)
- c.HandleFunc(irc.CONNECTED, func(conn *irc.Conn, line *irc.Line) {
- conn.Join(*room)
- ShowNews(conn, *room)
+ done := make(chan struct{})
+
+ conn.HandleFunc(irc.DISCONNECTED, func(_ *irc.Conn, _ *irc.Line) {
+ close(done)
})
- c.HandleFunc(irc.KICK, func(conn *irc.Conn, line *irc.Line) {
+ conn.HandleFunc(irc.CONNECTED, func(conn *irc.Conn, _ *irc.Line) {
conn.Join(*room)
+ go Watch(note, Feeds)
})
- c.HandleFunc(irc.PRIVMSG, func(conn *irc.Conn, line *irc.Line) {
- go Dispatch(conn, line)
- go ExtractLinks(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")
- }
- Push(line)
- }
+ conn.HandleFunc(irc.PRIVMSG, privmsg(note, kick))
+
+ conn.HandleFunc(irc.KICK, func(conn *irc.Conn, _ *irc.Line) {
+ conn.Join(*room)
})
- log.Println("Connect to", *node)
- if err := c.ConnectTo(*node); err != nil {
+ if err := conn.Connect(); err != nil {
log.Fatal(err)
}
- <-discon
- log.Println("Disconnected")
+ <-done
}