summaryrefslogtreecommitdiff
path: root/room.go
diff options
context:
space:
mode:
Diffstat (limited to 'room.go')
-rw-r--r--room.go78
1 files changed, 22 insertions, 56 deletions
diff --git a/room.go b/room.go
index a7c2ad0..6e95413 100644
--- a/room.go
+++ b/room.go
@@ -1,74 +1,40 @@
package main
import (
- "fmt"
- "log"
- "strings"
+ "io"
"dim13.org/bot/internal/flood"
"dim13.org/bot/internal/href"
"dim13.org/bot/internal/re"
irc "github.com/fluffle/goirc/client"
- lru "github.com/hashicorp/golang-lru"
)
type Room struct {
- room string
- last *lru.Cache
- titles *lru.Cache
+ titles *href.Titles
+ flood *flood.Checker
+ re *re.RE
}
-func newRoom(room string, sz int) *Room {
- last, _ := lru.New(sz)
- titles, _ := lru.New(sz)
- return &Room{room: room, last: last, titles: titles}
+type KickWriter interface {
+ io.Writer
+ flood.Kicker
}
-func (r *Room) Handle(conn *irc.Conn, line *irc.Line) {
- defer func() {
- if r := recover(); r != nil {
- log.Println("panic", r)
- }
- }()
- t := line.Text()
- switch {
- case line.Nick == conn.Me().Nick:
- // ignore self
- case flood.Is(t):
- log.Println("flood", line.Nick)
- conn.Kick(r.room, line.Nick)
- case strings.HasPrefix(t, "s"):
- global := strings.HasSuffix(t, "g")
- if tofix, ok := r.last.Get(line.Nick); ok {
- fixed, err := re.Replace(tofix.(string), t[1:], global)
- if err == nil && fixed != tofix {
- log.Println("regexp", t)
- fmt.Fprintf(newNotify(conn, line.Target()), "%v meant to say: %s", line.Nick, fixed)
- return
- }
+func newRoom(w KickWriter) *Room {
+ return &Room{
+ titles: href.NewTitles(w),
+ flood: flood.New(w),
+ re: re.NewRE(w),
+ }
+}
- }
- fallthrough
- default:
- for _, v := range href.Links(t) {
- title, ok := r.titles.Get(v)
- if !ok {
- var err error
- title, err = href.Title(v)
- if err != nil {
- log.Println(v, err)
- }
- r.titles.Add(v, title)
- }
- if title != "" {
- w := newNotify(conn, line.Target())
- if ok {
- fmt.Fprintf(w, "Title: %v (cached)", title)
- } else {
- fmt.Fprintf(w, "Title: %v", title)
- }
- }
- }
- r.last.Add(line.Nick, t)
+func (r *Room) 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.titles.Resolve(text)
+ r.re.Replace(text, nick)
}