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.
107 lines
2.4 KiB
107 lines
2.4 KiB
package nostr |
|
|
|
import ( |
|
"context" |
|
"fmt" |
|
|
|
"github.com/nbd-wtf/go-nostr" |
|
) |
|
|
|
// WikiService handles wiki-specific operations |
|
type WikiService struct { |
|
client *Client |
|
} |
|
|
|
// NewWikiService creates a new wiki service |
|
func NewWikiService(client *Client) *WikiService { |
|
return &WikiService{ |
|
client: client, |
|
} |
|
} |
|
|
|
// FetchWikiIndex fetches a wiki index (kind 30040) by naddr |
|
func (ws *WikiService) FetchWikiIndex(ctx context.Context, naddrStr string) (*IndexEvent, error) { |
|
// Parse naddr |
|
naddr, err := ParseNaddr(naddrStr) |
|
if err != nil { |
|
return nil, fmt.Errorf("failed to parse naddr: %w", err) |
|
} |
|
|
|
// Create filter for the index event |
|
filter := naddr.ToFilter() |
|
|
|
// Fetch the event |
|
event, err := ws.client.FetchEvent(ctx, filter) |
|
if err != nil { |
|
return nil, fmt.Errorf("failed to fetch index event: %w", err) |
|
} |
|
|
|
// Parse the index event |
|
index, err := ParseIndexEvent(event) |
|
if err != nil { |
|
return nil, fmt.Errorf("failed to parse index event: %w", err) |
|
} |
|
|
|
return index, nil |
|
} |
|
|
|
// FetchWikiEvents fetches all wiki events (kind 30818) referenced in an index |
|
func (ws *WikiService) FetchWikiEvents(ctx context.Context, index *IndexEvent) ([]*WikiEvent, error) { |
|
var wikiEvents []*WikiEvent |
|
|
|
for _, item := range index.Items { |
|
if item.Kind != 30818 { |
|
continue // Skip non-wiki items |
|
} |
|
|
|
// Create filter for this wiki event |
|
filter := nostr.Filter{ |
|
Kinds: []int{30818}, |
|
Authors: []string{item.Pubkey}, |
|
Tags: map[string][]string{ |
|
"d": {item.DTag}, |
|
}, |
|
} |
|
|
|
// If event ID is specified, use it |
|
if item.EventID != "" { |
|
filter.IDs = []string{item.EventID} |
|
} |
|
|
|
// Fetch the event |
|
event, err := ws.client.FetchEvent(ctx, filter) |
|
if err != nil { |
|
// Log error but continue with other events |
|
continue |
|
} |
|
|
|
// Parse the wiki event |
|
wiki, err := ParseWikiEvent(event) |
|
if err != nil { |
|
continue |
|
} |
|
|
|
wikiEvents = append(wikiEvents, wiki) |
|
} |
|
|
|
return wikiEvents, nil |
|
} |
|
|
|
// FetchWikiEventByDTag fetches a single wiki event by d tag |
|
func (ws *WikiService) FetchWikiEventByDTag(ctx context.Context, pubkey, dTag string) (*WikiEvent, error) { |
|
filter := nostr.Filter{ |
|
Kinds: []int{30818}, |
|
Authors: []string{pubkey}, |
|
Tags: map[string][]string{ |
|
"d": {dTag}, |
|
}, |
|
Limit: 1, |
|
} |
|
|
|
event, err := ws.client.FetchEvent(ctx, filter) |
|
if err != nil { |
|
return nil, fmt.Errorf("failed to fetch wiki event: %w", err) |
|
} |
|
|
|
return ParseWikiEvent(event) |
|
}
|
|
|