git » sdk » commit d8f9a7f

Add MAM order to the timestamp

author Stephen Paul Weber
2025-11-11 15:45:23 UTC
committer Stephen Paul Weber
2025-11-11 15:54:32 UTC
parent 0748232e8c2532c14bc74805cf22aae610386273

Add MAM order to the timestamp

If the timestamp lacks subseconds itself

borogove/MessageSync.hx +22 -0

diff --git a/borogove/MessageSync.hx b/borogove/MessageSync.hx
index d1f2830..8655fc3 100644
--- a/borogove/MessageSync.hx
+++ b/borogove/MessageSync.hx
@@ -9,6 +9,7 @@ import borogove.queries.MAMQuery;
 
 import thenshim.Promise;
 import thenshim.PromiseTools;
+using StringTools;
 
 #if !NO_OMEMO
 import borogove.OMEMO;
@@ -68,6 +69,8 @@ class MessageSync {
 			}
 		}
 		var query = new MAMQuery(filter, serviceJID);
+		var previousMessageTime = "";
+		var counterSameTime = 0;
 		final eventToken = stream.on("message", function (event) {
 			progress++;
 			var message:Stanza = event.stanza;
@@ -84,6 +87,25 @@ class MessageSync {
 				return EventHandled;
 			}
 			var timestamp = result.findText("{urn:xmpp:forward:0}forwarded/{urn:xmpp:delay}delay@stamp");
+			if (timestamp == null) {
+				trace("MAM result with no timestamp", result);
+			} else {
+				// If no subseconds, fix them to at least sort right
+				timestamp = ~/([0-9][0-9]:[0-9][0-9]:[0-9][0-9])(\.[0-9][0-9][0-9])?/.map(timestamp, (ereg) -> {
+					if (ereg.matched(2) == null || ereg.matched(2) == ".000") {
+						if (ereg.matched(1) == previousMessageTime) {
+							counterSameTime++;
+						} else {
+							previousMessageTime = ereg.matched(1);
+							counterSameTime = 1;
+						}
+
+						return ereg.matched(1) + "." + Std.string(counterSameTime).lpad("0", 3);
+					}
+
+					return ereg.matched(0);
+				});
+			}
 
 			final jmiChildren = originalMessage.allTags(null, "urn:xmpp:jingle-message:0");
 			if (jmiChildren.length > 0) {