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

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)
}