package nostr import ( "context" "fmt" "time" "github.com/nbd-wtf/go-nostr" ) // FeedService handles feed operations type FeedService struct { client *Client feedKind int // Feed event kind (from config) } // NewFeedService creates a new feed service func NewFeedService(client *Client, feedKind int) *FeedService { return &FeedService{ client: client, feedKind: feedKind, } } // FetchFeedItems fetches recent feed events from a specific relay func (fs *FeedService) FetchFeedItems(ctx context.Context, relay string, maxEvents int) ([]FeedItem, error) { filter := nostr.Filter{ Kinds: []int{fs.feedKind}, Limit: maxEvents, } logFilter(filter, fmt.Sprintf("feed (kind %d)", fs.feedKind)) // Connect to the specific feed relay (not the default client relays) relayConn, err := fs.client.ConnectToRelay(ctx, relay) if err != nil { return nil, fmt.Errorf("failed to connect to feed relay %s: %w", relay, err) } defer relayConn.Close() events, err := relayConn.QuerySync(ctx, filter) if err != nil { return nil, fmt.Errorf("failed to fetch feed events from %s: %w", relay, err) } items := make([]FeedItem, 0, len(events)) for _, event := range events { item := FeedItem{ Author: event.PubKey, Content: event.Content, Time: time.Unix(int64(event.CreatedAt), 0), Link: fmt.Sprintf("https://alexandria.gitcitadel.eu/events?id=nevent1%s", event.ID), } items = append(items, item) } return items, nil } // FeedItem represents a feed item type FeedItem struct { Author string Content string Time time.Time Link string }