summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-12-25 10:52:43 +0100
committerDimitri Sokolyuk <demon@dim13.org>2016-12-25 10:52:43 +0100
commit6f756f7f5e0f196476ea2b7910d38e6bab6e2f47 (patch)
tree76c8c62bdcaa2f4eb392d951765aae662291407e
parenta3008a2aed0efed79470a5f2873b793bd0a3a8d8 (diff)
wip
-rw-r--r--main.go97
1 files changed, 65 insertions, 32 deletions
diff --git a/main.go b/main.go
index e1fd32f..79fd538 100644
--- a/main.go
+++ b/main.go
@@ -10,28 +10,61 @@ import (
irc "github.com/fluffle/goirc/client"
)
-const maxLen = 500
+type bot struct {
+ room string
+ conn *irc.Conn
+ notice chan string
+ kick chan string
+ last *ring.Ring
+}
-var buffer = ring.New(10)
+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 push(l *irc.Line) {
- buffer.Value = l
- buffer = buffer.Next()
+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 last(target string) {
- buffer.Do(func(v interface{}) {
+func (b *bot) lastMsgs(c chan string) {
+ b.last.Do(func(v interface{}) {
if v != nil {
l := v.(*irc.Line)
- s := fmt.Sprintf("%v <%v> %v",
+ c <- fmt.Sprintf("%v <%v> %v",
l.Time.UTC().Format(time.Kitchen),
l.Nick, l.Text())
- conn.Notice(target, s)
}
})
}
func notify(conn *irc.Conn, target string) chan string {
+ const maxLen = 500
c := make(chan string, 1)
go func() {
for msg := range c {
@@ -58,9 +91,9 @@ func kicker(conn *irc.Conn, channel string) chan string {
return c
}
-func join(room string) irc.HandlerFunc {
+func (b *bot) join() irc.HandlerFunc {
return func(conn *irc.Conn, _ *irc.Line) {
- conn.Join(room)
+ conn.Join(b.room)
}
}
@@ -70,16 +103,21 @@ func discon(c chan struct{}) irc.HandlerFunc {
}
}
-func privmsg(n, k chan string, room string) irc.HandlerFunc {
- l := links(n)
+func (b *bot) privmsg() irc.HandlerFunc {
+ l := links(b.notice)
return func(conn *irc.Conn, line *irc.Line) {
if isFlood(line.Text()) {
- k <- line.Nick
+ b.kick <- line.Nick
}
- if line.Text() == "last" {
- last(line.Nick)
- } else {
- push(line)
+ switch line.Text() {
+ case "last":
+ c := notify(conn, line.Nick)
+ defer close(c)
+ b.lastMsgs(c)
+ case "find":
+ b.find(b.notice, line.Nick)
+ default:
+ b.push(line)
}
l <- line.Text()
}
@@ -92,15 +130,10 @@ func main() {
name := flag.String("name", "dim13", "Bots Name")
flag.Parse()
- conf := irc.NewConfig(*name)
- conf.Server = *node
- conf.SSL = *ssl
- conn := irc.Client(conf)
- //conn.EnableStateTracking() // XXX
+ b := New(*name, *node, *room, *ssl)
+
done := make(chan struct{})
- n := notify(conn, *room)
- k := kicker(conn, *room)
- go Watch(n, Feeds) // TODO shall it be there?
+ go Watch(b.notice, Feeds) // TODO shall it be there?
// setup event handler
handler := []struct {
@@ -108,19 +141,19 @@ func main() {
f irc.HandlerFunc
}{
{irc.DISCONNECTED, discon(done)},
- {irc.CONNECTED, join(*room)},
- {irc.KICK, join(*room)},
- {irc.PRIVMSG, privmsg(n, k, *room)},
+ {irc.CONNECTED, b.join()},
+ {irc.KICK, b.join()},
+ {irc.PRIVMSG, b.privmsg()},
}
for _, h := range handler {
- conn.HandleFunc(h.ev, h.f)
+ b.conn.HandleFunc(h.ev, h.f)
}
- log.Println("Connect to", conf.Server)
- if err := conn.Connect(); err != nil {
+ if err := b.conn.Connect(); err != nil {
log.Fatal(err)
}
+ log.Println("Connected")
<-done
log.Println("Disconnected")
}