branch: elpa/jabber
commit 40ec932ff0a2bdb994e4162c32e16b7e92d1616b
Author: Thanos Apollo <[email protected]>
Commit: Thanos Apollo <[email protected]>
muc: Separate stanza classification
---
lisp/jabber-alert.el | 2 +-
lisp/jabber-chat.el | 5 +--
lisp/jabber-chatbuffer.el | 2 +-
lisp/jabber-db.el | 2 +-
lisp/jabber-message-reply.el | 3 +-
lisp/jabber-muc-protocol.el | 91 ++++++++++++++++++++++++++++++++++++++++++++
lisp/jabber-muc.el | 71 +---------------------------------
lisp/jabber-presence.el | 2 +-
lisp/jabber-vcard-avatars.el | 5 +--
9 files changed, 100 insertions(+), 83 deletions(-)
diff --git a/lisp/jabber-alert.el b/lisp/jabber-alert.el
index b61d9fdbb6..02158d4ee8 100644
--- a/lisp/jabber-alert.el
+++ b/lisp/jabber-alert.el
@@ -30,6 +30,7 @@
(require 'cl-lib)
(require 'jabber-util)
(require 'jabber-xml)
+(require 'jabber-muc-protocol)
(require 'jabber-muc-state)
(defgroup jabber-alerts nil
@@ -242,7 +243,6 @@ files."
(declare-function jabber-chat-find-buffer "jabber-chat.el" (chat-with))
(declare-function jabber-chat-send "jabber-chat.el"
(jc body &optional extra-elements))
-(declare-function jabber-muc-sender-p "jabber-muc.el" (jid))
(defvar jabber-presence-strings) ; jabber.el
(defvar jabber-xml-data) ; jabber.el
(defvar jabber-buffer-connection) ; jabber-chatbuffer.el
diff --git a/lisp/jabber-chat.el b/lisp/jabber-chat.el
index ae12b60a5f..b57eb56b55 100644
--- a/lisp/jabber-chat.el
+++ b/lisp/jabber-chat.el
@@ -39,6 +39,7 @@
(require 'url-queue)
(require 'hex-util)
(require 'jabber-image)
+(require 'jabber-muc-protocol)
(require 'jabber-muc-state)
;; For the `image-property' setf-expander (not preloaded on emacs-nox).
(require 'image)
@@ -271,10 +272,6 @@ holding state for the next composed message stay inert."
(msg &optional local dont-print-nick-p))
(declare-function jabber-muc-private-print-prompt "jabber-muc.el" (msg))
(declare-function jabber-muc-system-prompt "jabber-muc.el" (&rest _ignore))
-(declare-function jabber-muc-message-p "jabber-muc.el"(message))
-(declare-function jabber-muc-sender-p "jabber-muc.el" (jid))
-(declare-function jabber-muc-private-message-p "jabber-muc.el" (message))
-(defvar jabber-muc-xmlns-user)
(declare-function jabber-omemo-aesgcm-decrypt "jabber-omemo"
(key iv ciphertext-with-tag))
(defvar jabber-backlog-days)
diff --git a/lisp/jabber-chatbuffer.el b/lisp/jabber-chatbuffer.el
index 55c9308e2f..86c54f1567 100644
--- a/lisp/jabber-chatbuffer.el
+++ b/lisp/jabber-chatbuffer.el
@@ -29,6 +29,7 @@
(require 'jabber-util)
(require 'jabber-core)
(require 'jabber-db)
+(require 'jabber-muc-protocol)
(require 'keymap-popup)
(require 'help-at-pt)
@@ -596,7 +597,6 @@ EWOC-PP is the pretty-printer function for the message
EWOC."
(declare-function jabber-chat-find-buffer "jabber-chat" (chat-with))
(declare-function jabber-muc-find-buffer "jabber-muc" (group))
-(declare-function jabber-muc-sender-p "jabber-muc" (jid))
(declare-function jabber-chat-find-buffer "jabber-chat" (chat-with))
(declare-function jabber-chat-insert-backlog-entry "jabber-chat"
(msg-plist))
diff --git a/lisp/jabber-db.el b/lisp/jabber-db.el
index 696c0e6ec9..93f59b0391 100644
--- a/lisp/jabber-db.el
+++ b/lisp/jabber-db.el
@@ -38,12 +38,12 @@
(require 'subr-x)
(require 'jabber-util)
(require 'jabber-xml)
+(require 'jabber-muc-protocol)
(require 'jabber-muc-state)
(eval-when-compile
(require 'cl-lib)
(require 'seq))
-(declare-function jabber-muc-sender-p "jabber-muc" (jid))
(defvar jabber-chatting-with) ; jabber-chat.el
(defvar jabber-chat-send-hooks) ; jabber-chat.el
(defvar jabber-chat-encryption) ; jabber-chatbuffer.el
diff --git a/lisp/jabber-message-reply.el b/lisp/jabber-message-reply.el
index 3fff9f1ee6..697b45361a 100644
--- a/lisp/jabber-message-reply.el
+++ b/lisp/jabber-message-reply.el
@@ -34,6 +34,7 @@
(require 'ewoc)
(require 'jabber-util)
(require 'jabber-disco)
+(require 'jabber-muc-protocol)
(require 'jabber-xml)
@@ -44,8 +45,6 @@
(defvar jabber-chatting-with) ; jabber-chatbuffer.el
(defvar jabber-buffer-connection) ; jabber-chatbuffer.el
-(declare-function jabber-muc-sender-p "jabber-muc" (jid))
-
(defconst jabber-message-reply-xmlns "urn:xmpp:reply:0"
"XEP-0461 Message Replies namespace.")
diff --git a/lisp/jabber-muc-protocol.el b/lisp/jabber-muc-protocol.el
new file mode 100644
index 0000000000..a5a08c8415
--- /dev/null
+++ b/lisp/jabber-muc-protocol.el
@@ -0,0 +1,91 @@
+;;; jabber-muc-protocol.el --- Multi-user chat stanza classification -*-
lexical-binding: t; -*-
+
+;; Copyright (C) 2026 Thanos Apollo
+
+;; Maintainer: Thanos Apollo <[email protected]>
+
+;; This file is a part of jabber.el.
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2 of the License, or
+;; (at your option) any later version.
+
+;;; Commentary:
+
+;; Classify MUC stanzas without loading room buffers or interactive commands.
+
+;;; Code:
+
+(require 'cl-lib)
+(require 'jabber-muc-state)
+(require 'jabber-util)
+(require 'jabber-xml)
+
+(defconst jabber-muc-xmlns "http://jabber.org/protocol/muc"
+ "XEP-0045 MUC namespace.")
+
+(defconst jabber-muc-xmlns-user "http://jabber.org/protocol/muc#user"
+ "XEP-0045 MUC user namespace.")
+
+(defconst jabber-muc-xmlns-owner "http://jabber.org/protocol/muc#owner"
+ "XEP-0045 MUC owner namespace.")
+
+(defconst jabber-muc-xmlns-admin "http://jabber.org/protocol/muc#admin"
+ "XEP-0045 MUC admin namespace.")
+
+(defconst jabber-muc-xmlns-direct-invite "jabber:x:conference"
+ "XEP-0249 Direct MUC Invitations namespace.")
+
+(defvar jabber-pending-groupchats (make-hash-table)
+ "Hash table of groupchats and nicknames.
+Keys are JID symbols; values are strings.
+This table records the last nickname used to join the particular
+chat room. Items are thus never removed.")
+
+;;;###autoload
+(defun jabber-muc-message-p (message)
+ "Return non-nil if MESSAGE is a groupchat message.
+That does not include private messages in a groupchat, but does
+include groupchat invites."
+ (let ((from (jabber-xml-get-attribute message 'from))
+ (type (jabber-xml-get-attribute message 'type)))
+ (or (string= type "groupchat")
+ (and (string= type "error")
+ (gethash (jabber-jid-symbol from) jabber-pending-groupchats))
+ (jabber-xml-path message `((,jabber-muc-xmlns-user . "x") invite))
+ (jabber-xml-path
+ message `((,jabber-muc-xmlns-direct-invite . "x"))))))
+
+;;;###autoload
+(defun jabber-muc-sender-p (jid)
+ "Return non-nil if JID is a full JID of an MUC participant."
+ (and (jabber-muc-joined-p (jabber-jid-user jid))
+ (jabber-jid-resource jid)))
+
+;;;###autoload
+(defun jabber-muc-private-message-p (message)
+ "Return non-nil if MESSAGE is a private message in a groupchat."
+ (let ((from (jabber-xml-get-attribute message 'from))
+ (type (jabber-xml-get-attribute message 'type)))
+ (and (not (string= type "groupchat"))
+ (jabber-muc-sender-p from))))
+
+(defun jabber-muc-presence-p (presence)
+ "Return non-nil if PRESENCE is presence from groupchat."
+ (let ((from (jabber-xml-get-attribute presence 'from))
+ (type (jabber-xml-get-attribute presence 'type))
+ (muc-marker
+ (cl-find-if
+ (lambda (x)
+ (equal (jabber-xml-get-attribute x 'xmlns)
+ jabber-muc-xmlns-user))
+ (jabber-xml-get-children presence 'x))))
+ (or muc-marker
+ (and (string= type "error")
+ (gethash (jabber-jid-symbol from)
+ jabber-pending-groupchats)))))
+
+(provide 'jabber-muc-protocol)
+
+;;; jabber-muc-protocol.el ends here
diff --git a/lisp/jabber-muc.el b/lisp/jabber-muc.el
index 1186159784..56d4077c19 100644
--- a/lisp/jabber-muc.el
+++ b/lisp/jabber-muc.el
@@ -33,33 +33,13 @@
(require 'ewoc)
(require 'jabber-widget)
(require 'jabber-disco)
+(require 'jabber-muc-protocol)
(require 'jabber-muc-state)
(require 'jabber-bookmarks)
(require 'jabber-chat)
(require 'jabber-db)
(require 'jabber-presence)
-(defconst jabber-muc-xmlns "http://jabber.org/protocol/muc"
- "XEP-0045 MUC namespace.")
-
-(defconst jabber-muc-xmlns-user "http://jabber.org/protocol/muc#user"
- "XEP-0045 MUC user namespace.")
-
-(defconst jabber-muc-xmlns-owner "http://jabber.org/protocol/muc#owner"
- "XEP-0045 MUC owner namespace.")
-
-(defconst jabber-muc-xmlns-admin "http://jabber.org/protocol/muc#admin"
- "XEP-0045 MUC admin namespace.")
-
-(defconst jabber-muc-xmlns-direct-invite "jabber:x:conference"
- "XEP-0249 Direct MUC Invitations namespace.")
-
-(defvar jabber-pending-groupchats (make-hash-table)
- "Hash table of groupchats and nicknames.
-Keys are JID symbols; values are strings.
-This table records the last nickname used to join the particular
-chat room. Items are thus never removed.")
-
(defvar jabber-muc-participants nil
"Alist of groupchats and participants.
Keys are strings, the bare JID of the room.
@@ -1482,41 +1462,6 @@ JC is the Jabber connection."
(jabber-muc--rejoin-snapshot jc)
(jabber-muc--autojoin-fire-pending jc))))
-;;;###autoload
-(defun jabber-muc-message-p (message)
- "Return non-nil if MESSAGE is a groupchat message.
-That does not include private messages in a groupchat, but does
-include groupchat invites."
- ;; Public groupchat messages have type "groupchat" and are from
- ;; room@server/nick. Public groupchat errors have type "error" and
- ;; are from room@server.
- (let ((from (jabber-xml-get-attribute message 'from))
- (type (jabber-xml-get-attribute message 'type)))
- (or
- (string= type "groupchat")
- (and (string= type "error")
- (gethash (jabber-jid-symbol from) jabber-pending-groupchats))
- (jabber-xml-path message `((,jabber-muc-xmlns-user . "x") invite))
- ;; XEP-0249 direct invite
- (jabber-xml-path message
- `((,jabber-muc-xmlns-direct-invite . "x"))))))
-
-;;;###autoload
-(defun jabber-muc-sender-p (jid)
- "Return non-nil if JID is a full JID of an MUC participant."
- (and (jabber-muc-joined-p (jabber-jid-user jid))
- (jabber-jid-resource jid)))
-
-;;;###autoload
-(defun jabber-muc-private-message-p (message)
- "Return non-nil if MESSAGE is a private message in a groupchat."
- (let ((from (jabber-xml-get-attribute message 'from))
- (type (jabber-xml-get-attribute message 'type)))
- (and
- (not (string= type "groupchat"))
- (jabber-muc-sender-p from))))
-
-
(defun jabber-muc-private (_jc group nickname)
"Open private chat with NICKNAME in GROUP.
@@ -1526,20 +1471,6 @@ JC is the Jabber connection."
(list (jabber-muc-read-nickname jabber-group "Nickname: "))))
(switch-to-buffer (jabber-muc-private-create-buffer jabber-buffer-connection
group nickname)))
-(defun jabber-muc-presence-p (presence)
- "Return non-nil if PRESENCE is presence from groupchat."
- (let ((from (jabber-xml-get-attribute presence 'from))
- (type (jabber-xml-get-attribute presence 'type))
- (muc-marker (cl-find-if
- (lambda (x) (equal (jabber-xml-get-attribute x 'xmlns)
- jabber-muc-xmlns-user))
- (jabber-xml-get-children presence 'x))))
- ;; This is MUC presence if it has an MUC-namespaced tag...
- (or muc-marker
- ;; ...or if it is error presence from a room we tried to join.
- (and (string= type "error")
- (gethash (jabber-jid-symbol from) jabber-pending-groupchats)))))
-
(defun jabber-muc-parse-affiliation (x-muc)
"Parse X-MUC in the muc#user namespace and return a plist.
Return nil if X-MUC is nil."
diff --git a/lisp/jabber-presence.el b/lisp/jabber-presence.el
index 981cf29550..cc43a971da 100644
--- a/lisp/jabber-presence.el
+++ b/lisp/jabber-presence.el
@@ -31,6 +31,7 @@
(require 'jabber-iq)
(require 'jabber-alert)
(require 'jabber-util)
+(require 'jabber-muc-protocol)
(require 'jabber-muc-state)
(require 'ewoc)
@@ -64,7 +65,6 @@ stanza.")
(declare-function jabber-chat-get-buffer "jabber-chat.el" (chat-with &optional
jc))
(declare-function jabber-muc-get-buffer "jabber-muc.el" (group &optional jc))
(declare-function jabber-muc-process-presence "jabber-muc.el" (jc presence))
-(declare-function jabber-muc-presence-p "jabber-muc.el" (presence))
(defvar jabber-chatting-with) ; jabber-chat.el
(defvar jabber-buffer-connection) ; jabber-chatbuffer.el
(defvar jabber-chat-ewoc) ; jabber-chatbuffer.el
diff --git a/lisp/jabber-vcard-avatars.el b/lisp/jabber-vcard-avatars.el
index fbe8e4928c..26b1726ac4 100644
--- a/lisp/jabber-vcard-avatars.el
+++ b/lisp/jabber-vcard-avatars.el
@@ -33,11 +33,10 @@
(require 'jabber-presence)
(require 'jabber-iq)
(require 'jabber-avatar)
+(require 'jabber-muc-protocol)
(defvar jabber-vcard-xmlns) ; jabber-vcard.el
-(declare-function jabber-muc-presence-p "jabber-muc" (xml-data))
-
(defconst jabber-vcard-update-xmlns "vcard-temp:x:update"
"XEP-0153 vCard-based avatars namespace.")
@@ -161,4 +160,4 @@ SUCCESS is non-nil when the request succeeded."
(provide 'jabber-vcard-avatars)
-;;; jabber-vcard-avatars.el ends here
\ No newline at end of file
+;;; jabber-vcard-avatars.el ends here