@@ 117,17 117,59 @@ Thread.new do
}.show
end
-message :body do |m|
+def xml_child(parent, name, namespace)
+ child = Niceogiri::XML::Node.new(name, parent.document, namespace)
+ parent << child
+ child
+end
+
+def handle_live_message(m, counterpart: m.from.stripped.to_s)
LibUI.queue_main do
- conversation = $conversations[m.from.stripped.to_s]
+ conversation = $conversations[counterpart]
if conversation
conversation.new_message(m)
else
- Conversation.open(m.from.stripped.to_s, m)
+ Conversation.open(counterpart)
end
end
end
+def handle_carbons(fwd, counterpart:)
+ fwd = fwd.first if fwd.is_a?(Nokogiri::XML::NodeSet)
+ return unless fwd
+
+ m = Blather::XMPPNode.import(fwd)
+ return unless m.is_a?(Blather::Stanza::Message) && m.body.present?
+
+ handle_live_message(m, counterpart: counterpart.call(m))
+end
+
+when_ready do
+ self << Blather::Stanza::Iq.new(:set).tap { |iq|
+ xml_child(iq, :enable, "urn:xmpp:carbons:2")
+ }
+end
+
+message(
+ "./carbon:received/fwd:forwarded/*[1]",
+ carbon: "urn:xmpp:carbons:2",
+ fwd: "urn:xmpp:forward:0"
+) do |_, fwd|
+ handle_carbons(fwd, counterpart: ->(m) { m.from.stripped.to_s })
+end
+
+message(
+ "./carbon:sent/fwd:forwarded/*[1]",
+ carbon: "urn:xmpp:carbons:2",
+ fwd: "urn:xmpp:forward:0"
+) do |_, fwd|
+ handle_carbons(fwd, counterpart: ->(m) { m.to.stripped.to_s })
+end
+
+message :body do |m|
+ handle_live_message(m)
+end
+
after(:roster) do
LibUI.queue_main do
$roster.clear