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

Reply via email to