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