|
|
|
@ -3,15 +3,22 @@ package nostr |
|
|
|
import ( |
|
|
|
import ( |
|
|
|
"context" |
|
|
|
"context" |
|
|
|
"fmt" |
|
|
|
"fmt" |
|
|
|
"log" |
|
|
|
|
|
|
|
|
|
|
|
"gitcitadel-online/internal/logger" |
|
|
|
|
|
|
|
|
|
|
|
"github.com/nbd-wtf/go-nostr" |
|
|
|
"github.com/nbd-wtf/go-nostr" |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
// logFilter logs the exact filter being used for debugging
|
|
|
|
// logFilter logs the exact filter being used for debugging
|
|
|
|
func logFilter(filter nostr.Filter, context string) { |
|
|
|
func logFilter(filter nostr.Filter, context string) { |
|
|
|
log.Printf("FILTER [%s]: Kinds=%v, Authors=%v, IDs=%v, Tags=%v, Limit=%d", |
|
|
|
logger.WithFields(map[string]interface{}{ |
|
|
|
context, filter.Kinds, filter.Authors, filter.IDs, filter.Tags, filter.Limit) |
|
|
|
"context": context, |
|
|
|
|
|
|
|
"kinds": filter.Kinds, |
|
|
|
|
|
|
|
"authors": filter.Authors, |
|
|
|
|
|
|
|
"ids": filter.IDs, |
|
|
|
|
|
|
|
"tags": filter.Tags, |
|
|
|
|
|
|
|
"limit": filter.Limit, |
|
|
|
|
|
|
|
}).Debug("Nostr filter") |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// WikiService handles wiki-specific operations
|
|
|
|
// WikiService handles wiki-specific operations
|
|
|
|
@ -84,7 +91,10 @@ func (ws *WikiService) FetchWikiEvents(ctx context.Context, index *IndexEvent) ( |
|
|
|
// If event ID is specified, use it for more reliable fetching
|
|
|
|
// If event ID is specified, use it for more reliable fetching
|
|
|
|
if item.EventID != "" { |
|
|
|
if item.EventID != "" { |
|
|
|
filter.IDs = []string{item.EventID} |
|
|
|
filter.IDs = []string{item.EventID} |
|
|
|
log.Printf("Using event ID %s for %s", item.EventID[:16]+"...", item.DTag) |
|
|
|
logger.WithFields(map[string]interface{}{ |
|
|
|
|
|
|
|
"event_id": item.EventID[:16] + "...", |
|
|
|
|
|
|
|
"dtag": item.DTag, |
|
|
|
|
|
|
|
}).Debug("Using event ID for wiki event") |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
logFilter(filter, fmt.Sprintf("wiki event %s", item.DTag)) |
|
|
|
logFilter(filter, fmt.Sprintf("wiki event %s", item.DTag)) |
|
|
|
@ -94,7 +104,10 @@ func (ws *WikiService) FetchWikiEvents(ctx context.Context, index *IndexEvent) ( |
|
|
|
var err error |
|
|
|
var err error |
|
|
|
if item.RelayHint != "" { |
|
|
|
if item.RelayHint != "" { |
|
|
|
// Connect to the relay hint
|
|
|
|
// Connect to the relay hint
|
|
|
|
log.Printf("Trying relay hint %s for %s", item.RelayHint, item.DTag) |
|
|
|
logger.WithFields(map[string]interface{}{ |
|
|
|
|
|
|
|
"relay_hint": item.RelayHint, |
|
|
|
|
|
|
|
"dtag": item.DTag, |
|
|
|
|
|
|
|
}).Debug("Trying relay hint") |
|
|
|
relay, relayErr := ws.client.ConnectToRelay(ctx, item.RelayHint) |
|
|
|
relay, relayErr := ws.client.ConnectToRelay(ctx, item.RelayHint) |
|
|
|
if relayErr == nil { |
|
|
|
if relayErr == nil { |
|
|
|
events, queryErr := relay.QuerySync(ctx, filter) |
|
|
|
events, queryErr := relay.QuerySync(ctx, filter) |
|
|
|
@ -102,27 +115,40 @@ func (ws *WikiService) FetchWikiEvents(ctx context.Context, index *IndexEvent) ( |
|
|
|
if queryErr == nil { |
|
|
|
if queryErr == nil { |
|
|
|
if len(events) > 0 { |
|
|
|
if len(events) > 0 { |
|
|
|
event = events[0] |
|
|
|
event = events[0] |
|
|
|
log.Printf("Successfully fetched %s from relay hint %s", item.DTag, item.RelayHint) |
|
|
|
logger.WithFields(map[string]interface{}{ |
|
|
|
|
|
|
|
"dtag": item.DTag, |
|
|
|
|
|
|
|
"relay_hint": item.RelayHint, |
|
|
|
|
|
|
|
}).Debug("Successfully fetched from relay hint") |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
log.Printf("Relay hint %s returned 0 events for %s (event ID: %v)", item.RelayHint, item.DTag, item.EventID != "") |
|
|
|
logger.WithFields(map[string]interface{}{ |
|
|
|
|
|
|
|
"relay_hint": item.RelayHint, |
|
|
|
|
|
|
|
"dtag": item.DTag, |
|
|
|
|
|
|
|
"has_event_id": item.EventID != "", |
|
|
|
|
|
|
|
}).Debug("Relay hint returned 0 events") |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
log.Printf("Error querying relay hint %s for %s: %v", item.RelayHint, item.DTag, queryErr) |
|
|
|
logger.WithFields(map[string]interface{}{ |
|
|
|
|
|
|
|
"relay_hint": item.RelayHint, |
|
|
|
|
|
|
|
"dtag": item.DTag, |
|
|
|
|
|
|
|
}).Debugf("Error querying relay hint: %v", queryErr) |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
log.Printf("Error connecting to relay hint %s for %s: %v", item.RelayHint, item.DTag, relayErr) |
|
|
|
logger.WithFields(map[string]interface{}{ |
|
|
|
|
|
|
|
"relay_hint": item.RelayHint, |
|
|
|
|
|
|
|
"dtag": item.DTag, |
|
|
|
|
|
|
|
}).Debugf("Error connecting to relay hint: %v", relayErr) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Fallback to default client relays if relay hint failed or wasn't provided
|
|
|
|
// Fallback to default client relays if relay hint failed or wasn't provided
|
|
|
|
// Client now queries all three relays automatically
|
|
|
|
// Client now queries all three relays automatically
|
|
|
|
if event == nil { |
|
|
|
if event == nil { |
|
|
|
log.Printf("Querying all relays for %s", item.DTag) |
|
|
|
logger.WithField("dtag", item.DTag).Debug("Querying all relays") |
|
|
|
event, err = ws.client.FetchEvent(ctx, filter) |
|
|
|
event, err = ws.client.FetchEvent(ctx, filter) |
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|
// If still not found and event ID was specified, try without event ID to get latest replaceable event
|
|
|
|
// If still not found and event ID was specified, try without event ID to get latest replaceable event
|
|
|
|
if item.EventID != "" { |
|
|
|
if item.EventID != "" { |
|
|
|
log.Printf("Trying without event ID for %s to get latest replaceable event", item.DTag) |
|
|
|
logger.WithField("dtag", item.DTag).Debug("Trying without event ID to get latest replaceable event") |
|
|
|
filterWithoutID := nostr.Filter{ |
|
|
|
filterWithoutID := nostr.Filter{ |
|
|
|
Kinds: []int{ws.wikiKind}, |
|
|
|
Kinds: []int{ws.wikiKind}, |
|
|
|
Authors: []string{item.Pubkey}, |
|
|
|
Authors: []string{item.Pubkey}, |
|
|
|
@ -133,16 +159,20 @@ func (ws *WikiService) FetchWikiEvents(ctx context.Context, index *IndexEvent) ( |
|
|
|
logFilter(filterWithoutID, fmt.Sprintf("wiki event %s (without event ID)", item.DTag)) |
|
|
|
logFilter(filterWithoutID, fmt.Sprintf("wiki event %s (without event ID)", item.DTag)) |
|
|
|
event, err = ws.client.FetchEvent(ctx, filterWithoutID) |
|
|
|
event, err = ws.client.FetchEvent(ctx, filterWithoutID) |
|
|
|
if err == nil { |
|
|
|
if err == nil { |
|
|
|
log.Printf("Successfully fetched %s (latest) from all relays", item.DTag) |
|
|
|
logger.WithField("dtag", item.DTag).Debug("Successfully fetched latest from all relays") |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
log.Printf("Successfully fetched %s from all relays", item.DTag) |
|
|
|
logger.WithField("dtag", item.DTag).Debug("Successfully fetched from all relays") |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if event == nil { |
|
|
|
if event == nil { |
|
|
|
// Log error but continue with other events
|
|
|
|
// Log error but continue with other events
|
|
|
|
log.Printf("Error fetching wiki event for %s (pubkey: %s, event ID: %v): %v", item.DTag, item.Pubkey, item.EventID != "", err) |
|
|
|
logger.WithFields(map[string]interface{}{ |
|
|
|
|
|
|
|
"dtag": item.DTag, |
|
|
|
|
|
|
|
"pubkey": item.Pubkey, |
|
|
|
|
|
|
|
"has_event_id": item.EventID != "", |
|
|
|
|
|
|
|
}).Warnf("Error fetching wiki event: %v", err) |
|
|
|
continue |
|
|
|
continue |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@ -150,7 +180,9 @@ func (ws *WikiService) FetchWikiEvents(ctx context.Context, index *IndexEvent) ( |
|
|
|
// Parse the wiki event
|
|
|
|
// Parse the wiki event
|
|
|
|
wiki, err := ParseWikiEvent(event, ws.wikiKind) |
|
|
|
wiki, err := ParseWikiEvent(event, ws.wikiKind) |
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|
log.Printf("Error parsing wiki event for %s: %v", item.DTag, err) |
|
|
|
logger.WithFields(map[string]interface{}{ |
|
|
|
|
|
|
|
"dtag": item.DTag, |
|
|
|
|
|
|
|
}).Warnf("Error parsing wiki event: %v", err) |
|
|
|
continue |
|
|
|
continue |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -158,7 +190,7 @@ func (ws *WikiService) FetchWikiEvents(ctx context.Context, index *IndexEvent) ( |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if len(wikiEvents) == 0 && len(index.Items) > 0 { |
|
|
|
if len(wikiEvents) == 0 && len(index.Items) > 0 { |
|
|
|
log.Printf("Warning: No wiki events could be fetched from %d index items", len(index.Items)) |
|
|
|
logger.WithField("items", len(index.Items)).Warn("No wiki events could be fetched from index items") |
|
|
|
// Return empty slice instead of error to allow landing page generation
|
|
|
|
// Return empty slice instead of error to allow landing page generation
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -222,25 +254,44 @@ func (ws *WikiService) FetchIndexEvents(ctx context.Context, index *IndexEvent, |
|
|
|
if len(relayEvents) > 0 { |
|
|
|
if len(relayEvents) > 0 { |
|
|
|
event = relayEvents[0] |
|
|
|
event = relayEvents[0] |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
log.Printf("Relay hint %s returned 0 events for %s (kind %d, event ID: %v)", item.RelayHint, item.DTag, targetKind, item.EventID != "") |
|
|
|
logger.WithFields(map[string]interface{}{ |
|
|
|
|
|
|
|
"relay_hint": item.RelayHint, |
|
|
|
|
|
|
|
"dtag": item.DTag, |
|
|
|
|
|
|
|
"kind": targetKind, |
|
|
|
|
|
|
|
"has_event_id": item.EventID != "", |
|
|
|
|
|
|
|
}).Debug("Relay hint returned 0 events") |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
log.Printf("Error querying relay hint %s for %s (kind %d): %v", item.RelayHint, item.DTag, targetKind, queryErr) |
|
|
|
logger.WithFields(map[string]interface{}{ |
|
|
|
|
|
|
|
"relay_hint": item.RelayHint, |
|
|
|
|
|
|
|
"dtag": item.DTag, |
|
|
|
|
|
|
|
"kind": targetKind, |
|
|
|
|
|
|
|
}).Debugf("Error querying relay hint: %v", queryErr) |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
log.Printf("Error connecting to relay hint %s for %s (kind %d): %v", item.RelayHint, item.DTag, targetKind, relayErr) |
|
|
|
logger.WithFields(map[string]interface{}{ |
|
|
|
|
|
|
|
"relay_hint": item.RelayHint, |
|
|
|
|
|
|
|
"dtag": item.DTag, |
|
|
|
|
|
|
|
"kind": targetKind, |
|
|
|
|
|
|
|
}).Debugf("Error connecting to relay hint: %v", relayErr) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Fallback to default client relays if relay hint failed or wasn't provided
|
|
|
|
// Fallback to default client relays if relay hint failed or wasn't provided
|
|
|
|
// Client now queries all three relays automatically
|
|
|
|
// Client now queries all three relays automatically
|
|
|
|
if event == nil { |
|
|
|
if event == nil { |
|
|
|
log.Printf("Querying all relays for %s (kind %d)", item.DTag, targetKind) |
|
|
|
logger.WithFields(map[string]interface{}{ |
|
|
|
|
|
|
|
"dtag": item.DTag, |
|
|
|
|
|
|
|
"kind": targetKind, |
|
|
|
|
|
|
|
}).Debug("Querying all relays") |
|
|
|
event, err = ws.client.FetchEvent(ctx, filter) |
|
|
|
event, err = ws.client.FetchEvent(ctx, filter) |
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|
// If still not found and event ID was specified, try without event ID to get latest replaceable event
|
|
|
|
// If still not found and event ID was specified, try without event ID to get latest replaceable event
|
|
|
|
if item.EventID != "" { |
|
|
|
if item.EventID != "" { |
|
|
|
log.Printf("Trying without event ID for %s (kind %d) to get latest replaceable event", item.DTag, targetKind) |
|
|
|
logger.WithFields(map[string]interface{}{ |
|
|
|
|
|
|
|
"dtag": item.DTag, |
|
|
|
|
|
|
|
"kind": targetKind, |
|
|
|
|
|
|
|
}).Debug("Trying without event ID to get latest replaceable event") |
|
|
|
filterWithoutID := nostr.Filter{ |
|
|
|
filterWithoutID := nostr.Filter{ |
|
|
|
Kinds: []int{targetKind}, |
|
|
|
Kinds: []int{targetKind}, |
|
|
|
Authors: []string{item.Pubkey}, |
|
|
|
Authors: []string{item.Pubkey}, |
|
|
|
@ -251,16 +302,27 @@ func (ws *WikiService) FetchIndexEvents(ctx context.Context, index *IndexEvent, |
|
|
|
logFilter(filterWithoutID, fmt.Sprintf("index event kind %d %s (without event ID)", targetKind, item.DTag)) |
|
|
|
logFilter(filterWithoutID, fmt.Sprintf("index event kind %d %s (without event ID)", targetKind, item.DTag)) |
|
|
|
event, err = ws.client.FetchEvent(ctx, filterWithoutID) |
|
|
|
event, err = ws.client.FetchEvent(ctx, filterWithoutID) |
|
|
|
if err == nil { |
|
|
|
if err == nil { |
|
|
|
log.Printf("Successfully fetched %s (kind %d, latest) from all relays", item.DTag, targetKind) |
|
|
|
logger.WithFields(map[string]interface{}{ |
|
|
|
|
|
|
|
"dtag": item.DTag, |
|
|
|
|
|
|
|
"kind": targetKind, |
|
|
|
|
|
|
|
}).Debug("Successfully fetched latest from all relays") |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
log.Printf("Successfully fetched %s (kind %d) from all relays", item.DTag, targetKind) |
|
|
|
logger.WithFields(map[string]interface{}{ |
|
|
|
|
|
|
|
"dtag": item.DTag, |
|
|
|
|
|
|
|
"kind": targetKind, |
|
|
|
|
|
|
|
}).Debug("Successfully fetched from all relays") |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if event == nil { |
|
|
|
if event == nil { |
|
|
|
// Log error but continue with other events
|
|
|
|
// Log error but continue with other events
|
|
|
|
log.Printf("Error fetching event for %s (kind %d, pubkey: %s, event ID: %v): %v", item.DTag, targetKind, item.Pubkey, item.EventID != "", err) |
|
|
|
logger.WithFields(map[string]interface{}{ |
|
|
|
|
|
|
|
"dtag": item.DTag, |
|
|
|
|
|
|
|
"kind": targetKind, |
|
|
|
|
|
|
|
"pubkey": item.Pubkey, |
|
|
|
|
|
|
|
"has_event_id": item.EventID != "", |
|
|
|
|
|
|
|
}).Warnf("Error fetching event: %v", err) |
|
|
|
continue |
|
|
|
continue |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@ -269,7 +331,10 @@ func (ws *WikiService) FetchIndexEvents(ctx context.Context, index *IndexEvent, |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if len(events) == 0 && len(index.Items) > 0 { |
|
|
|
if len(events) == 0 && len(index.Items) > 0 { |
|
|
|
log.Printf("Warning: No events of kind %d could be fetched from %d index items", targetKind, len(index.Items)) |
|
|
|
logger.WithFields(map[string]interface{}{ |
|
|
|
|
|
|
|
"kind": targetKind, |
|
|
|
|
|
|
|
"items": len(index.Items), |
|
|
|
|
|
|
|
}).Warn("No events could be fetched from index items") |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return events, nil |
|
|
|
return events, nil |
|
|
|
|