Skip to content

Commit 7f546c2

Browse files
committed
cache slugs and addresses in redis
1 parent 49e8632 commit 7f546c2

File tree

2 files changed

+106
-11
lines changed

2 files changed

+106
-11
lines changed

internal/degendb/degendata/degendata.go

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package degendata
22

33
import (
4+
"context"
45
"encoding/json"
56
"fmt"
67
"io"
@@ -10,6 +11,7 @@ import (
1011
"time"
1112

1213
"github.com/benleb/gloomberg/internal/degendb"
14+
"github.com/benleb/gloomberg/internal/gbl"
1315
"github.com/benleb/gloomberg/internal/nemo/gloomberg"
1416
"github.com/benleb/gloomberg/internal/opensea"
1517
"github.com/benleb/gloomberg/internal/style"
@@ -39,18 +41,38 @@ func LoadOpenseaRanks(gb *gloomberg.Gloomberg) error {
3941

4042
address, ok := gb.CollectionDB.OpenseaSlugsAndAddresses()[slug]
4143
if !ok {
42-
collectionResponse := opensea.GetCollection(slug)
44+
if addr, err := gb.Rueidi.GetAddressForOSSlug(context.Background(), slug); err == nil && addr != "" {
45+
address = common.HexToAddress(addr)
4346

44-
if collectionResponse == nil {
47+
gb.PrDModf("ddb", "found address %s for slug %s in cache", style.AlmostWhiteStyle.Render(addr), style.AlmostWhiteStyle.Render(slug))
48+
} else if collectionResponse := opensea.GetCollection(slug); collectionResponse != nil {
49+
// don't fuck opensea
50+
time.Sleep(time.Millisecond * 337)
51+
52+
gb.PrDModf("ddb", "fetched address %s for slug %s from opensea", style.AlmostWhiteStyle.Render(addr), style.AlmostWhiteStyle.Render(slug))
53+
54+
if len(collectionResponse.Collection.PrimaryAssetContracts) > 0 {
55+
address = common.HexToAddress(collectionResponse.Collection.PrimaryAssetContracts[0].Address)
56+
} else {
57+
log.Warnf("failed to get address for %s from opensea", style.AlmostWhiteStyle.Render(slug))
58+
59+
continue
60+
}
61+
} else {
4562
log.Warnf("failed to get collection data for %s from opensea", style.AlmostWhiteStyle.Render(slug))
4663

4764
continue
48-
} else if len(collectionResponse.Collection.PrimaryAssetContracts) > 0 {
49-
address = common.HexToAddress(collectionResponse.Collection.PrimaryAssetContracts[0].Address)
5065
}
66+
} else {
67+
gb.PrDModf("ddb", fmt.Sprintf("address %s for slug %s from our collectionDB", style.AlmostWhiteStyle.Render(address.Hex()), style.AlmostWhiteStyle.Render(slug)))
68+
}
5169

52-
// don't fuck opensea
53-
time.Sleep(time.Millisecond * 337)
70+
// cache
71+
if slug != "" && address != (common.Address{}) {
72+
gb.Rueidi.StoreAddressForOSSlug(context.Background(), slug, address)
73+
gb.Rueidi.StoreOSSlugForAddress(context.Background(), address, slug)
74+
75+
gb.PrDModf("ddb", "stored address %s for slug %s in cache", style.AlmostWhiteStyle.Render(address.Hex()), style.AlmostWhiteStyle.Render(slug))
5476
}
5577

5678
ranksOpensea := make(degendb.OpenSeaRanks, 0)
@@ -77,7 +99,24 @@ func LoadOpenseaRanks(gb *gloomberg.Gloomberg) error {
7799
continue
78100
}
79101

80-
// gb.PrMod("ddb", fmt.Sprintf("added %s ranks for %s", style.AlmostWhiteStyle.Render(fmt.Sprint(len(ranksOpensea))), style.AlmostWhiteStyle.Render(slug)))
102+
// validate
103+
for token_id, rank := range ranksOpensea {
104+
if rank.Rank <= 0 {
105+
gbl.Log.Debugf("%s | rank is <=0 for %s", style.AlmostWhiteStyle.Render(slug), style.AlmostWhiteStyle.Render(fmt.Sprint(token_id)))
106+
gb.PrDModf("ddb", "%s | rank is <=0 for %s", style.AlmostWhiteStyle.Render(slug), style.AlmostWhiteStyle.Render(fmt.Sprint(token_id)))
107+
108+
continue
109+
}
110+
111+
if rank.Score <= 0 {
112+
gbl.Log.Debugf("%s | score is <=0 for %s", style.AlmostWhiteStyle.Render(slug), style.AlmostWhiteStyle.Render(fmt.Sprint(token_id)))
113+
gb.PrDModf("ddb", "%s | score is <=0 for %s", style.AlmostWhiteStyle.Render(slug), style.AlmostWhiteStyle.Render(fmt.Sprint(token_id)))
114+
115+
continue
116+
}
117+
}
118+
119+
gb.PrDModf("ddb", "added %s ranks for %s", style.AlmostWhiteStyle.Render(fmt.Sprint(len(ranksOpensea))), style.AlmostWhiteStyle.Render(slug))
81120

82121
gb.Ranks[address] = ranksOpensea
83122
totalRanks += len(ranksOpensea)

internal/rueidica/rueidica.go

Lines changed: 60 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ const (
2525
keywordENS string = "ensDomain"
2626
keywordFloorOS string = "floorOS"
2727
keywordOSSlug string = "osslug"
28+
keywordAddress string = "address"
2829
keywordBlurSlug string = "blurslug"
2930
keywordSalira string = "salira"
3031
keyDelimiter string = ":"
@@ -94,10 +95,29 @@ func (r *Rueidica) StoreSalira(ctx context.Context, address common.Address, valu
9495
}
9596

9697
// Slugs.
97-
func (r *Rueidica) StoreOSSlug(ctx context.Context, address common.Address, slug string) error {
98-
log.Debugf("rueidica.StoreOSSlug | %+v -> %+v", address.Hex(), slug)
98+
func (r *Rueidica) StoreOSSlugForAddress(ctx context.Context, address common.Address, slug string) error {
99+
log.Debugf("rueidica.StoreOSSlugForAddress | %+v -> %+v", address.Hex(), slug)
99100

100-
return r.cacheName(ctx, address, slug, keyOSSlug, viper.GetDuration("cache.slug_ttl"))
101+
return r.cacheName(ctx, address, slug, keyAddresToOSSlug, viper.GetDuration("cache.slug_ttl"))
102+
}
103+
104+
func (r *Rueidica) GetOSSlugForAddress(ctx context.Context, address common.Address) (string, error) {
105+
log.Debugf("rueidica.GetCachedENSName | %+v", address)
106+
107+
return r.getCachedName(ctx, address, keyENS)
108+
}
109+
110+
func (r *Rueidica) StoreAddressForOSSlug(ctx context.Context, slug string, address common.Address) error {
111+
log.Debugf("rueidica.StoreAddressForOSSlug | %+v -> %+v", slug, address.Hex())
112+
113+
return r.cacheAddressWithKey(ctx, keyOSSlugsToAddress(slug), address, viper.GetDuration("cache.slug_ttl"))
114+
// return r.cacheName(ctx, address, slug, keyOSSlugsToAddress, viper.GetDuration("cache.slug_ttl"))
115+
}
116+
117+
func (r *Rueidica) GetAddressForOSSlug(ctx context.Context, slug string) (string, error) {
118+
log.Debugf("rueidica.GetAddressForOSSlug | %+v", slug)
119+
120+
return r.getCachedStringValueWithKey(ctx, keyOSSlugsToAddress(slug))
101121
}
102122

103123
func (r *Rueidica) StoreBlurSlug(ctx context.Context, address common.Address, slug string) error {
@@ -130,6 +150,27 @@ func (r *Rueidica) getCachedName(ctx context.Context, address common.Address, ke
130150
return "", errors.New("value not found in cache")
131151
}
132152

153+
func (r *Rueidica) getCachedStringValueWithKey(ctx context.Context, rKey string) (string, error) {
154+
clientCacheTTL := viper.GetDuration("cache.names_client_ttl")
155+
156+
if r != nil {
157+
cachedValue, err := r.DoCache(ctx, r.B().Get().Key(rKey).Cache(), clientCacheTTL).ToString()
158+
159+
switch {
160+
case err != nil && rueidis.IsRedisNil(err):
161+
gbl.Log.Debugf("rueidis | no cachedValue in cache for %s", rKey)
162+
case err != nil:
163+
gbl.Log.Errorf("rueidis | error getting cached name: %s", err)
164+
default:
165+
gbl.Log.Debugf("rueidis | found name: %s -> %s", rKey, cachedValue)
166+
}
167+
168+
return cachedValue, err
169+
}
170+
171+
return "", errors.New("value not found in cache")
172+
}
173+
133174
func (r *Rueidica) getCachedNumber(ctx context.Context, address common.Address, keyFunc func(common.Address) string) (float64, error) {
134175
clientCacheTTL := viper.GetDuration("cache.names_client_ttl")
135176

@@ -173,6 +214,17 @@ func (r *Rueidica) cacheName(ctx context.Context, address common.Address, name s
173214
return nil
174215
}
175216

217+
func (r *Rueidica) cacheAddressWithKey(ctx context.Context, rKey string, rValue common.Address, duration time.Duration) error {
218+
err := r.Do(ctx, r.B().Set().Key(rKey).Value(rValue.Hex()).ExSeconds(int64(duration.Seconds())).Build()).Error()
219+
if err != nil {
220+
gbl.Log.Errorf("rueidis | error caching: %s ⇄ %s | %s", rKey, rValue, err)
221+
222+
return err
223+
}
224+
225+
return nil
226+
}
227+
176228
//
177229
// notifications lock
178230

@@ -243,10 +295,14 @@ func keyFloorOS(address common.Address) string {
243295
return fmt.Sprint(address.Hex(), keyDelimiter, keywordFloorOS)
244296
}
245297

246-
func keyOSSlug(address common.Address) string {
298+
func keyAddresToOSSlug(address common.Address) string {
247299
return fmt.Sprint(address.Hex(), keyDelimiter, keywordOSSlug)
248300
}
249301

302+
func keyOSSlugsToAddress(slug string) string {
303+
return fmt.Sprint(slug, keyDelimiter, keywordAddress)
304+
}
305+
250306
func keyBlurSlug(address common.Address) string {
251307
return fmt.Sprint(address.Hex(), keyDelimiter, keywordBlurSlug)
252308
}

0 commit comments

Comments
 (0)