165 lines
3.7 KiB
Go
165 lines
3.7 KiB
Go
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
|
|
}
|