Function: erc-server-PRIVMSG
erc-server-PRIVMSG is a byte-compiled function defined in
erc-backend.el.gz.
Signature
(erc-server-PRIVMSG PROC PARSED)
Documentation
Handle private messages, including messages in channels.
Handler for a PRIVMSG server response.
PROC is the server process which returned the response.
PARSED is the actual response as an erc-response struct.
If you want to add responses don't modify this function, but rather
add things to erc-server-PRIVMSG-functions instead.
Aliases
Source Code
;; Defined in /usr/src/emacs/lisp/erc/erc-backend.el.gz
(define-erc-response-handler (PRIVMSG NOTICE)
"Handle private messages, including messages in channels." nil
(let ((sender-spec (erc-response.sender parsed))
(cmd (erc-response.command parsed))
(tgt (car (erc-response.command-args parsed)))
(msg (erc-response.contents parsed)))
(defvar erc-minibuffer-ignored)
(defvar erc-ignore-list)
(defvar erc-ignore-reply-list)
(if (or (and erc-ignore-list (erc-ignored-user-p sender-spec))
(and erc-ignore-reply-list (erc-ignored-reply-p msg tgt proc)))
(when erc-minibuffer-ignored
(message "Ignored %s from %s to %s" cmd sender-spec tgt))
(let* ((sndr (erc-parse-user sender-spec))
(nick (nth 0 sndr))
(login (nth 1 sndr))
(host (nth 2 sndr))
(msgp (string= cmd "PRIVMSG"))
(noticep (string= cmd "NOTICE"))
;; S.B. downcase *both* tgt and current nick
(medown (erc-downcase (erc-current-nick)))
(inputp (string= medown (erc-downcase nick)))
(privp (string= (erc-downcase tgt) medown))
(erc--display-context `((erc-buffer-display . ,(intern cmd))
,@erc--display-context))
(erc--msg-prop-overrides `((erc--tmp) ,@erc--msg-prop-overrides))
(erc--speaker-status-prefix-wanted-p nil)
(erc-current-message-catalog erc--message-speaker-catalog)
;;
finalize buffer statusmsg cmem-prefix fnick)
(setq buffer (erc-get-buffer (if privp nick tgt) proc))
;; Even worth checking for empty target here? (invalid anyway)
(unless (or buffer noticep (string-empty-p tgt) (eq ?$ (aref tgt 0))
(erc-is-message-ctcp-and-not-action-p msg))
(defvar erc-receive-query-display)
(defvar erc-receive-query-display-defer)
(if privp
(when-let* ((erc-join-buffer
(or (and (not erc-receive-query-display-defer)
erc-receive-query-display)
(and erc-ensure-target-buffer-on-privmsg
(or erc-receive-query-display
erc-join-buffer)))))
(push `(erc-receive-query-display . ,(intern cmd))
erc--display-context)
(setq buffer (erc--open-target nick)))
(cond
;; Target is a channel and contains leading @+ chars.
((and-let* ((trimmed(erc--statusmsg-target tgt)))
(setq buffer (erc-get-buffer trimmed proc)
statusmsg (and buffer (substring tgt 0 1)))))
;; A channel buffer has been killed but is still joined.
(erc-ensure-target-buffer-on-privmsg
(setq buffer (erc--open-target tgt))))))
(when buffer
(with-current-buffer buffer
(when privp
(erc--unhide-prompt)
;; Remove untracked query partners after display.
(defvar erc--decouple-query-and-channel-membership-p)
(unless (or erc--decouple-query-and-channel-membership-p
(erc--get-server-user nick))
(setq finalize (lambda ()
(erc-remove-channel-member buffer nick)))))
(erc-update-channel-member (if privp nick tgt) nick nick
privp nil nil nil nil nil host login nil nil t)
(defvar erc--cmem-from-nick-function)
(defvar erc-format-nick-function)
(defvar erc-show-speaker-membership-status)
(defvar erc-speaker-from-channel-member-function)
(let ((cdata (funcall erc--cmem-from-nick-function
(erc-downcase nick) sndr parsed)))
(setq fnick (funcall erc-speaker-from-channel-member-function
(car cdata) (cdr cdata))
cmem-prefix (and (or erc--speaker-status-prefix-wanted-p
erc-show-speaker-membership-status
inputp)
(cdr cdata))))))
(if (erc-is-message-ctcp-p msg)
(if noticep
(erc-process-ctcp-reply proc parsed nick login host
(match-string 1 msg))
(setq parsed (erc--ctcp-response-from-parsed
:parsed parsed :buffer buffer :statusmsg statusmsg
:prefix cmem-prefix :dispname fnick))
(erc-process-ctcp-query proc parsed nick login host))
(setq erc-server-last-peers (cons nick (cdr erc-server-last-peers)))
(with-current-buffer (or buffer (current-buffer))
;; Re-bind in case either buffer has a local value.
(let ((erc-current-message-catalog erc--message-speaker-catalog)
(msg-args (erc--determine-speaker-message-format-args
nick msg privp msgp inputp statusmsg
cmem-prefix fnick)))
(if (or msgp (not privp))
;; This is a PRIVMSG or a NOTICE to a channel.
(apply #'erc-display-message parsed nil buffer msg-args)
;; This is a NOTICE directed at the client's current nick.
(push (cons 'erc--msg (car msg-args)) erc--msg-prop-overrides)
(let ((fmtmsg (apply #'erc-format-message msg-args)))
(run-hook-with-args 'erc-echo-notice-always-hook
fmtmsg parsed buffer nick)
(run-hook-with-args-until-success
'erc-echo-notice-hook fmtmsg parsed buffer nick)))))
(when finalize (funcall finalize)))
nil))))