git » sdk » commit fdf673c

Allow qurying all MAM or just one chat

author Stephen Paul Weber
2023-09-12 17:46:45 UTC
committer Stephen Paul Weber
2023-09-12 17:46:45 UTC
parent b2cb1d95c9bd08592f869652c541a559347c6532

Allow qurying all MAM or just one chat

xmpp/Chat.hx +6 -3
xmpp/MessageSync.hx +11 -15

diff --git a/xmpp/Chat.hx b/xmpp/Chat.hx
index de909da..fb5d406 100644
--- a/xmpp/Chat.hx
+++ b/xmpp/Chat.hx
@@ -4,6 +4,7 @@ import xmpp.MessageSync;
 import xmpp.ChatMessage;
 import xmpp.Chat;
 import xmpp.GenericStream;
+import xmpp.queries.MAMQuery;
 
 enum ChatType {
 	ChatTypeDirect;
@@ -25,7 +26,7 @@ abstract class Chat {
 
 	abstract public function sendMessage(message:ChatMessage):Void;
 
-	abstract public function getMessages(handler:MessageListHandler):MessageSync;
+	abstract public function getMessages(beforeId:Null<String>, handler:MessageListHandler):MessageSync;
 
 	public function isDirectChat():Bool { return type.match(ChatTypeDirect); };
 	public function isGroupChat():Bool  { return type.match(ChatTypeGroup);  };
@@ -50,8 +51,10 @@ class DirectChat extends Chat {
 		super(client, stream, chatId, ChatTypeDirect);
 	}
 
-	public function getMessages(handler:MessageListHandler):MessageSync {
-		var sync = new MessageSync(this.client, this.stream, this.chatId, {});
+	public function getMessages(beforeId:Null<String>, handler:MessageListHandler):MessageSync {
+		var filter:MAMQueryParams = { with: this.chatId };
+		if (beforeId != null) filter.page = { before: beforeId };
+		var sync = new MessageSync(this.client, this.stream, filter);
 		sync.onMessages(handler);
 		sync.fetchNext();
 		return sync;
diff --git a/xmpp/MessageSync.hx b/xmpp/MessageSync.hx
index ec8109c..c60408e 100644
--- a/xmpp/MessageSync.hx
+++ b/xmpp/MessageSync.hx
@@ -28,10 +28,9 @@ class MessageSync {
 	private var complete:Bool = false;
 	private var newestPageFirst:Bool = true;
 
-	public function new(client:Client, stream:GenericStream, chatId:String, filter:MessageFilter, ?serviceJID:String) {
+	public function new(client:Client, stream:GenericStream, filter:MessageFilter, ?serviceJID:String) {
 		this.client = client;
 		this.stream = stream;
-		this.chatId = chatId;
 		this.filter = Reflect.copy(filter);
 		this.serviceJID = serviceJID != null ? serviceJID : client.jid;
 	}
@@ -40,27 +39,24 @@ class MessageSync {
 		if(handler == null) {
 			throw new Exception("Attempt to fetch messages, but no handler has been set");
 		}
+		if (complete) {
+			throw new Exception("Attempt to fetch messages, but already complete");
+		}
 		var messages:Array<ChatMessage> = [];
 		if(lastPage == null) {
-			if(newestPageFirst == true) {
-				filter.page = {
-					before: "", // Request last page of results
-				};
-			} else {
-				filter.page = null;
+			if(newestPageFirst == true && (filter.page == null || filter.page.before == null)) {
+				if (filter.page == null) filter.page = {};
+				filter.page.before = ""; // Request last page of results
 			}
 		} else {
+			if (filter.page == null) filter.page = {};
 			if(newestPageFirst == true) {
-				filter.page = {
-					before: lastPage.first,
-				};
+				filter.page.before = lastPage.first;
 			} else {
-				filter.page = {
-					after: lastPage.last,
-				};
+				filter.page.after = lastPage.last;
 			}
 		}
-		var query = new MAMQuery(filter);
+		var query = new MAMQuery(filter, serviceJID);
 		var resultHandler = stream.on("message", function (event) {
 			var message:Stanza = event.stanza;
 			var from = message.attr.exists("from") ? message.attr.get("from") : client.jid;