getEventMetrics method

Future<Nip85EventMetrics?> getEventMetrics(
  1. String eventId, {
  2. Set<Nip85Metric>? metrics,
  3. List<Nip85TrustedProvider>? providers,
})

Get event metrics from trusted providers

eventId - The event ID to get metrics for metrics - Optional set of specific metrics to fetch. If null, fetches all available. providers - Optional list of providers to use. If null, uses default providers.

Returns Nip85EventMetrics or null if no assertion found.

Implementation

Future<Nip85EventMetrics?> getEventMetrics(
  String eventId, {
  Set<Nip85Metric>? metrics,
  List<Nip85TrustedProvider>? providers,
}) async {
  final effectiveProviders = _filterProviders(
    providers ?? _defaultProviders,
    kind: Nip85Kind.event,
    metrics: metrics,
  );

  if (effectiveProviders.isEmpty) {
    return null;
  }

  // Group providers by relay for efficient querying
  final providersByRelay = <String, List<Nip85TrustedProvider>>{};
  for (final provider in effectiveProviders) {
    providersByRelay.putIfAbsent(provider.relay, () => []).add(provider);
  }

  final aggregatedMetrics = <Nip85Metric, dynamic>{};
  final metricCreatedAt = <Nip85Metric, int>{};
  String? latestProviderPubkey;
  String? latestEventId;
  int latestCreatedAt = 0;

  // Query each relay
  for (final entry in providersByRelay.entries) {
    final relay = entry.key;
    final relayProviders = entry.value;
    final providerPubkeys = relayProviders.map((p) => p.pubkey).toList();

    try {
      await for (final event in _requests
          .query(
            filter: Filter(
              kinds: [Nip85Kind.event],
              authors: providerPubkeys,
              dTags: [eventId],
              limit: providerPubkeys.length,
            ),
            explicitRelays: [relay],
            cacheRead: true,
            cacheWrite: true,
          )
          .stream) {
        final parsed = _parseEventMetricsEvent(event, metrics);
        if (parsed == null) continue;

        parsed.metrics.forEach((metric, value) {
          final currentMetricCreatedAt = metricCreatedAt[metric] ?? -1;
          if (parsed.createdAt >= currentMetricCreatedAt) {
            aggregatedMetrics[metric] = value;
            metricCreatedAt[metric] = parsed.createdAt;
          }
        });

        if (parsed.createdAt >= latestCreatedAt) {
          latestCreatedAt = parsed.createdAt;
          latestProviderPubkey = parsed.providerPubkey;
          latestEventId = parsed.eventId;
        }
      }
    } catch (_) {
      // Continue with other relays if one fails
    }
  }

  if (aggregatedMetrics.isEmpty || latestProviderPubkey == null) {
    return null;
  }

  return Nip85EventMetrics(
    eventId: latestEventId ?? eventId,
    providerPubkey: latestProviderPubkey,
    createdAt: latestCreatedAt,
    metrics: aggregatedMetrics,
  );
}