all repos — paprika @ master

go rewrite of taigabot

plugins/version.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
package plugins

import (
	"fmt"
	"strings"
	"time"

	"git.icyphox.sh/paprika/database"
	"github.com/dgraph-io/badger/v3"
	"gopkg.in/irc.v3"
)

func init() {
	Register(Version{})
}

type Version struct{}

func (Version) Triggers() []string {
	return []string{".v", ".version"}
}

func (Version) Execute(m *irc.Message) (string, error) {
	params := strings.SplitN(m.Trailing(), " ", 3)
	if len(params) != 2 {
		return fmt.Sprintf("Usage: %s <nick>", params[0]), nil
	}

	nickTarget := params[1]
	if likelyInvalidNick(nickTarget) {
		return fmt.Sprintf("%s does not look like an IRC Nick", nickTarget), nil
	}

	nickKey := database.ToKey("version", nickTarget)
	replyTarget := m.Params[0]
	err := database.DB.SetWithTTL(
		nickKey,
		[]byte(replyTarget),
		2 * time.Minute,
	)
	if err != nil {
		return "", err
	}

	m.Params[0] = nickTarget
	return "\x01VERSION\x01", nil
}

func CTCPReply(m *irc.Message) (string, error) {
	msg := m.Trailing()
	if !strings.HasPrefix(msg, "\x01VERSION") {
		return "", NoReply
	}

	params := strings.SplitN(msg, " ", 2)
	if len(params) != 2 {
		return "", NoReply
	}
	if len(params[1]) == 0 {
		return "", NoReply
	}

	ver := params[1][:len(params[1])-1]
	from := m.Name

	newTarget, err := database.DB.Delete(database.ToKey("version", from))
	if err != nil {
		return "", err
	}
	
	m.Params[0] = string(newTarget)
	m.Command = "PRIVMSG"
	return fmt.Sprintf("%s VERSION: %s", from, ver), nil
}

func NoSuchUser(m *irc.Message) (string, error) {
	invalidNick := m.Params[1]
	newTarget, err := database.DB.Delete(database.ToKey("version", invalidNick))
	if err == badger.ErrKeyNotFound {
		return "", NoReply
	} else if err != nil {
		return "", err
	}

	m.Command = "PRIVMSG"
	m.Params[0] = string(newTarget)
	m.Params = m.Params[:1]
	return fmt.Sprintf("No such nickname: %s", invalidNick), nil
}