Added /nick, /topic and /list
authorplugd <plugd@thelambdalab.xyz>
Mon, 20 May 2024 10:49:21 +0000 (12:49 +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 2e89982..9ca5e2a 100644 (file)
--- a/murk.el
+++ b/murk.el
@@ -50,7 +50,7 @@
   :type '(string))
 
 (defcustom murk-networks
-  '(("debug" "localhost" 6667 :notls)
+  '(("debug" "localhost" 6697)
     ("libera" "irc.libera.chat" 6697)
     ("tilde" "tilde.chat" 6697)
     ("freenode" "chat.freenode.net" 6697))
@@ -367,6 +367,18 @@ The head of this list is always the current context.")
    ctx
    (delete user (murk-context-users ctx))))
 
+(defun murk-del-server-user (server user)
+  (dolist (ctx murk-contexts)
+    (if (equal (murk-context-server ctx) server)
+        (murk-del-context-user ctx user))))
+
+(defun murk-rename-server-user (server old-nick new-nick)
+  (dolist (ctx murk-contexts)
+    (when (and (equal (murk-context-server ctx) server)
+               (member old-nick (murk-context-users ctx)))
+      (murk-del-context-user ctx old-nick)
+      (murk-add-context-users ctx (list new-nick)))))
+
 ;;; Buffer
 ;;
 
@@ -612,7 +624,7 @@ The head of this list is always the current context.")
 
       ("PONG")
 
-      ("001"
+      ("001" ; RPL_WELCOME
        (let* ((params (murk-msg-params msg))
               (nick (elt params 0))
               (text (string-join (seq-drop params 1) " ")))
@@ -640,13 +652,13 @@ The head of this list is always the current context.")
               " users in " channel)
            (murk-display-notice nil "End of " channel " names list."))))
 
-      ("331"
+      ("331" ; RPL_NOTOPIC
        (let* ((params (murk-msg-params msg))
               (channel (elt params 1))
               (ctx (murk-get-context server channel)))
          (murk-display-notice ctx "No topic set.")))
 
-      ("332"
+      ("332" ; RPL_TOPIC
        (let* ((params (murk-msg-params msg))
               (channel (elt params 1))
               (topic (elt params 2))
@@ -683,18 +695,39 @@ The head of this list is always the current context.")
          (murk-render-prompt)))
 
       ("PART"
-       (let* ((channel (car (lurk-msg-params msg)))
-              (nick (lurk-msg-src msg))
+       (let* ((channel (car (murk-msg-params msg)))
+              (nick (murk-msg-src msg))
               (ctx (murk-get-context server channel)))
          (murk-del-context-user ctx nick)
          (if murk-show-joins
              (murk-display-notice ctx nick " left channel " channel
                                   " on " server))))
 
+      ((and "NICK"
+            (guard (equal (murk-connection-nick server)
+                          (murk-msg-src msg))))
+       (let ((new-nick (car (murk-msg-params msg))))
+         (murk-set-connection-nick server new-nick)
+         (murk-display-notice nil "Nick set to " new-nick " on " server)))
+
+      ("NICK"
+       (let ((old-nick (murk-msg-src msg))
+             (new-nick (car (murk-msg-params msg))))
+         (murk-display-notice nil old-nick " is now known as " new-nick
+                              " on " server)
+         (murk-rename-server-user server old-nick new-nick)))
+
+      ("TOPIC"
+       (let ((channel (car (murk-msg-params msg)))
+             (nick (murk-msg-src msg))
+             (topic (cadr (murk-msg-params msg))))
+         (murk-display-notice (murk-get-context server channel)
+                              nick " set the topic: " topic)))
+
       ("QUIT"
        (let ((nick (murk-msg-src msg))
              (reason (mapconcat 'identity (murk-msg-params msg) " ")))
-         (murk-del-user nick)
+         (murk-del-server-user server nick)
          (if murk-show-joins
              (murk-display-notice nil nick " quit: " reason))))
 
@@ -748,6 +781,9 @@ The head of this list is always the current context.")
     ("JOIN" "Join one or more channels." murk-command-join)
     ("PART" "Leave channel." murk-command-part murk-context-completions)
     ("NICK" "Change nick." murk-command-nick)
+    ("LIST" "Display details of one or more channels." murk-command-list)
+    ("TOPIC" "Set/query topic for current channel." murk-command-topic)
+    ("USERS" "List nicks of users in current context." murk-command-users)
     ("MSG" "Send private message to user." murk-command-msg murk-nick-completions)
     ("CLEAR" "Clear buffer text." murk-command-clear murk-context-completions)
     ("HELP" "Display help on client commands." murk-command-help murk-help-completions))
@@ -803,12 +839,6 @@ The head of this list is always the current context.")
   (murk-display-notice nil "Joins/parts will now be "
                        (if murk-show-joins "shown" "hidden") "."))
 
-(defun murk-command-clear (params)
-  (if (not params)
-      (murk-clear-buffer)
-    (dolist (context params)
-      (murk-clear-context context))))
-
 (defun murk-command-connect (params)
   (if params
       (let ((network (car params)))
@@ -850,6 +880,41 @@ The head of this list is always the current context.")
         (murk-send-msg server (murk-msg nil nil "PART" channel))
       (murk-display-error "No current channel to leave"))))
 
+(defun murk-command-nick (params)
+  (if params
+      (let ((new-nick (string-join params " "))
+            (ctx (murk-current-context)))
+        (if ctx
+            (murk-send-msg (murk-context-server ctx)
+                           (murk-msg nil nil "NICK" new-nick))
+          (murk-display-error "No current connection")))
+    (murk-display-notice nil "Usage: /nick <new-nick>")))
+
+(defun murk-command-list (params)
+  (let ((ctx (murk-current-context)))
+    (if ctx
+        (if (not params)
+            (murk-display-notice nil "This command can generate lots of output. Use `/LIST -yes' if you really want this, or `/LIST <channel_regexp>' to reduce the output.")
+          (let ((server (murk-context-server ctx)))
+            (if (equal (upcase (car params)) "-YES")
+                (murk-send-msg server (murk-msg nil nil "LIST"))
+              (murk-send-msg server (murk-msg nil nil "LIST"
+                                              (car params))))))
+      (murk-display-error "No current connection"))))
+
+(defun murk-command-topic (params)
+  (let ((ctx (murk-current-context)))
+    (if (and ctx (not (murk-server-context-p ctx)))
+        (let ((server (murk-context-server ctx))
+              (channel (murk-context-channel ctx)))
+          (if params
+              (murk-send-msg server
+                             (murk-msg nil nil "TOPIC" channel
+                                       (string-join params " ")))
+            (murk-send-msg server
+                           (murk-msg nil nil "TOPIC" channel))))
+      (murk-display-notice nil "No current channel."))))
+
 (defun murk-command-msg (params)
   (let ((server (murk-context-server (murk-current-context))))
     (if (and params (>= (length params) 2))
@@ -861,6 +926,17 @@ The head of this list is always the current context.")
                                 to text))
       (murk-display-notice nil "Usage: /msg <nick> <message>"))))
 
+(defun murk-command-users (_params)
+  (let ((ctx (murk-current-context)))
+    (if (and ctx (not (murk-server-context-p ctx)))
+        (let ((channel (murk-context-channel ctx))
+              (server (murk-context-server ctx))
+              (users (murk-context-users ctx)))
+          (murk-display-notice ctx "Users in " channel " on " server ":")
+          (murk-display-notice ctx (string-join users " ")))
+      (murk-display-notice nil "No current channel."))))
+
+
 ;;; Command entering
 ;;