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
}
|