addresses.rb

 1# frozen_string_literal: true
 2
 3class Addresses < Blather::XMPPNode
 4	include Enumerable
 5
 6	register :addresses, "http://jabber.org/protocol/address"
 7
 8	def self.new(addresses)
 9		new_node = super(:addresses)
10
11		if addresses.is_a?(Array)
12			addresses.each do |address|
13				new_node << Address.new(**address)
14			end
15		end
16
17		new_node
18	end
19
20	def self.import(node)
21		ns = node.namespace&.href
22		klass = class_from_registration(node.element_name, ns)
23		# For some reason blather tries to import a message with us as a child as us
24		# So if we don't override this it leads to infinite recursion
25		if klass == Blather::Stanza::Message
26			Blather::Stanza::Message.new(node[:type]).inherit(node)
27		else
28			super
29		end
30	end
31
32	def each
33		find("./ns:address", ns: self.class.registered_ns).each do |node|
34			yield Address.import(node)
35		end
36	end
37
38	class Address < Blather::XMPPNode
39		register :address, "http://jabber.org/protocol/address"
40
41		def self.new(*, type: nil, jid: nil, uri: nil, delivered: nil)
42			new_node = super(:address)
43			new_node["type"] = type
44			new_node["jid"] = jid if jid
45			new_node["uri"] = uri if uri
46			new_node["delivered"] = delivered.to_s unless delivered.nil?
47			new_node
48		end
49
50		def type
51			self["type"]
52		end
53
54		def jid
55			if self["jid"]
56				Blather::JID.new(self["jid"])
57			else
58				Blather::JID.new(uri.sub(/\Asms:\+?/, ""), "mms.chat.1pcom.net")
59			end
60		end
61
62		def uri
63			self["uri"]
64		end
65
66		def delivered?
67			self["delivered"] == "true"
68		end
69	end
70end
71
72module Blather
73	class Stanza
74		class Message
75			def addresses
76				find(
77					"/message/ns:addresses",
78					ns: "http://jabber.org/protocol/address"
79				).first&.then do |node|
80					Addresses.import(node)
81				end
82			end
83		end
84	end
85end