all repos — paprika @ master

go rewrite of taigabot

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}