Skip to content

Commit fc2daa1

Browse files
committed
basically replace getEvent() with sys.FetchSpecificEvent()
1 parent 126aec6 commit fc2daa1

File tree

7 files changed

+18
-133
lines changed

7 files changed

+18
-133
lines changed

data.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ type Data struct {
4040

4141
func grabData(ctx context.Context, code string) (Data, error) {
4242
// code can be a nevent or naddr, in which case we try to fetch the associated event
43-
event, relays, err := getEvent(ctx, code)
43+
event, relays, err := getEvent(ctx, code, true)
4444
if err != nil {
4545
return Data{}, fmt.Errorf("error fetching event: %w", err)
4646
}

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ require (
1616
github.com/kelseyhightower/envconfig v1.4.0
1717
github.com/microcosm-cc/bluemonday v1.0.24
1818
github.com/nbd-wtf/emoji v0.0.3
19-
github.com/nbd-wtf/go-nostr v0.38.1
19+
github.com/nbd-wtf/go-nostr v0.38.2
2020
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
2121
github.com/pelletier/go-toml v1.9.5
2222
github.com/puzpuzpuz/xsync/v3 v3.4.0

go.sum

+2-2
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,8 @@ github.com/mna/pigeon v1.1.0 h1:EjlvVbkGnNGemf8OrjeJX0nH8orujY/HkJgzJtd7kxc=
156156
github.com/mna/pigeon v1.1.0/go.mod h1:rkFeDZ0gc+YbnrXPw0q2RlI0QRuKBBPu67fgYIyGRNg=
157157
github.com/nbd-wtf/emoji v0.0.3 h1:YtkT7MVPXvqU1SQjvC/CShlWexnREzqNCxmhUnL00CA=
158158
github.com/nbd-wtf/emoji v0.0.3/go.mod h1:tS6D9iI34qwBmWc5g8X7tVDkWXulqbTJRsvsM6QsS88=
159-
github.com/nbd-wtf/go-nostr v0.38.1 h1:D0moEtIpjhWs2zbgeRyokA4TOLzBdumtpL1/O7/frww=
160-
github.com/nbd-wtf/go-nostr v0.38.1/go.mod h1:TGKGj00BmJRXvRe0LlpDN3KKbELhhPXgBwUEhzu3Oq0=
159+
github.com/nbd-wtf/go-nostr v0.38.2 h1:8PP+U8dx81jVEL89k/xMAejAlDeSDJ9ywNiyOj82so8=
160+
github.com/nbd-wtf/go-nostr v0.38.2/go.mod h1:TGKGj00BmJRXvRe0LlpDN3KKbELhhPXgBwUEhzu3Oq0=
161161
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
162162
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
163163
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=

image_utils.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ func quotesAsBlockPrefixedText(ctx context.Context, lines []string) []string {
213213
submatch := nostrNoteNeventMatcher.FindStringSubmatch(matchText)
214214
nip19 := submatch[0][6:]
215215

216-
event, _, err := getEvent(ctx, nip19)
216+
event, _, err := getEvent(ctx, nip19, false)
217217
if err != nil {
218218
// error case concat this to previous block
219219
blocks[b] += matchText

main.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,10 @@ func main() {
7171
return
7272
}
7373
if len(relayConfig.Everything) > 0 {
74-
sys.FallbackRelays = relayConfig.Everything
74+
sys.FallbackRelays.URLs = relayConfig.Everything
7575
}
7676
if len(relayConfig.Profiles) > 0 {
77-
sys.MetadataRelays = relayConfig.Profiles
77+
sys.MetadataRelays.URLs = relayConfig.Profiles
7878
}
7979
}
8080

nostr.go

+10-116
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,10 @@ import (
55
"fmt"
66
"iter"
77
"slices"
8-
"sync"
98
"time"
109

1110
"github.com/fiatjaf/eventstore/lmdb"
1211
"github.com/nbd-wtf/go-nostr"
13-
"github.com/nbd-wtf/go-nostr/nip19"
1412
"github.com/nbd-wtf/go-nostr/sdk"
1513
cache_memory "github.com/nbd-wtf/go-nostr/sdk/cache/memory"
1614
)
@@ -58,128 +56,24 @@ func initSystem() func() {
5856
return db.Close
5957
}
6058

61-
func getEvent(ctx context.Context, code string) (*nostr.Event, []string, error) {
62-
// this is for deciding what relays will go on nevent and nprofile later
63-
priorityRelays := make(map[string]int)
64-
65-
prefix, data, err := nip19.Decode(code)
59+
func getEvent(ctx context.Context, code string, withRelays bool) (*nostr.Event, []string, error) {
60+
evt, relays, err := sys.FetchSpecificEvent(ctx, code, true)
6661
if err != nil {
67-
return nil, nil, fmt.Errorf("failed to decode %w", err)
62+
return nil, nil, fmt.Errorf("couldn't find this event, did you include accurate relay or author hints in it?")
6863
}
6964

70-
author := ""
71-
authorRelaysPosition := 0
72-
73-
var filter nostr.Filter
74-
relays := make([]string, 0, 10)
75-
76-
switch v := data.(type) {
77-
case nostr.EventPointer:
78-
author = v.Author
79-
filter.IDs = []string{v.ID}
80-
relays = append(relays, v.Relays...)
81-
relays = append(relays, relayConfig.JustIds...)
82-
authorRelaysPosition = len(v.Relays) // ensure author relays are checked after hinted relays
83-
for _, r := range v.Relays {
84-
priorityRelays[r] = 2
85-
}
86-
case nostr.EntityPointer:
87-
author = v.PublicKey
88-
filter.Authors = []string{v.PublicKey}
89-
filter.Tags = nostr.TagMap{
90-
"d": []string{v.Identifier},
91-
}
92-
if v.Kind != 0 {
93-
filter.Kinds = append(filter.Kinds, v.Kind)
94-
}
95-
relays = append(relays, v.Relays...)
96-
authorRelaysPosition = len(v.Relays) // ensure author relays are checked after hinted relays
97-
case string:
98-
if prefix == "note" {
99-
filter.IDs = []string{v}
100-
relays = append(relays, relayConfig.JustIds...)
101-
}
65+
if !withRelays {
66+
return evt, nil, nil
10267
}
10368

104-
// try to fetch in our internal eventstore first
105-
if res, _ := sys.StoreRelay.QuerySync(ctx, filter); len(res) != 0 {
106-
evt := res[0]
69+
if relays == nil {
10770
return evt, internal.getRelaysForEvent(evt.ID), nil
10871
}
10972

110-
if author != "" {
111-
// fetch relays for author
112-
authorRelays := sys.FetchOutboxRelays(ctx, author, 3)
113-
relays = slices.Insert(relays, authorRelaysPosition, authorRelays...)
114-
for _, r := range authorRelays {
115-
priorityRelays[r] = 1
116-
}
117-
}
118-
119-
for len(relays) < 5 {
120-
relays = append(relays, getRandomRelay())
121-
}
122-
123-
relays = unique(relays)
124-
125-
var result *nostr.Event
126-
var successRelays []string = nil
127-
128-
{
129-
// actually fetch the event here
130-
subManyCtx, cancel := context.WithTimeout(ctx, time.Second*8)
131-
defer cancel()
132-
133-
// keep track of where we have actually found the event so we can show that
134-
successRelays = make([]string, 0, len(relays))
135-
countdown := 7.5
136-
go func() {
137-
for {
138-
time.Sleep(500 * time.Millisecond)
139-
if countdown <= 0 {
140-
cancel()
141-
break
142-
}
143-
countdown -= 0.5
144-
}
145-
}()
146-
147-
fetchProfileOnce := sync.Once{}
148-
149-
for ie := range sys.Pool.SubManyEoseNonUnique(
150-
subManyCtx,
151-
relays,
152-
nostr.Filters{filter},
153-
nostr.WithLabel("fetching-"+prefix),
154-
) {
155-
fetchProfileOnce.Do(func() {
156-
go sys.FetchProfileMetadata(ctx, ie.PubKey)
157-
})
158-
159-
successRelays = append(successRelays, ie.Relay.URL)
160-
if result == nil || ie.CreatedAt > result.CreatedAt {
161-
result = ie.Event
162-
}
163-
countdown = min(countdown, 1)
164-
}
165-
}
166-
167-
if result == nil {
168-
return nil, nil, fmt.Errorf("couldn't find this %s, did you include relay or author hints in it?", prefix)
169-
}
170-
171-
// save stuff in cache and in internal store
172-
sys.StoreRelay.Publish(ctx, *result)
17373
// save relays if we got them
174-
allRelays := internal.attachRelaysToEvent(result.ID, successRelays...)
175-
// put priority relays first so they get used in nevent and nprofile
176-
slices.SortFunc(allRelays, func(a, b string) int {
177-
vpa, _ := priorityRelays[a]
178-
vpb, _ := priorityRelays[b]
179-
return vpb - vpa
180-
})
181-
182-
return result, allRelays, nil
74+
allRelays := internal.attachRelaysToEvent(evt.ID, relays...)
75+
76+
return evt, allRelays, nil
18377
}
18478

18579
func authorLastNotes(ctx context.Context, pubkey string) []EnhancedEvent {
@@ -210,7 +104,7 @@ func authorLastNotes(ctx context.Context, pubkey string) []EnhancedEvent {
210104
relays := sys.FetchOutboxRelays(ctx, pubkey, 3)
211105

212106
for len(relays) < 3 {
213-
relays = unique(append(relays, getRandomRelay()))
107+
relays = unique(append(relays, sys.FallbackRelays.Next()))
214108
}
215109

216110
ch := sys.Pool.SubManyEose(ctx, relays, nostr.Filters{filter}, nostr.WithLabel("authorlast"))

utils.go

+1-10
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66
"fmt"
77
"html"
88
"html/template"
9-
"math/rand"
109
"net/http"
1110
"regexp"
1211
"slices"
@@ -299,7 +298,7 @@ func renderQuotesAsHTML(ctx context.Context, input string, usingTelegramInstantV
299298
defer cancel()
300299
wg.Add(1)
301300
go func() {
302-
event, _, err := getEvent(ctx, nip19)
301+
event, _, err := getEvent(ctx, nip19, false)
303302
if err == nil {
304303
quotedEvent := basicFormatting(submatches[0], false, usingTelegramInstantView, false)
305304

@@ -438,14 +437,6 @@ func humanDate(createdAt nostr.Timestamp) string {
438437
}
439438
}
440439

441-
func getRandomRelay() string {
442-
if serial == 0 {
443-
serial = rand.Intn(len(sys.FallbackRelays))
444-
}
445-
serial = (serial + 1) % len(sys.FallbackRelays)
446-
return sys.FallbackRelays[serial]
447-
}
448-
449440
func maxIndex(slice []int) int {
450441
maxIndex := -1
451442
maxVal := 0

0 commit comments

Comments
 (0)