You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
164 lines
3.7 KiB
164 lines
3.7 KiB
package main |
|
|
|
import ( |
|
"encoding/hex" |
|
"fmt" |
|
|
|
"github.com/nbd-wtf/go-nostr" |
|
|
|
orlyEvent "git.mleku.dev/mleku/nostr/encoders/event" |
|
orlyFilter "git.mleku.dev/mleku/nostr/encoders/filter" |
|
orlyTag "git.mleku.dev/mleku/nostr/encoders/tag" |
|
) |
|
|
|
// convertToNostrEvent converts an ORLY event to a go-nostr event |
|
func convertToNostrEvent(ev *orlyEvent.E) (*nostr.Event, error) { |
|
if ev == nil { |
|
return nil, fmt.Errorf("nil event") |
|
} |
|
|
|
nostrEv := &nostr.Event{ |
|
ID: hex.EncodeToString(ev.ID), |
|
PubKey: hex.EncodeToString(ev.Pubkey), |
|
CreatedAt: nostr.Timestamp(ev.CreatedAt), |
|
Kind: int(ev.Kind), |
|
Content: string(ev.Content), |
|
Sig: hex.EncodeToString(ev.Sig), |
|
} |
|
|
|
// Convert tags |
|
if ev.Tags != nil && len(*ev.Tags) > 0 { |
|
nostrEv.Tags = make(nostr.Tags, 0, len(*ev.Tags)) |
|
for _, orlyTag := range *ev.Tags { |
|
if orlyTag != nil && len(orlyTag.T) > 0 { |
|
tag := make(nostr.Tag, len(orlyTag.T)) |
|
for i, val := range orlyTag.T { |
|
tag[i] = string(val) |
|
} |
|
nostrEv.Tags = append(nostrEv.Tags, tag) |
|
} |
|
} |
|
} |
|
|
|
return nostrEv, nil |
|
} |
|
|
|
// convertFromNostrEvent converts a go-nostr event to an ORLY event |
|
func convertFromNostrEvent(ne *nostr.Event) (*orlyEvent.E, error) { |
|
if ne == nil { |
|
return nil, fmt.Errorf("nil event") |
|
} |
|
|
|
ev := orlyEvent.New() |
|
|
|
// Convert ID |
|
idBytes, err := hex.DecodeString(ne.ID) |
|
if err != nil { |
|
return nil, fmt.Errorf("failed to decode ID: %w", err) |
|
} |
|
ev.ID = idBytes |
|
|
|
// Convert Pubkey |
|
pubkeyBytes, err := hex.DecodeString(ne.PubKey) |
|
if err != nil { |
|
return nil, fmt.Errorf("failed to decode pubkey: %w", err) |
|
} |
|
ev.Pubkey = pubkeyBytes |
|
|
|
// Convert Sig |
|
sigBytes, err := hex.DecodeString(ne.Sig) |
|
if err != nil { |
|
return nil, fmt.Errorf("failed to decode signature: %w", err) |
|
} |
|
ev.Sig = sigBytes |
|
|
|
// Simple fields |
|
ev.CreatedAt = int64(ne.CreatedAt) |
|
ev.Kind = uint16(ne.Kind) |
|
ev.Content = []byte(ne.Content) |
|
|
|
// Convert tags |
|
if len(ne.Tags) > 0 { |
|
ev.Tags = orlyTag.NewS() |
|
for _, nostrTag := range ne.Tags { |
|
if len(nostrTag) > 0 { |
|
tag := orlyTag.NewWithCap(len(nostrTag)) |
|
for _, val := range nostrTag { |
|
tag.T = append(tag.T, []byte(val)) |
|
} |
|
*ev.Tags = append(*ev.Tags, tag) |
|
} |
|
} |
|
} else { |
|
ev.Tags = orlyTag.NewS() |
|
} |
|
|
|
return ev, nil |
|
} |
|
|
|
// convertToNostrFilter converts an ORLY filter to a go-nostr filter |
|
func convertToNostrFilter(f *orlyFilter.F) (nostr.Filter, error) { |
|
if f == nil { |
|
return nostr.Filter{}, fmt.Errorf("nil filter") |
|
} |
|
|
|
filter := nostr.Filter{} |
|
|
|
// Convert IDs |
|
if f.Ids != nil && len(f.Ids.T) > 0 { |
|
filter.IDs = make([]string, 0, len(f.Ids.T)) |
|
for _, id := range f.Ids.T { |
|
filter.IDs = append(filter.IDs, hex.EncodeToString(id)) |
|
} |
|
} |
|
|
|
// Convert Authors |
|
if f.Authors != nil && len(f.Authors.T) > 0 { |
|
filter.Authors = make([]string, 0, len(f.Authors.T)) |
|
for _, author := range f.Authors.T { |
|
filter.Authors = append(filter.Authors, hex.EncodeToString(author)) |
|
} |
|
} |
|
|
|
// Convert Kinds |
|
if f.Kinds != nil && len(f.Kinds.K) > 0 { |
|
filter.Kinds = make([]int, 0, len(f.Kinds.K)) |
|
for _, kind := range f.Kinds.K { |
|
filter.Kinds = append(filter.Kinds, int(kind.K)) |
|
} |
|
} |
|
|
|
// Convert Tags |
|
if f.Tags != nil && len(*f.Tags) > 0 { |
|
filter.Tags = make(nostr.TagMap) |
|
for _, tag := range *f.Tags { |
|
if tag != nil && len(tag.T) >= 2 { |
|
tagName := string(tag.T[0]) |
|
tagValues := make([]string, 0, len(tag.T)-1) |
|
for i := 1; i < len(tag.T); i++ { |
|
tagValues = append(tagValues, string(tag.T[i])) |
|
} |
|
filter.Tags[tagName] = tagValues |
|
} |
|
} |
|
} |
|
|
|
// Convert timestamps |
|
if f.Since != nil { |
|
ts := nostr.Timestamp(f.Since.V) |
|
filter.Since = &ts |
|
} |
|
|
|
if f.Until != nil { |
|
ts := nostr.Timestamp(f.Until.V) |
|
filter.Until = &ts |
|
} |
|
|
|
// Convert limit |
|
if f.Limit != nil { |
|
limit := int(*f.Limit) |
|
filter.Limit = limit |
|
} |
|
|
|
return filter, nil |
|
}
|
|
|