module NostrManager class PublishEvent < NostrManagerService def initialize(event: nil, relay_url: nil) relay_name = relay_url.gsub(/^ws(s):\/\//, "") @relay = Nostr::Relay.new(url: relay_url, name: relay_name) @event = case event.class when Nostr::Event event when Hash Nostr::Event.new(**event.symbolize_keys) # else # TODO # raise NotImplementedError end @client = Nostr::Client.new end def call client, relay, event = @client, @relay, @event client.on :connect do puts "Connected to #{relay.url}" puts "Publishing #{event.id}..." client.publish event end client.on :error do |e| # TODO log relay URL/name puts "Error: #{e}" puts "Closing thread..." Thread.exit end client.on :message do |m| puts "Message: #{m}" msg = JSON.parse(m) rescue [] if msg[0] == "OK" && msg[1] == event.id puts "Event published. Closing thread..." else # TODO log relay URL/name puts "Unexpected message from relay. Closing thread..." end Thread.exit end puts "Connecting to #{relay.url}..." client.connect relay end end end