summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'main.go')
-rw-r--r--main.go126
1 files changed, 36 insertions, 90 deletions
diff --git a/main.go b/main.go
index 79fd538..82940ff 100644
--- a/main.go
+++ b/main.go
@@ -1,77 +1,23 @@
package main
import (
- "container/ring"
"flag"
"fmt"
"log"
- "time"
+ "strings"
irc "github.com/fluffle/goirc/client"
)
-type bot struct {
- room string
- conn *irc.Conn
- notice chan string
- kick chan string
- last *ring.Ring
-}
-
-func New(name, node, room string, ssl bool) *bot {
- conf := irc.NewConfig(name)
- conf.Server = node
- conf.SSL = ssl
- conn := irc.Client(conf)
- return &bot{
- room: room,
- conn: conn,
- notice: notify(conn, room),
- kick: kicker(conn, room),
- last: ring.New(10),
- }
-}
-
-func (b *bot) push(line *irc.Line) {
- b.last.Value = line
- b.last = b.last.Next()
-}
-
-func (b *bot) find(c chan string, nick string) {
- var msg string
- b.last.Do(func(v interface{}) {
- if v != nil {
- l := v.(*irc.Line)
- if l.Nick == nick {
- msg = l.Text()
- }
- }
- })
- if msg != "" {
- c <- msg
- }
-}
-
-func (b *bot) lastMsgs(c chan string) {
- b.last.Do(func(v interface{}) {
- if v != nil {
- l := v.(*irc.Line)
- c <- fmt.Sprintf("%v <%v> %v",
- l.Time.UTC().Format(time.Kitchen),
- l.Nick, l.Text())
- }
- })
-}
-
func notify(conn *irc.Conn, target string) chan string {
const maxLen = 500
c := make(chan string, 1)
go func() {
for msg := range c {
- log.Println("send", msg)
if len(msg) > maxLen {
msg = msg[:maxLen] + "..."
}
+ log.Println("send", msg)
conn.Notice(target, msg)
}
}()
@@ -91,9 +37,9 @@ func kicker(conn *irc.Conn, channel string) chan string {
return c
}
-func (b *bot) join() irc.HandlerFunc {
+func join(room string) irc.HandlerFunc {
return func(conn *irc.Conn, _ *irc.Line) {
- conn.Join(b.room)
+ conn.Join(room)
}
}
@@ -103,23 +49,30 @@ func discon(c chan struct{}) irc.HandlerFunc {
}
}
-func (b *bot) privmsg() irc.HandlerFunc {
- l := links(b.notice)
+func privmsg(note, kick chan string) irc.HandlerFunc {
+ last := NewLastBuf(10)
+ links := linker(note)
+ go Watch(note, Feeds)
return func(conn *irc.Conn, line *irc.Line) {
- if isFlood(line.Text()) {
- b.kick <- line.Nick
- }
- switch line.Text() {
- case "last":
+ switch t := line.Text(); {
+ case isFlood(t):
+ kick <- line.Nick
+ case t == "last":
c := notify(conn, line.Nick)
- defer close(c)
- b.lastMsgs(c)
- case "find":
- b.find(b.notice, line.Nick)
+ last.Dump(c)
+ close(c)
+ case strings.HasPrefix(t, "s"):
+ tofix := last.Last(line.Nick)
+ if fixed := re(tofix, t); fixed != "" {
+ note <- fmt.Sprintf("%v meant to say: %v",
+ line.Nick, fixed)
+ return
+ }
+ fallthrough
default:
- b.push(line)
+ links <- t
+ last.Push(line.Time, line.Nick, t)
}
- l <- line.Text()
}
}
@@ -130,30 +83,23 @@ func main() {
name := flag.String("name", "dim13", "Bots Name")
flag.Parse()
- b := New(*name, *node, *room, *ssl)
+ conf := irc.NewConfig(*name)
+ conf.Server = *node
+ conf.SSL = *ssl
+ conn := irc.Client(conf)
+
+ note := notify(conn, *room)
+ kick := kicker(conn, *room)
done := make(chan struct{})
- go Watch(b.notice, Feeds) // TODO shall it be there?
- // setup event handler
- handler := []struct {
- ev string
- f irc.HandlerFunc
- }{
- {irc.DISCONNECTED, discon(done)},
- {irc.CONNECTED, b.join()},
- {irc.KICK, b.join()},
- {irc.PRIVMSG, b.privmsg()},
- }
- for _, h := range handler {
- b.conn.HandleFunc(h.ev, h.f)
- }
+ conn.HandleFunc(irc.DISCONNECTED, discon(done))
+ conn.HandleFunc(irc.CONNECTED, join(*room))
+ conn.HandleFunc(irc.KICK, join(*room))
+ conn.HandleFunc(irc.PRIVMSG, privmsg(note, kick))
- if err := b.conn.Connect(); err != nil {
+ if err := conn.Connect(); err != nil {
log.Fatal(err)
}
-
- log.Println("Connected")
<-done
- log.Println("Disconnected")
}