summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'main.go')
-rw-r--r--main.go101
1 files changed, 7 insertions, 94 deletions
diff --git a/main.go b/main.go
index 105893a..a3e9f20 100644
--- a/main.go
+++ b/main.go
@@ -3,106 +3,17 @@ package main
import (
"crypto/tls"
"flag"
- "fmt"
"log"
- "strings"
"dim13.org/bot/internal/feeds"
- "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"
)
-const maxLen = 450
-
-type notify struct {
- conn *irc.Conn
- target string
-}
-
-func newNotify(conn *irc.Conn, target string) *notify {
- return &notify{conn: conn, target: target}
-}
-
-func limit(n int, s string) string {
- r := []rune(s)
- if sz := len(r); sz > n {
- r = append(r[:n-3], []rune("...")...)
- }
- return string(r)
-}
-
-func (n *notify) Write(p []byte) (int, error) {
- s := limit(maxLen, string(p))
- log.Println("send", s)
- n.conn.Notice(n.target, s)
- return len(p), nil
-}
-
-func privmsg(room string) irc.HandlerFunc {
- var (
- last, _ = lru.New(100)
- titles, _ = lru.New(100)
- )
- return func(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(room, line.Nick)
- case strings.HasPrefix(t, "s"):
- global := strings.HasSuffix(t, "g")
- if tofix, ok := 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
- }
-
- }
- fallthrough
- default:
- for _, v := range href.Links(t) {
- title, ok := titles.Get(v)
- if !ok {
- var err error
- title, err = href.Title(v)
- if err != nil {
- log.Println(v, err)
- }
- 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)
- }
- }
- }
- last.Add(line.Nick, t)
- }
- }
-}
-
func main() {
- var (
- node = flag.String("node", "irc.freenode.org", "IRC server")
- notls = flag.Bool("notls", false, "disable TLS")
- room = flag.String("room", "#lor", "IRC channel")
- name = flag.String("name", "dim13", "bots name")
- )
+ node := flag.String("node", "irc.freenode.org", "IRC server")
+ notls := flag.Bool("notls", false, "disable TLS")
+ room := flag.String("room", "#lor", "IRC channel")
+ name := flag.String("name", "dim13", "bots name")
flag.Parse()
conf := irc.NewConfig(*name)
@@ -124,7 +35,9 @@ func main() {
feeds.Watch(newNotify(conn, *room), feeds.Feeds)
})
- conn.HandleBG(irc.PRIVMSG, privmsg(*room))
+ r := newRoom(*room, 100)
+
+ conn.HandleBG(irc.PRIVMSG, r)
conn.HandleFunc(irc.KICK, func(conn *irc.Conn, _ *irc.Line) {
conn.Join(*room)