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