git » sdk » commit f4c0245

Handler to get live messages as they come in

author Stephen Paul Weber
2023-07-03 18:31:54 UTC
committer Stephen Paul Weber
2023-07-26 19:47:14 UTC
parent e347504a91f3b5e5dc8e39509291cf6b4cc9c2ce

Handler to get live messages as they come in

Main.hx +3 -0
xmpp/Chat.hx +14 -1
xmpp/ChatMessage.hx +4 -1
xmpp/MessageSync.hx +2 -0

diff --git a/Main.hx b/Main.hx
index 809e1f8..989a94c 100644
--- a/Main.hx
+++ b/Main.hx
@@ -16,6 +16,9 @@ class Main {
 				}
 				trace("complete: " + !result.sync.hasMore());
 			});
+			chat.onMessage((msg) -> {
+				trace("live message: ", msg);
+			});
 
 			return EventHandled;
 		});
diff --git a/xmpp/Chat.hx b/xmpp/Chat.hx
index 9d52453..56531e1 100644
--- a/xmpp/Chat.hx
+++ b/xmpp/Chat.hx
@@ -15,7 +15,7 @@ abstract class Chat {
 	private var client:Client;
 	private var stream:GenericStream;
 	public var chatId(default, null):String;
-	public var type(default, null):ChatType;
+	public var type(default, null):Null<ChatType>;
 
 	private function new(client:Client, stream:GenericStream, chatId:String, type:ChatType) {
 		this.client = client;
@@ -30,6 +30,19 @@ abstract class Chat {
 	public function isDirectChat():Bool { return type.match(ChatTypeDirect); };
 	public function isGroupChat():Bool  { return type.match(ChatTypeGroup);  };
 	public function isPublicChat():Bool { return type.match(ChatTypePublic); };
+
+	public function onMessage(handler:ChatMessage->Void):Void {
+		this.stream.on("message", function(event) {
+			final stanza:Stanza = event.stanza;
+			final from = JID.parse(stanza.attr.get("from"));
+			if (from.asBare() != JID.parse(this.chatId)) return EventUnhandled;
+
+			final chatMessage = ChatMessage.fromStanza(stanza, this.client.jid);
+			if (chatMessage != null) handler(chatMessage);
+
+			return EventUnhandled; // Allow others to get this event as well
+		});
+	}
 }
 
 class DirectChat extends Chat {
diff --git a/xmpp/ChatMessage.hx b/xmpp/ChatMessage.hx
index 279f3d5..fbacb81 100644
--- a/xmpp/ChatMessage.hx
+++ b/xmpp/ChatMessage.hx
@@ -34,7 +34,7 @@ class ChatMessage {
 
 	public function new() { }
 
-	public static function fromStanza(stanza:Stanza, localJid:String):ChatMessage {
+	public static function fromStanza(stanza:Stanza, localJid:String):Null<ChatMessage> {
 		var msg = new ChatMessage();
 		msg.text = stanza.getChildText("body");
 		msg.to = stanza.attr.get("to");
@@ -47,6 +47,9 @@ class ChatMessage {
 			}
 		}
 		msg.direction = (msg.to == localJid) ? MessageReceived : MessageSent;
+
+		if (msg.text == null) return null;
+
 		return msg;
 	}
 
diff --git a/xmpp/MessageSync.hx b/xmpp/MessageSync.hx
index 87a0bea..ec8109c 100644
--- a/xmpp/MessageSync.hx
+++ b/xmpp/MessageSync.hx
@@ -78,6 +78,8 @@ class MessageSync {
 			var timestamp = result.findText("{urn:xmpp:forward:0}forwarded/{urn:xmpp:delay}delay@stamp");
 
 			var msg = ChatMessage.fromStanza(originalMessage, client.jid);
+			if (msg == null) return EventUnhandled;
+
 			msg.set_serverId(result.attr.get("id"));
 			msg.set_timestamp(timestamp);