From 5283f6fce79394fc7715f93bd61acbfa5258dee2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Wed, 16 Oct 2024 13:32:15 +0200 Subject: [PATCH] WIP fetch relays and profile with ruby --- .../nostr_manager/discover_user_profile.rb | 38 +++++++++++++++++++ .../nostr_manager/discover_user_relays.rb | 26 ++++++++----- app/services/nostr_manager_service.rb | 1 + vendor/gems/nostr | 1 + 4 files changed, 57 insertions(+), 9 deletions(-) create mode 100644 app/services/nostr_manager/discover_user_profile.rb create mode 160000 vendor/gems/nostr diff --git a/app/services/nostr_manager/discover_user_profile.rb b/app/services/nostr_manager/discover_user_profile.rb new file mode 100644 index 0000000..789cbcf --- /dev/null +++ b/app/services/nostr_manager/discover_user_profile.rb @@ -0,0 +1,38 @@ +module NostrManager + class DiscoverUserProfile < NostrManagerService + MAX_EVENTS = 3 + + def initialize(pubkey:) + @pubkey = pubkey + @relays = Setting.nostr_discovery_relays + end + + def call + received_events = 0 + profile_events = [] + filter = Nostr::Filter.new( + authors: [@pubkey], + kinds: [0], + limit: 1, + ) + + @relays.each do |url| + event = NostrManager::FetchLatestEvent.call(filter: filter, relay_url: url) + + if event.present? + profile_events << event if profile_events.none? { |e| e["id"] == event["id"] } + received_events += 1 + end + + if received_events >= MAX_EVENTS + puts "Found #{MAX_EVENTS} events, ending the search" + break + end + end + + latest_event = profile_events.min_by { |e| e["created_at"] } + + puts latest_event.inspect + end + end +end diff --git a/app/services/nostr_manager/discover_user_relays.rb b/app/services/nostr_manager/discover_user_relays.rb index 942c471..a2216be 100644 --- a/app/services/nostr_manager/discover_user_relays.rb +++ b/app/services/nostr_manager/discover_user_relays.rb @@ -1,17 +1,14 @@ module NostrManager class DiscoverUserRelays < NostrManagerService + MAX_EVENTS = 3 + def initialize(pubkey:) @pubkey = pubkey @relays = Setting.nostr_discovery_relays - # @relays = %w[ - # wss://nostr.kosmos.org - # wss://purplepag.es - # wss://relay.nostr.band - # wss://njump.me - # ] end def call + received_events = 0 nip65_events = [] user_relays = [] filter = Nostr::Filter.new( @@ -22,12 +19,23 @@ module NostrManager @relays.each do |url| event = NostrManager::FetchLatestEvent.call(filter: filter, relay_url: url) - if event.present? && user_relays.detect { |r| r[:id] == event["id"] }.nil? - user_relays << { id: event["id"], created_at: event["created_at"] } + + if event.present? + nip65_events << event if nip65_events.none? { |e| e["id"] == event["id"] } + received_events += 1 + end + + if received_events >= MAX_EVENTS + puts "Found #{MAX_EVENTS} events, ending the search" + break end end - puts user_relays.inspect + latest_event = nip65_events.min_by { |e| e["created_at"] } + tags = latest_event["tags"] + + # puts latest_event.inspect + puts tags.select{ |t| t[0] == "r" }.inspect end end end diff --git a/app/services/nostr_manager_service.rb b/app/services/nostr_manager_service.rb index 7a85dc6..b0b80b6 100644 --- a/app/services/nostr_manager_service.rb +++ b/app/services/nostr_manager_service.rb @@ -3,6 +3,7 @@ require "nostr" class NostrManagerService < ApplicationService def parse_tags(tags) out = {} + # TODO support more than 1 item for each tag type tags.each do |tag| out[tag[0].to_sym] = tag[1, tag.length] end diff --git a/vendor/gems/nostr b/vendor/gems/nostr new file mode 160000 index 0000000..44e7454 --- /dev/null +++ b/vendor/gems/nostr @@ -0,0 +1 @@ +Subproject commit 44e7454990cffc66167254db9703fda642799588