;;; +finger.el --- Finger bugfix -*- lexical-binding: t; -*-

;;; Commentary:

;; `net-utils' defines `finger', which purportedly consults
;; `finger-X.500-host-regexps' to determine what hosts to only send a username
;; to.  I've found that that is not the case, and so I've patched it.  At some
;; point I'll submit this to Emacs itself.

;;; Code:

(require 'net-utils)                    ; this requires everything else I'll need.
(require 'seq)

(defun finger (user host)
  "Finger USER on HOST.
This command uses `finger-X.500-host-regexps'
and `network-connection-service-alist', which see."
  ;; One of those great interactive statements that's actually
  ;; longer than the function call! The idea is that if the user
  ;; uses a string like "pbreton@cs.umb.edu", we won't ask for the
  ;; host name. If we don't see an "@", we'll prompt for the host.
  (interactive
   (let* ((answer (read-from-minibuffer "Finger User: "
                                        (net-utils-url-at-point)))
          (index  (string-match (regexp-quote "@") answer)))
     (if index
         (list (substring answer 0 index)
               (substring answer (1+ index)))
       (list answer
             (read-from-minibuffer "At Host: "
                                   (net-utils-machine-at-point))))))
  (let* ((user-and-host (concat user "@" host))
         (process-name (concat "Finger [" user-and-host "]"))
         (regexps finger-X.500-host-regexps)
         ) ;; found
    (when (seq-some (lambda (r) (string-match-p r host)) regexps)
      (setq user-and-host user))
    (run-network-program
     process-name
     host
     (cdr (assoc 'finger network-connection-service-alist))
     user-and-host)))

(provide '+finger)
;;; +finger.el ends here
