2015-11-21 04:47:14 +00:00
|
|
|
// Copyright 2015 Robert S. Gerus. All rights reserved.
|
|
|
|
// Use of this source code is governed by a MIT-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
package bot
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
|
|
|
"log"
|
|
|
|
"strings"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/cloudflare/gokabinet/kt"
|
|
|
|
|
|
|
|
"github.com/arachnist/gorepost/irc"
|
|
|
|
)
|
|
|
|
|
|
|
|
var k *kt.Conn
|
|
|
|
|
2015-11-22 10:34:28 +00:00
|
|
|
type seenRecord struct {
|
2015-11-21 04:47:14 +00:00
|
|
|
Network string
|
|
|
|
Target string
|
|
|
|
Action string
|
2015-11-22 10:34:28 +00:00
|
|
|
Time time.Time
|
2015-11-21 04:47:14 +00:00
|
|
|
Text string
|
|
|
|
}
|
|
|
|
|
2015-11-29 14:50:31 +00:00
|
|
|
func seenrecord(output func(irc.Message), msg irc.Message) {
|
2015-12-08 19:57:11 +00:00
|
|
|
var target string
|
|
|
|
|
2015-12-08 23:07:03 +00:00
|
|
|
if msg.Params == nil || msg.Command == "QUIT" {
|
2015-12-08 19:57:11 +00:00
|
|
|
target = ""
|
|
|
|
} else {
|
|
|
|
target = msg.Params[0]
|
2015-11-22 10:42:20 +00:00
|
|
|
}
|
|
|
|
|
2015-11-22 10:34:28 +00:00
|
|
|
v := seenRecord{
|
2015-11-21 04:47:14 +00:00
|
|
|
Network: msg.Context["Network"],
|
2015-12-08 19:57:11 +00:00
|
|
|
Target: target,
|
2015-11-21 04:47:14 +00:00
|
|
|
Action: msg.Command,
|
2015-11-22 10:34:28 +00:00
|
|
|
Time: time.Now(),
|
2015-11-21 04:47:14 +00:00
|
|
|
Text: msg.Trailing,
|
|
|
|
}
|
|
|
|
|
2015-12-09 10:40:18 +00:00
|
|
|
b, _ := json.Marshal(v)
|
2015-11-21 04:47:14 +00:00
|
|
|
|
2015-12-09 10:40:18 +00:00
|
|
|
err := k.Set("seen/"+msg.Prefix.Name, b)
|
2015-11-21 04:47:14 +00:00
|
|
|
if err != nil {
|
|
|
|
log.Println("Context:", msg.Context, "error recording seen record:", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-29 14:50:31 +00:00
|
|
|
func seen(output func(irc.Message), msg irc.Message) {
|
2015-11-22 10:34:28 +00:00
|
|
|
var v seenRecord
|
|
|
|
var r string
|
2015-11-21 04:47:14 +00:00
|
|
|
|
|
|
|
args := strings.Split(msg.Trailing, " ")
|
|
|
|
|
|
|
|
if args[0] != ":seen" {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if len(args) < 2 {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2015-11-21 11:43:44 +00:00
|
|
|
b, err := k.GetBytes("seen/" + args[1])
|
2015-11-21 04:47:14 +00:00
|
|
|
if err == kt.ErrNotFound {
|
2015-11-29 14:50:31 +00:00
|
|
|
output(reply(msg, cfg.LookupString(msg.Context, "NotSeenMessage")))
|
2015-11-21 04:47:14 +00:00
|
|
|
return
|
|
|
|
} else if err != nil {
|
2015-11-29 14:50:31 +00:00
|
|
|
output(reply(msg, fmt.Sprint("error getting record for", args[1], err)))
|
2015-11-21 04:47:14 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2015-12-09 10:40:18 +00:00
|
|
|
_ = json.Unmarshal(b, &v)
|
2015-11-21 04:47:14 +00:00
|
|
|
|
2015-11-22 10:53:13 +00:00
|
|
|
r = fmt.Sprintf("Last seen %s on %s/%s at %v ", args[1], v.Network, v.Target, v.Time.Round(time.Second))
|
2015-11-22 10:34:28 +00:00
|
|
|
|
|
|
|
switch v.Action {
|
|
|
|
case "JOIN":
|
|
|
|
r += "joining"
|
|
|
|
case "PART":
|
|
|
|
r += fmt.Sprint("leaving: ", v.Text)
|
|
|
|
case "QUIT":
|
|
|
|
r += fmt.Sprint("quitting with reasson: ", v.Text)
|
|
|
|
case "PRIVMSG":
|
|
|
|
r += fmt.Sprint("saying: ", v.Text)
|
2015-12-08 20:13:02 +00:00
|
|
|
case "NOTICE":
|
|
|
|
r += fmt.Sprint("noticing: ", v.Text)
|
2015-11-22 10:34:28 +00:00
|
|
|
}
|
|
|
|
|
2015-11-29 14:50:31 +00:00
|
|
|
output(reply(msg, r))
|
2015-11-21 04:47:14 +00:00
|
|
|
}
|
|
|
|
|
2015-12-23 06:51:03 +00:00
|
|
|
func seenInit() {
|
2015-11-21 04:47:14 +00:00
|
|
|
var err error
|
2015-12-23 06:51:03 +00:00
|
|
|
var ktHost = cfg.LookupString(nil, "KTHost")
|
|
|
|
var ktPort = cfg.LookupInt(nil, "KTPort")
|
2015-11-21 04:47:14 +00:00
|
|
|
|
2015-12-23 06:51:03 +00:00
|
|
|
log.Println("seen: connecting to KT")
|
2015-11-21 04:47:14 +00:00
|
|
|
k, err = kt.NewConn(ktHost, ktPort, 4, 2*time.Second)
|
|
|
|
if err != nil {
|
|
|
|
log.Println("error connecting to kyoto tycoon", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
log.Println("Registering callbacks")
|
|
|
|
addCallback("PRIVMSG", "seen", seen)
|
|
|
|
addCallback("PRIVMSG", "seenrecord", seenrecord)
|
|
|
|
addCallback("JOIN", "seenrecord", seenrecord)
|
|
|
|
addCallback("PART", "seenrecord", seenrecord)
|
|
|
|
addCallback("QUIT", "seenrecord", seenrecord)
|
|
|
|
addCallback("NOTICE", "seenrecord", seenrecord)
|
|
|
|
}
|
2015-12-23 06:51:03 +00:00
|
|
|
|
|
|
|
func init() {
|
|
|
|
log.Println("Defering \"papiez\" initialization")
|
|
|
|
addInit(seenInit)
|
|
|
|
}
|