git » sdk » commit 308558c

Support carbons

author Stephen Paul Weber
2023-09-12 20:39:41 UTC
committer Stephen Paul Weber
2023-09-12 20:39:41 UTC
parent 794ec7e6b045da357bdf3859c49f0a523e6d91d3

Support carbons

xmpp/ChatMessage.hx +11 -1
xmpp/Client.hx +9 -1

diff --git a/xmpp/ChatMessage.hx b/xmpp/ChatMessage.hx
index 05e165c..9b149f5 100644
--- a/xmpp/ChatMessage.hx
+++ b/xmpp/ChatMessage.hx
@@ -43,13 +43,23 @@ class ChatMessage {
 		final localJid = JID.parse(localJidStr);
 		final localJidBare = localJid.asBare();
 		final domain = localJid.domain;
+
+		if (msg.from != null && JID.parse(msg.from).asString() == localJidBare.asString()) {
+			var carbon = stanza.getChild("received", "urn:xmpp:carbons:2");
+			if (carbon == null) carbon = stanza.getChild("sent", "urn:xmpp:carbons:2");
+			if (carbon != null) {
+				var fwd = carbon.getChild("forwarded", "urn:xmpp:forward:0");
+				if(fwd != null) return fromStanza(fwd.getFirstChild(), localJidStr);
+			}
+		}
+
 		for (stanzaId in stanza.allTags("stanza-id", "urn:xmpp:sid:0")) {
 			if (stanzaId.attr.get("by") == domain || stanzaId.attr.get("by") == localJidBare.asString()) {
 				msg.serverId = stanzaId.attr.get("id");
 				break;
 			}
 		}
-		msg.direction = (JID.parse(msg.to).asBare().asString() == localJidBare.asString()) ? MessageReceived : MessageSent;
+		msg.direction = (msg.to == null || JID.parse(msg.to).asBare().asString() == localJidBare.asString()) ? MessageReceived : MessageSent;
 
 		if (msg.text == null) return null;
 
diff --git a/xmpp/Client.hx b/xmpp/Client.hx
index 7ea1947..f941cbd 100644
--- a/xmpp/Client.hx
+++ b/xmpp/Client.hx
@@ -46,7 +46,15 @@ class Client extends xmpp.EventEmitter {
 			return EventUnhandled; // Allow others to get this event as well
 		});
 
-		stream.sendStanza(new Stanza("presence")); // Set self to online
+		// Set self to online
+		stream.sendStanza(new Stanza("presence"));
+
+		// Enable carbons
+		stream.sendStanza(
+			new Stanza("iq", { type: "set", id: ID.short() })
+				.tag("enable", { xmlns: "urn:xmpp:carbons:2" })
+				.up()
+		);
 		rosterGet();
 		return this.trigger("status/online", {});
 	}