| author | Stephen Paul Weber
<singpolyma@singpolyma.net> 2023-07-03 18:31:54 UTC |
| committer | Stephen Paul Weber
<singpolyma@singpolyma.net> 2023-07-26 19:47:14 UTC |
| parent | e347504a91f3b5e5dc8e39509291cf6b4cc9c2ce |
| 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);