module NostrManager class PublishEvent < NostrManagerService def initialize(event:, relay_url:) relay_name = URI.parse(relay_url).host @relay = Nostr::Relay.new(url: relay_url, name: relay_name) if event.is_a?(Nostr::Event) @event = event else @event = Nostr::Event.new(**event.symbolize_keys) end @client = Nostr::Client.new end def call client, relay, event = @client, @relay, @event log_prefix = "[nostr][#{relay.name}]" thread = Thread.new do client.on :connect do puts "#{log_prefix} Publishing #{event.id}..." client.publish event end client.on :error do |e| puts "#{log_prefix} Error: #{e}" puts "#{log_prefix} Closing thread..." thread.exit end client.on :message do |m| puts "#{log_prefix} Message: #{m}" msg = JSON.parse(m) rescue [] if msg[0] == "OK" && msg[1] == event.id && msg[2] puts "#{log_prefix} Event published. Closing thread..." else puts "#{log_prefix} Unexpected message from relay. Closing thread..." end thread.exit end puts "#{log_prefix} Connecting to #{relay.url}..." client.connect relay end thread.join end end end