git » sdk » commit c97bb32

Optional event when new message from MAM

author Stephen Paul Weber
2024-12-10 18:57:38 UTC
committer Stephen Paul Weber
2024-12-10 18:57:38 UTC
parent 8cf0d4914a55b0021284d8e405d987909ad7ad75

Optional event when new message from MAM

snikket/Chat.hx +1 -0
snikket/Client.hx +30 -3

diff --git a/snikket/Chat.hx b/snikket/Chat.hx
index f5a2b5a..a8a9da7 100644
--- a/snikket/Chat.hx
+++ b/snikket/Chat.hx
@@ -1036,6 +1036,7 @@ class Channel extends Chat {
 			}
 			thenshim.PromiseTools.all(promises).then((stored) -> {
 				for (message in stored) {
+					client.notifySyncMessageHandlers(message);
 					if (message != null && message.chatId() == chatId) chatMessages.push(message);
 					if (chatMessages.length > 1000) chatMessages.shift(); // Save some RAM
 				}
diff --git a/snikket/Client.hx b/snikket/Client.hx
index 6f6b1f0..f274037 100644
--- a/snikket/Client.hx
+++ b/snikket/Client.hx
@@ -54,6 +54,7 @@ class Client extends EventEmitter {
 	public var sendAvailable(null, default): Bool = true;
 	private var stream:GenericStream;
 	private var chatMessageHandlers: Array<(ChatMessage, ChatMessageEvent)->Void> = [];
+	private var syncMessageHandlers: Array<(ChatMessage)->Void> = [];
 	private var chatStateHandlers: Array<(String,String,Null<String>,UserState)->Void> = [];
 	@:allow(snikket)
 	private var jid(default,null):JID;
@@ -1017,10 +1018,20 @@ class Client extends EventEmitter {
 			chatMessageHandlers.push((m, e) -> handler(m, cast e));
 	#else
 		public function addChatMessageListener(handler:(ChatMessage, ChatMessageEvent)->Void):Void {
-		chatMessageHandlers.push(handler);
+			chatMessageHandlers.push(handler);
 	#end
 	}
 
+	/**
+		Event fired when syncing a new ChatMessage that was send when offline.
+		Normally you don't want this, but it may be useful if you want to notify on app start.
+
+		@param handler takes one argument, the ChatMessage
+	**/
+	public function addSyncMessageListener(handler:(ChatMessage)->Void):Void {
+		syncMessageHandlers.push(handler);
+	}
+
 	/**
 		Event fired when a Chat's metadata is updated, or when a new Chat is added
 
@@ -1246,6 +1257,16 @@ class Client extends EventEmitter {
 		}
 	}
 
+	@:allow(snikket)
+	private function notifySyncMessageHandlers(message: ChatMessage) {
+		if (message == null || message.versions.length > 1) return;
+		final chat = getChat(message.chatId());
+		if (chat != null && chat.isBlocked) return; // Don't notify blocked chats
+		for (handler in syncMessageHandlers) {
+			handler(message);
+		}
+	}
+
 	private function rosterGet() {
 		var rosterGet = new RosterGet();
 		rosterGet.onFinished(() -> {
@@ -1394,14 +1415,20 @@ class Client extends EventEmitter {
 						}));
 					case ReactionUpdateStanza(update):
 						promises.push(new thenshim.Promise((resolve, reject) -> {
-							persistence.storeReaction(accountId(), update, resolve);
+							persistence.storeReaction(accountId(), update, (_) -> resolve(null));
 						}));
 					default:
 						// ignore
 				}
 			}
 			trace("SYNC: MAM page wait for writes");
-			thenshim.PromiseTools.all(promises).then((_) -> {
+			thenshim.PromiseTools.all(promises).then((storedMessages) -> {
+				if (syncMessageHandlers.length > 0) {
+					for (message in storedMessages) {
+						notifySyncMessageHandlers(message);
+					}
+				}
+
 				if (sync.hasMore()) {
 					sync.fetchNext();
 				} else {