mirror of
https://github.com/nbd-wtf/go-nostr.git
synced 2025-03-17 13:22:56 +01:00
50 lines
1.3 KiB
Go
50 lines
1.3 KiB
Go
package nip45
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"github.com/nbd-wtf/go-nostr"
|
|
)
|
|
|
|
// HyperLogLogEventPubkeyOffsetForFilter returns the deterministic pubkey offset that will be used
|
|
// when computing hyperloglogs in the context of a specific filter.
|
|
//
|
|
// It returns -1 when the filter is not eligible for hyperloglog calculation.
|
|
func HyperLogLogEventPubkeyOffsetForFilter(filter nostr.Filter) int {
|
|
if filter.IDs != nil || filter.Since != nil || filter.Until != nil || filter.Authors != nil ||
|
|
len(filter.Kinds) != 1 || filter.Search != "" || len(filter.Tags) != 1 {
|
|
// obvious cases in which we won't bother to do hyperloglog stuff
|
|
return -1
|
|
}
|
|
|
|
// only serve the cases explicitly defined by the NIP:
|
|
if pTags, ok := filter.Tags["p"]; ok {
|
|
//
|
|
// follower counts:
|
|
if filter.Kinds[0] == 3 && len(pTags) == 1 {
|
|
// 32th nibble of "p" tag
|
|
p, err := strconv.ParseInt(pTags[0][32:33], 16, 64)
|
|
if err != nil {
|
|
return -1
|
|
}
|
|
return int(p + 8)
|
|
}
|
|
} else if eTags, ok := filter.Tags["e"]; ok {
|
|
if len(eTags) == 1 {
|
|
//
|
|
// reaction counts:
|
|
if filter.Kinds[0] == 7 {
|
|
// 32th nibble of "e" tag
|
|
p, err := strconv.ParseInt(eTags[0][32:33], 16, 64)
|
|
if err != nil {
|
|
return -1
|
|
}
|
|
return int(p + 8)
|
|
}
|
|
}
|
|
}
|
|
|
|
// everything else is false at least for now
|
|
return -1
|
|
}
|