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