First connection.
authorplugd <plugd@thelambdalab.xyz>
Sat, 18 May 2024 20:39:57 +0000 (22:39 +0200)
committerplugd <plugd@thelambdalab.xyz>
Sun, 26 May 2024 19:14:04 +0000 (21:14 +0200)
murk.el

diff --git a/murk.el b/murk.el
index 6ae7519..649350a 100644 (file)
--- a/murk.el
+++ b/murk.el
@@ -44,7 +44,8 @@
   "Default quit message when none supplied.")
 
 (defcustom murk-networks
-  '(("libera" "irc.libera.chat" 6697)
+  '(("debug" "localhost" 6667 :notls)
+    ("libera" "irc.libera.chat" 6697)
     ("tilde" "tilde.chat" 6697))
   "IRC networks.")
 
@@ -133,7 +134,7 @@ This includes the process and the response string.")
                                 "\n"))
       (if (string-suffix-p "\r" line)
           (murk-eval-msg-string server (string-trim line))
-        (murk-set-connection-response line)))))
+        (murk-set-connection-response server line)))))
 
 (defun murk-make-server-sentinel (server)
   (lambda (proc string)
@@ -173,7 +174,7 @@ This includes the process and the response string.")
     (if (not (assoc server murk-networks))
         (murk-display-error "Network '" server "' is unknown.")
       (let ((proc (murk-start-process server)))
-        (add-to-list murk-connection-table
+        (add-to-list 'murk-connection-table
                      (list server proc "")))
       (murk-send-msg server (murk-msg nil nil "USER" murk-nick 0 "*" murk-nick))
       (murk-send-msg server (murk-msg nil nil "NICK" murk-nick)))))
@@ -521,6 +522,12 @@ The head of this list is always the current context.")
     ("HELP" "Display help on client commands." murk-command-help murk-help-completions))
   "Table of commands explicitly supported by murk.")
 
+(defun murk-boolean-completions ()
+  '("on" "off"))
+
+(defun murk-network-completions ()
+  (mapcar (lambda (row) (car row)) murk-networks))
+
 (defun murk-command-help (params)
   (if params
       (let* ((cmd-str (upcase (car params)))
@@ -550,6 +557,23 @@ The head of this list is always the current context.")
     (dolist (context params)
       (murk-clear-context context))))
 
+(defun murk-command-connect (params)
+  (if params
+      (let ((network (car params)))
+        (murk-display-notice nil "Attempting to connect to " network "...")
+        (murk-connect network))
+    (murk-display-notice nil "Usage: /connect <network>")))
+
+(defun murk-command-networks (params)
+  (murk-display-notice nil "Currently-known networks:")
+  (dolist (row murk-networks)
+    (seq-let (network server port &rest others) row
+      (murk-display-notice nil "\t" network
+                           " [" server
+                           " " (number-to-string port) "]")))
+  (murk-display-notice nil "(Modify the `murk-networks' variable to add more.)"))
+
+
 
 ;;; Command entering
 ;;
@@ -616,6 +640,35 @@ The head of this list is always the current context.")
         (delete-region murk-input-marker (point-max)))
       (murk-enter-string line))))
 
+(defun murk-complete-input ()
+  (interactive)
+  (let ((completion-ignore-case t))
+    (when (>= (point) murk-input-marker)
+      (pcase (buffer-substring murk-input-marker (point))
+        ((rx (: "/" (let cmd-str (+ (not whitespace))) (+ " ") (* (not whitespace)) string-end))
+         (let ((space-idx (save-excursion
+                            (re-search-backward " " murk-input-marker t)))
+               (table-row (assoc (upcase cmd-str) murk-command-table #'equal)))
+           (if (and table-row (elt table-row 3))
+               (let* ((completions-nospace (funcall (elt table-row 3)))
+                      (completions (mapcar (lambda (el) (concat el " ")) completions-nospace)))
+                 (completion-in-region (+ 1 space-idx) (point) completions)))))
+        ((rx (: "/" (* (not whitespace)) string-end))
+         (message (buffer-substring murk-input-marker (point)))
+         (completion-in-region murk-input-marker (point)
+                               (mapcar (lambda (row) (concat "/" (car row) " "))
+                                       murk-command-table)))
+        (_
+         (let* ((end (max murk-input-marker (point)))
+                (space-idx (save-excursion
+                             (re-search-backward " " murk-input-marker t)))
+                (start (if space-idx (+ 1 space-idx) murk-input-marker)))
+           (unless (string-prefix-p "/" (buffer-substring start end))
+             (let* ((users (murk-get-context-users murk-current-context))
+                    (users-no@ (mapcar
+                                (lambda (u) (car (split-string u "@" t)))
+                                users)))
+               (completion-in-region start end users-no@)))))))))
 
 ;;; Mode
 ;;