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

erc-server-NOTICE

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))))