breaking pointer mess

- ExternalPointer (?)
- nip27, nip22 and nip10 functions to return pointers
- get rid of sdk/thread helpers that were just a thin layer over nip10 and nip22
This commit is contained in:
fiatjaf
2025-03-10 02:35:02 -03:00
parent f575f63f6c
commit 7e04bbb4b8
8 changed files with 119 additions and 79 deletions

View File

@@ -12,9 +12,7 @@ type Reference struct {
Text string
Start int
End int
Profile *nostr.ProfilePointer
Event *nostr.EventPointer
Entity *nostr.EntityPointer
Pointer nostr.Pointer
}
var mentionRegex = regexp.MustCompile(`\bnostr:((note|npub|naddr|nevent|nprofile)1\w+)\b`)
@@ -33,40 +31,45 @@ func ParseReferences(evt nostr.Event) iter.Seq[Reference] {
if prefix, data, err := nip19.Decode(nip19code); err == nil {
switch prefix {
case "npub":
reference.Profile = &nostr.ProfilePointer{
pointer := &nostr.ProfilePointer{
PublicKey: data.(string), Relays: []string{},
}
tag := evt.Tags.GetFirst([]string{"p", reference.Profile.PublicKey})
if tag != nil && len(*tag) >= 3 {
reference.Profile.Relays = []string{(*tag)[2]}
tag := evt.Tags.FindWithValue("p", pointer.PublicKey)
if tag != nil && len(tag) >= 3 {
pointer.Relays = []string{tag[2]}
}
if nostr.IsValidPublicKey(pointer.PublicKey) {
reference.Pointer = pointer
}
case "nprofile":
pp := data.(nostr.ProfilePointer)
reference.Profile = &pp
tag := evt.Tags.GetFirst([]string{"p", reference.Profile.PublicKey})
if tag != nil && len(*tag) >= 3 {
reference.Profile.Relays = append(reference.Profile.Relays, (*tag)[2])
pointer := data.(nostr.ProfilePointer)
tag := evt.Tags.FindWithValue("p", pointer.PublicKey)
if tag != nil && len(tag) >= 3 {
pointer.Relays = append(pointer.Relays, tag[2])
}
if nostr.IsValidPublicKey(pointer.PublicKey) {
reference.Pointer = pointer
}
case "note":
// we don't even bother here because people using note1 codes aren't including relay hints anyway
reference.Event = &nostr.EventPointer{ID: data.(string), Relays: []string{}}
reference.Pointer = &nostr.EventPointer{ID: data.(string), Relays: nil}
case "nevent":
evp := data.(nostr.EventPointer)
reference.Event = &evp
tag := evt.Tags.GetFirst([]string{"e", reference.Event.ID})
if tag != nil && len(*tag) >= 3 {
reference.Event.Relays = append(reference.Event.Relays, (*tag)[2])
if reference.Event.Author == "" && len(*tag) >= 5 {
reference.Event.Author = (*tag)[4]
pointer := data.(nostr.EventPointer)
tag := evt.Tags.FindWithValue("e", pointer.ID)
if tag != nil && len(tag) >= 3 {
pointer.Relays = append(pointer.Relays, tag[2])
if pointer.Author == "" && len(tag) >= 5 && nostr.IsValidPublicKey(tag[4]) {
pointer.Author = tag[4]
}
}
reference.Pointer = pointer
case "naddr":
addr := data.(nostr.EntityPointer)
reference.Entity = &addr
tag := evt.Tags.GetFirst([]string{"a", reference.Entity.AsTagReference()})
if tag != nil && len(*tag) >= 3 {
reference.Entity.Relays = append(reference.Entity.Relays, (*tag)[2])
pointer := data.(nostr.EntityPointer)
tag := evt.Tags.FindWithValue("a", pointer.AsTagReference())
if tag != nil && len(tag) >= 3 {
pointer.Relays = append(pointer.Relays, tag[2])
}
reference.Pointer = pointer
}
}

View File

@@ -23,7 +23,7 @@ func TestParseReferences(t *testing.T) {
Text: "nostr:nprofile1qqsvc6ulagpn7kwrcwdqgp797xl7usumqa6s3kgcelwq6m75x8fe8yc5usxdg",
Start: 7,
End: 83,
Profile: &nostr.ProfilePointer{
Pointer: nostr.ProfilePointer{
PublicKey: "cc6b9fea033f59c3c39a0407c5f1bfee439b077508d918cfdc0d6fd431d39393",
Relays: []string{"wss://xawr.com"},
},
@@ -32,7 +32,7 @@ func TestParseReferences(t *testing.T) {
Text: "nostr:nevent1qqsvc6ulagpn7kwrcwdqgp797xl7usumqa6s3kgcelwq6m75x8fe8ychxp5v4",
Start: 90,
End: 164,
Event: &nostr.EventPointer{
Pointer: nostr.EventPointer{
ID: "cc6b9fea033f59c3c39a0407c5f1bfee439b077508d918cfdc0d6fd431d39393",
Relays: []string{"wss://nasdj.com"},
Author: "",