diff --git a/lib/blather_notify.rb b/lib/blather_notify.rb index 81deb18cf6dfd88bf1a691ce2607a0c45168f26d..309f9e59eb05c0fd614b68b64c556345cd9b9c3f 100644 --- a/lib/blather_notify.rb +++ b/lib/blather_notify.rb @@ -7,13 +7,45 @@ require "timeout" module BlatherNotify extend Blather::DSL + class PubSub + class Address + attr_reader :node, :server + + def initialize(node:, server:) + @node = node + @server = server + end + + def to_uri + "xmpp:#{@server}?;node=#{@node}" + end + end + + def initialize(blather, addr) + @blather = blather + @addr = addr + end + + def publish(xml) + @blather.write_with_promise( + Blather::Stanza::PubSub::Publish.new( + @addr.server, + @addr.node, + :set, + xml + ) + ) + end + end + @ready = Queue.new when_ready { @ready << :ready } - def self.start(jid, password) + def self.start(jid, password, default_pubsub_addr: nil) # workqueue_count MUST be 0 or else Blather uses threads! setup(jid, password, nil, nil, nil, nil, workqueue_count: 0) + set_default_pubsub(default_pubsub_addr) EM.error_handler(&method(:panic)) @@ -81,4 +113,18 @@ module BlatherNotify write_with_promise(command(command_node, iq.sessionid, form: form)) end end + + def self.pubsub(addr) + PubSub.new(self, addr) + end + + def self.set_default_pubsub(addr) + @default_pubsub = addr && pubsub(addr) + end + + def self.publish(xml) + raise "No default pubsub set!" unless @default_pubsub + + @default_pubsub.publish(xml) + end end