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