| author | Stephen Paul Weber
<singpolyma@singpolyma.net> 2023-09-12 17:46:45 UTC |
| committer | Stephen Paul Weber
<singpolyma@singpolyma.net> 2023-09-12 17:46:45 UTC |
| parent | b2cb1d95c9bd08592f869652c541a559347c6532 |
| 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;