git » sdk » commit 54e5a1c

MUC invites from MAM also

author Stephen Paul Weber
2025-11-29 04:01:35 UTC
committer Stephen Paul Weber
2025-11-29 04:01:35 UTC
parent 4cf466d10f37b37dc12fb2fcb5a5b3eabd92f9ca

MUC invites from MAM also

borogove/Chat.hx +2 -2
borogove/Client.hx +29 -29
borogove/MessageSync.hx +7 -10

diff --git a/borogove/Chat.hx b/borogove/Chat.hx
index c7d7975..e8df389 100644
--- a/borogove/Chat.hx
+++ b/borogove/Chat.hx
@@ -163,7 +163,7 @@ abstract class Chat {
 			sync.onMessages((messageList) -> {
 				final chatMessages = [];
 				for (m in messageList.messages) {
-					switch (m) {
+					switch (m.parsed) {
 					case ChatMessageStanza(message):
 						chatMessages.push(message);
 					case ReactionUpdateStanza(update):
@@ -1440,7 +1440,7 @@ class Channel extends Chat {
 			final promises = [];
 			final pageChatMessages = [];
 			for (m in messageList.messages) {
-				switch (m) {
+				switch (m.parsed) {
 					case ChatMessageStanza(message):
 						for (hash in message.inlineHashReferences()) {
 							client.fetchMediaByHash([hash], [message.from]);
diff --git a/borogove/Client.hx b/borogove/Client.hx
index 2bbbd95..2686352 100644
--- a/borogove/Client.hx
+++ b/borogove/Client.hx
@@ -484,34 +484,7 @@ class Client extends EventEmitter {
 					stanza.getErrorText(),
 				).then((m) -> notifyMessageHandlers(m, StatusEvent), _ -> null);
 			case MucInviteStanza(serverId, serverIdBy, reason, password):
-				final chat = getChat(message.chatId);
-				if (chat == null) {
-					startChatWith(message.chatId, _ -> Invited, (chat) -> {
-						final inviteExt = chat.extensions.tag("invite", { xmlns: "http://jabber.org/protocol/muc#user", from: message.senderId });
-						if (reason != null) inviteExt.textTag("reason", reason);
-						if (password != null) inviteExt.textTag("password", password);
-						if (message.threadId != null) inviteExt.tag("continue", { thread: message.threadId }).up();
-						if (serverId != null && serverIdBy != null) {
-							inviteExt.tag("stanza-id", { xmlns: "urn:xmpp:sid:0", by: serverIdBy, id: serverId }).up();
-						}
-						inviteExt.up();
-						this.trigger("chats/update", [chat]);
-						persistence.storeChats(accountId(), [chat]);
-					});
-				} else if (chat.uiState == Closed) {
-					chat.extensions.removeChildren("invite", "http://jabber.org/protocol/muc#user");
-					final inviteExt = chat.extensions.tag("invite", { xmlns: "http://jabber.org/protocol/muc#user", from: message.senderId });
-					if (reason != null) inviteExt.textTag("reason", reason);
-					if (password != null) inviteExt.textTag("password", password);
-					if (message.threadId != null) inviteExt.tag("continue", { thread: message.threadId }).up();
-					if (serverId != null && serverIdBy != null) {
-						inviteExt.tag("stanza-id", { xmlns: "urn:xmpp:sid:0", by: serverIdBy, id: serverId }).up();
-					}
-					inviteExt.up();
-					chat.uiState = Invited;
-					this.trigger("chats/update", [chat]);
-					persistence.storeChats(accountId(), [chat]);
-				}
+				mucInvite(message.chatId, getChat(message.chatId), message.senderId, message.threadId, serverId, serverIdBy, reason, password);
 			default:
 				// ignore
 				trace("Ignoring non-chat message: " + stanza.toString());
@@ -1635,6 +1608,31 @@ class Client extends EventEmitter {
 		sendQuery(discoGet);
 	}
 
+	private function mucInvite(chatId: String, chat: Null<Chat>, senderId: String, threadId: Null<String>, serverId: Null<String>, serverIdBy: Null<String>, reason: Null<String>, password: Null<String>) {
+		if (chat == null) {
+			startChatWith(chatId, _ -> Invited, (chat) -> {
+				mucInvite(chatId, chat, senderId, threadId, serverId, serverIdBy, reason, password);
+			});
+			return;
+		}
+
+		// Already open so keep it that way
+		if (chat.uiState != Closed && chat.uiState != Invited) return;
+
+		chat.extensions.removeChildren("invite", "http://jabber.org/protocol/muc#user");
+		final inviteExt = chat.extensions.tag("invite", { xmlns: "http://jabber.org/protocol/muc#user", from: senderId });
+		if (reason != null) inviteExt.textTag("reason", reason);
+		if (password != null) inviteExt.textTag("password", password);
+		if (threadId != null) inviteExt.tag("continue", { thread: threadId }).up();
+		if (serverId != null && serverIdBy != null) {
+			inviteExt.tag("stanza-id", { xmlns: "urn:xmpp:sid:0", by: serverIdBy, id: serverId }).up();
+		}
+		inviteExt.up();
+		chat.uiState = Invited;
+		this.trigger("chats/update", [chat]);
+		persistence.storeChats(accountId(), [chat]);
+	}
+
 	private function serverBlocked(blocked: String) {
 		final chat = getChat(blocked) ?? getDirectChat(blocked, false);
 		chat.block(false, null, false);
@@ -1746,7 +1744,7 @@ class Client extends EventEmitter {
 			final promises = [];
 			final chatMessages = [];
 			for (m in messageList.messages) {
-				switch (m) {
+				switch (m.parsed) {
 					case ChatMessageStanza(message):
 						chatMessages.push(message);
 						if (message.type == MessageChat) chatIds[message.chatId()] = true;
@@ -1765,6 +1763,8 @@ class Client extends EventEmitter {
 							MessageFailedToSend,
 							stanza.getErrorText(),
 						).then(m -> [m]));
+					case MucInviteStanza(serverId, serverIdBy, reason, password):
+						mucInvite(m.chatId, getChat(m.chatId), m.senderId, m.threadId, serverId, serverIdBy, reason, password);
 					default:
 						// ignore
 				}
diff --git a/borogove/MessageSync.hx b/borogove/MessageSync.hx
index 8655fc3..d55128b 100644
--- a/borogove/MessageSync.hx
+++ b/borogove/MessageSync.hx
@@ -17,7 +17,7 @@ import borogove.OMEMO;
 
 typedef MessageList = {
 	var sync:MessageSync;
-	var messages:Array<MessageStanza>;
+	var messages:Array<Message>;
 }
 
 typedef MessageListHandler = (MessageList) -> Void;
@@ -52,7 +52,7 @@ class MessageSync {
 		if (complete) {
 			throw new Exception("Attempt to fetch messages, but already complete");
 		}
-		final promisedMessages:Array<Promise<MessageStanza>> = [];
+		final promisedMessages:Array<Promise<Message>> = [];
 		if (lastPage == null) {
 			if (newestPageFirst == true && (filter.page == null || (filter.page.before == null && filter.page.after == null))) {
 				if (filter.page == null)
@@ -119,26 +119,23 @@ class MessageSync {
 					final decryptedStanza = decryptionResult.stanza;
 					trace("MAM: Decrypted stanza: "+decryptedStanza);
 
-					final msg = Message.fromStanza(decryptedStanza, client.jid, (builder, stanza) -> {
+					return Message.fromStanza(decryptedStanza, client.jid, (builder, stanza) -> {
 						builder.serverId = result.attr.get("id");
 						builder.serverIdBy = serviceJID;
 						builder.encryption = decryptionResult.encryptionInfo;
 						if (timestamp != null && builder.timestamp == null) builder.timestamp = timestamp;
 						return contextHandler(builder, stanza);
-					}).parsed;
-
-					return msg;
+					});
 				}, (err) -> {
 					trace("MAM: Decryption failed: "+err);
-					final msg = Message.fromStanza(originalMessage, client.jid, (builder, stanza) -> {
+					return Message.fromStanza(originalMessage, client.jid, (builder, stanza) -> {
 							builder.serverId = result.attr.get("id");
 							builder.serverIdBy = serviceJID;
 							if (timestamp != null && builder.timestamp == null) builder.timestamp = timestamp;
 							return contextHandler(builder, stanza);
 						},
 						new EncryptionInfo(DecryptionFailure, NS.OMEMO, "OMEMO", "internal-error", Std.string(err))
-					).parsed;
-					return msg;
+					);
 				}));
 #end
 				return EventHandled;
@@ -150,7 +147,7 @@ class MessageSync {
 					builder.serverIdBy = serviceJID;
 					if (timestamp != null && builder.timestamp == null) builder.timestamp = timestamp;
 					return contextHandler(builder, stanza);
-				}).parsed;
+				});
 
 				promisedMessages.push(Promise.resolve(msg));
 				//messages.push(msg);