summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'main.go')
-rw-r--r--main.go80
1 files changed, 64 insertions, 16 deletions
diff --git a/main.go b/main.go
index f4f320e..c9ce13f 100644
--- a/main.go
+++ b/main.go
@@ -3,28 +3,75 @@ package main
import (
"crypto/tls"
"flag"
+ "io"
"log"
+ "sync"
"dim13.org/bot/internal/feeds"
+ "dim13.org/bot/internal/fix"
+ "dim13.org/bot/internal/flood"
+ "dim13.org/bot/internal/title"
irc "github.com/fluffle/goirc/client"
)
-type notify struct {
- conn *irc.Conn
- room string
+const maxLen = 450
+
+type limitString string
+
+func (s limitString) String() string {
+ r := []rune(s)
+ if sz := len(r); sz > maxLen {
+ r = append(r[:maxLen-3], []rune("...")...)
+ }
+ return string(r)
+}
+
+type room struct {
+ conn *irc.Conn
+ target string
}
-func newNotify(conn *irc.Conn, room string) *notify {
- return &notify{conn: conn, room: room}
+func roomWriter(conn *irc.Conn, target string) *room {
+ return &room{conn: conn, target: target}
}
-func (n *notify) Write(p []byte) (int, error) {
- n.conn.Notice(n.room, limitString(p).String())
+func (n *room) Write(p []byte) (int, error) {
+ n.conn.Notice(n.target, limitString(p).String())
return len(p), nil
}
-func (n *notify) Kick(nick string, message ...string) {
- n.conn.Kick(n.room, nick, message...)
+func (n *room) Kick(nick string, message ...string) {
+ n.conn.Kick(n.target, nick, message...)
+}
+
+type message struct {
+ title *title.Titles
+ flood *flood.Check
+ fix *fix.Fix
+}
+
+type kickWriter interface {
+ io.Writer
+ flood.Kicker
+}
+
+func msgHandler(w kickWriter) *message {
+ return &message{
+ title: title.New(w),
+ flood: flood.New(w),
+ fix: fix.New(w),
+ }
+}
+
+func (r *message) Handle(conn *irc.Conn, line *irc.Line) {
+ text, nick := line.Text(), line.Nick
+ // ignore self
+ if nick == conn.Me().Nick {
+ return
+ }
+ r.flood.Check(text, nick)
+ r.title.Parse(text)
+ r.fix.Fix(text, nick)
}
func main() {
@@ -42,26 +89,27 @@ func main() {
}
conn := irc.Client(conf)
- done := make(chan struct{})
+ var wg sync.WaitGroup
+ wg.Add(1)
conn.HandleFunc(irc.DISCONNECTED, func(_ *irc.Conn, _ *irc.Line) {
- close(done)
+ wg.Done()
})
- n := newNotify(conn, *room)
+ w := roomWriter(conn, *room)
conn.HandleFunc(irc.CONNECTED, func(conn *irc.Conn, _ *irc.Line) {
conn.Join(*room)
- feeds.Watch(n, feeds.Feeds)
+ feeds.Watch(w, feeds.Feeds)
})
- conn.HandleBG(irc.PRIVMSG, newRoom(n))
-
conn.HandleFunc(irc.KICK, func(conn *irc.Conn, _ *irc.Line) {
conn.Join(*room)
})
+ conn.HandleBG(irc.PRIVMSG, msgHandler(w))
+
if err := conn.Connect(); err != nil {
log.Fatal(err)
}
- <-done
+ wg.Wait()
}