| author | Stephen Paul Weber
<singpolyma@singpolyma.net> 2025-11-29 04:01:35 UTC |
| committer | Stephen Paul Weber
<singpolyma@singpolyma.net> 2025-11-29 04:01:35 UTC |
| parent | 4cf466d10f37b37dc12fb2fcb5a5b3eabd92f9ca |
| 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);