Function: rcirc-sentinel

rcirc-sentinel is a byte-compiled function defined in rcirc.el.gz.

Signature

(rcirc-sentinel PROCESS SENTINEL)

Documentation

Called on a change of the state of PROCESS.

SENTINEL describes the change in form of a string.

Source Code

;; Defined in /usr/src/emacs/lisp/net/rcirc.el.gz
(defun rcirc-sentinel (process sentinel)
  "Called on a change of the state of PROCESS.
SENTINEL describes the change in form of a string."
  (let ((status (process-status process)))
    (rcirc-debug process (format "SENTINEL: %S %S\n" process sentinel))
    (with-rcirc-process-buffer process
      (cond
       ((eq status 'open)
        (let* ((server (nth 0 rcirc-connection-info))
               (user-name (nth 3 rcirc-connection-info))
               (full-name (nth 4 rcirc-connection-info))
               (password (nth 6 rcirc-connection-info))
               (server-alias (nth 8 rcirc-connection-info))
               (use-sasl (eq (rcirc-get-server-method server) 'sasl)))

          ;; Prepare SASL authentication
          (when use-sasl
            (rcirc-send-string process "CAP REQ sasl")
            (setq-local rcirc-finished-sasl nil))

          ;; Capability negotiation
          (dolist (cap rcirc-implemented-capabilities)
            (rcirc-send-string process "CAP" "REQ" : cap)
            (push cap rcirc-requested-capabilities))

          ;; Identify user
          (unless (zerop (length password))
            (rcirc-send-string process "PASS" password))
          (rcirc-send-string process "NICK" rcirc-nick)
          (rcirc-send-string process "USER" user-name "0" "*" : full-name)

          ;; Setup sasl, and initiate authentication.
          (when (and rcirc-auto-authenticate-flag
                     use-sasl)
            (rcirc-send-string process "AUTHENTICATE" "PLAIN"))

          ;; Setup ping timer if necessary
          (unless rcirc-keepalive-timer
            (setq rcirc-keepalive-timer
                  (run-at-time 0 (/ rcirc-timeout-seconds 2) #'rcirc-keepalive)))

          ;; Reset previous reconnection attempts
          (setq rcirc-failed-attempts 0)
          (when rcirc-reconnection-timer
            (cancel-timer rcirc-reconnection-timer)
            (setq rcirc-reconnection-timer nil))

          (message "Connecting to %s...done" (or server-alias server))
          (dolist (buffer (cons nil (mapcar 'cdr rcirc-buffer-alist)))
            (with-current-buffer (or buffer (current-buffer))
              (setq mode-line-process nil)))))
       ((eq status 'closed)
        (let ((now (current-time)))
          (with-rcirc-process-buffer process
            (when (and (< 0 rcirc-reconnect-delay)
                       (time-less-p rcirc-reconnect-delay
                                    (time-subtract now rcirc-last-connect-time)))
              (setq rcirc-last-connect-time now)
              (rcirc-reconnect process)))))
       ((eq status 'failed)
        (dolist (buffer (cons nil (mapcar 'cdr rcirc-buffer-alist)))
          (with-current-buffer (or buffer (current-buffer))
            (rcirc-print process "*rcirc*" "ERROR" rcirc-target
                         (format "%s: %s (%S)"
                                 (process-name process)
                                 sentinel
                                 (process-status process))
                         (not rcirc-target))
            (rcirc-disconnect-buffer)))))
      (run-hook-with-args 'rcirc-sentinel-functions process sentinel))))