Files
eventstore/ratel/gettagkeyelements.go
2024-09-08 20:16:34 +01:00

70 lines
1.6 KiB
Go

package ratel
import (
"strconv"
"strings"
. "nostr.mleku.dev"
"store.mleku.dev/ratel/keys"
"store.mleku.dev/ratel/keys/arb"
"store.mleku.dev/ratel/keys/createdat"
"store.mleku.dev/ratel/keys/index"
"store.mleku.dev/ratel/keys/kinder"
"store.mleku.dev/ratel/keys/pubkey"
"store.mleku.dev/ratel/keys/serial"
"ec.mleku.dev/v2/schnorr"
"util.mleku.dev/hex"
)
func GetTagKeyElements(tagValue string, CA *createdat.T,
ser *serial.T) (prf index.P,
elems []keys.Element, err error) {
var pkb []byte
// first check if it might be a public key, fastest test
if len(tagValue) == 2*schnorr.PubKeyBytesLen {
// this could be a pubkey
pkb, err = hex.Dec(tagValue)
if err == nil {
// it's a pubkey
var pkk keys.Element
if pkk, err = pubkey.NewFromBytes(pkb); Chk.E(err) {
return
}
prf, elems = index.Tag32, keys.Make(pkk, ser)
return
}
}
// check for a tag
if strings.Count(tagValue, ":") == 2 {
// this means we will get 3 pieces here
split := strings.Split(tagValue, ":")
// middle element should be a public key so must be 64 hex ciphers
if len(split[1]) != schnorr.PubKeyBytesLen*2 {
return
}
var k uint16
var d string
if pkb, err = hex.Dec(split[1]); !Chk.E(err) {
var kin uint64
if kin, err = strconv.ParseUint(split[0], 10, 16); err == nil {
k = uint16(kin)
d = split[2]
var pk *pubkey.T
if pk, err = pubkey.NewFromBytes(pkb); Chk.E(err) {
return
}
prf = index.TagAddr
elems = keys.Make(kinder.New(k), pk, arb.NewFromString(d), CA,
ser)
return
}
}
}
// store whatever as utf-8
prf = index.Tag
elems = keys.Make(arb.NewFromString(tagValue), CA, ser)
return
}