@@ -182,6 +182,62 @@ func (lh *LMDBHints) PrintScores() {
182
182
}
183
183
}
184
184
185
+ func (lh * LMDBHints ) GetDetailedScores (pubkey string , n int ) []hints.RelayScores {
186
+ type relayScore struct {
187
+ relay string
188
+ tss timestamps
189
+ score int64
190
+ }
191
+
192
+ scores := make ([]relayScore , 0 , n )
193
+ err := lh .env .View (func (txn * lmdb.Txn ) error {
194
+ txn .RawRead = true
195
+
196
+ cursor , err := txn .OpenCursor (lh .dbi )
197
+ if err != nil {
198
+ return err
199
+ }
200
+ defer cursor .Close ()
201
+
202
+ prefix , _ := hex .DecodeString (pubkey )
203
+ k , v , err := cursor .Get (prefix , nil , lmdb .SetRange )
204
+ for ; err == nil ; k , v , err = cursor .Get (nil , nil , lmdb .Next ) {
205
+ // check if we're still in the prefix range
206
+ if len (k ) < 32 || ! bytes .Equal (k [:32 ], prefix ) {
207
+ break
208
+ }
209
+
210
+ relay := string (k [32 :])
211
+ tss := parseValue (v )
212
+ scores = append (scores , relayScore {relay , tss , tss .sum ()})
213
+ }
214
+ if err != nil && ! lmdb .IsNotFound (err ) {
215
+ return err
216
+ }
217
+ return nil
218
+ })
219
+ if err != nil {
220
+ return nil
221
+ }
222
+
223
+ slices .SortFunc (scores , func (a , b relayScore ) int {
224
+ return int (b .score - a .score )
225
+ })
226
+
227
+ result := make ([]hints.RelayScores , 0 , n )
228
+ for i , rs := range scores {
229
+ if i >= n {
230
+ break
231
+ }
232
+ result = append (result , hints.RelayScores {
233
+ Relay : rs .relay ,
234
+ Scores : rs .tss ,
235
+ Sum : rs .score ,
236
+ })
237
+ }
238
+ return result
239
+ }
240
+
185
241
type timestamps [4 ]nostr.Timestamp
186
242
187
243
func (tss timestamps ) sum () int64 {
0 commit comments