addresses.rb

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