plugins/seen.go (view raw)
1package plugins
2
3import (
4 "bytes"
5 "encoding/gob"
6 "fmt"
7 "strings"
8 "time"
9
10 "git.icyphox.sh/paprika/database"
11 "github.com/dgraph-io/badger/v3"
12 "github.com/dustin/go-humanize"
13 "gopkg.in/irc.v3"
14)
15
16func init() {
17 Register(Seen{})
18}
19
20type Seen struct{}
21
22func (Seen) Triggers() []string {
23 return []string{".seen", ""}
24}
25
26type LastSeenInfo struct {
27 // The last message the user sent.
28 Message string
29 // Command type
30 Doing string
31 // The last time this user was seen.
32 Time time.Time
33}
34
35func (Seen) Execute(m *irc.Message) (string, error) {
36 var reply string
37 if m.Command == "PRIVMSG" && strings.HasPrefix(m.Trailing(), ".seen") {
38 params := strings.SplitN(m.Trailing(), " ", 3)
39 if len(params) != 2 {
40 reply = "Usage: .seen <nickname>"
41 } else {
42 nameKey := database.ToKey("seen", params[1])
43 lastS, err := database.DB.Get(nameKey)
44 if err == badger.ErrKeyNotFound {
45 reply = fmt.Sprintf("I have not seen %s", params[1])
46 } else if err != nil {
47 return "", err
48 } else {
49 var lastSeen LastSeenInfo
50 err = gob.NewDecoder(bytes.NewReader(lastS)).Decode(&lastSeen)
51 if err != nil {
52 return "", err
53 }
54
55 humanized := humanize.Time(lastSeen.Time)
56
57 if lastSeen.Doing == "PRIVMSG" {
58 reply = fmt.Sprintf(
59 "\x02%s\x02 was last seen %s, saying: %s",
60 params[1], humanized,
61 lastSeen.Message,
62 )
63 } else {
64 reply = fmt.Sprintf(
65 "\x02%s\x02 was last seen %s, doing: %s",
66 params[1], humanized,
67 lastSeen.Doing,
68 )
69 }
70 }
71 }
72 }
73
74 seenDoing := LastSeenInfo{
75 Message: m.Trailing(),
76 Doing: m.Command,
77 // We just saw the user, so.
78 Time: time.Now(),
79 }
80
81 var enc bytes.Buffer
82 err := gob.NewEncoder(&enc).Encode(seenDoing)
83 if err != nil {
84 return "", err
85 }
86
87 nameKey := database.ToKey("seen", m.Name)
88 database.DB.Set(nameKey, enc.Bytes())
89
90 if reply == "" {
91 return "", NoReply
92 } else {
93 return reply, nil
94 }
95}
96
97func SeenDoing(m *irc.Message) error {
98 _, err := Seen{}.Execute(m)
99 return err
100}