Update .gitignore
[riece] / lisp / riece-commands.el
index 8efa507..aab2b7b 100644 (file)
@@ -1,4 +1,4 @@
-;;; riece-commands.el --- commands available in command buffer
+;;; riece-commands.el --- commands available in command buffer -*- lexical-binding: t -*-
 ;; Copyright (C) 1998-2003 Daiki Ueno
 
 ;; Author: Daiki Ueno <ueno@unixuser.org>
@@ -34,8 +34,6 @@
 (require 'riece-message)
 (require 'riece-mcat)
 
-(autoload 'derived-mode-class "derived")
-
 ;;; Channel movement:
 (defun riece-command-switch-to-channel (channel)
   (interactive (list (riece-completing-read-identity
          (riece-command-switch-to-channel channel)
        (error "No such channel!")))))
 
+(defun riece-command-reorder-channels ()
+  "Reorder channel list."
+  (interactive)
+  (let ((binding (mapcar
+                 (lambda (channel)
+                   (if channel
+                       (riece-parse-identity channel)))
+                 riece-default-channel-binding))
+       (pointer riece-current-channels)
+       channels)
+    (while pointer
+      (if (car pointer)
+         (setq channels (riece-identity-assign-binding (car pointer) channels
+                                                       binding)))
+      (setq pointer (cdr pointer)))
+    (setq riece-current-channels channels)
+    (riece-emit-signal 'channel-list-changed)))
+
 (defun riece-command-select-command-buffer ()
   "Select the command buffer."
   (interactive)
@@ -234,6 +250,37 @@ the layout to the selected layout-name."
             user))
    riece-current-channel))
 
+(defun riece-command-kick-with-ban (user pattern &optional message)
+  (interactive
+   (let ((completion-ignore-case t)
+        user)
+     (riece-check-channel-commands-are-usable t)
+     (riece-with-server-buffer (riece-identity-server riece-current-channel)
+       (setq user (completing-read
+                  (riece-mcat "Kick user: ")
+                  (riece-channel-get-users (riece-identity-prefix
+                                            riece-current-channel))))
+       (list
+       user
+       (read-from-minibuffer
+        (riece-mcat "Ban pattern: ")
+        (concat user "!" (riece-user-get-user-at-host user)))
+       (if current-prefix-arg
+           (read-string "Message: "))))))
+  (riece-send-string (format "MODE %s :+b %s\r\n"
+                            (riece-identity-prefix riece-current-channel)
+                            pattern)
+                    riece-current-channel)
+  (riece-send-string
+   (if message
+       (format "KICK %s %s :%s\r\n"
+              (riece-identity-prefix riece-current-channel)
+              user message)
+     (format "KICK %s %s\r\n"
+            (riece-identity-prefix riece-current-channel)
+            user))
+   riece-current-channel))
+
 (defun riece-command-names (pattern)
   (interactive
    (let ((completion-ignore-case t))
@@ -279,6 +326,8 @@ the layout to the selected layout-name."
                        "Really want to query LIST without argument? ")))
       (riece-send-string (format "LIST %s\r\n" pattern))))
 
+(defvar riece-temp-minibuffer-message)
+(defvar riece-overriding-server-name)
 (defun riece-command-change-mode (channel change)
   (interactive
    (let* ((completion-ignore-case t)
@@ -312,7 +361,7 @@ the layout to the selected layout-name."
                               (riece-identity-prefix channel)
                               change))))
 
-(defun riece-command-set-operators (users &optional arg)
+(defun riece-command-set-operators (users &optional _arg)
   (interactive
    (progn
      (riece-check-channel-commands-are-usable t)
@@ -347,7 +396,7 @@ the layout to the selected layout-name."
                 (mapconcat #'identity (nreverse group) " ")))
        (setq group nil)))))
 
-(defun riece-command-set-speakers (users &optional arg)
+(defun riece-command-set-speakers (users &optional _arg)
   (interactive
    (progn
      (riece-check-channel-commands-are-usable t)
@@ -414,8 +463,10 @@ the layout to the selected layout-name."
                               (riece-line-beginning-position)
                               (riece-line-end-position))
                              nil)
-  (let ((next-line-add-newlines t))
-    (next-line 1)))
+  (forward-line 1)
+  (when (eobp)
+    (insert "\n")))
+
 
 (defun riece-command-enter-message-as-notice ()
   "Send the current line to the current channel as NOTICE."
@@ -424,8 +475,9 @@ the layout to the selected layout-name."
                               (riece-line-beginning-position)
                               (riece-line-end-position))
                              t)
-  (let ((next-line-add-newlines t))
-    (next-line 1)))
+  (forward-line 1)
+  (when (eobp)
+    (insert "\n")))
 
 (defun riece-command-enter-message-to-user (user)
   "Send the current line to USER."
@@ -445,8 +497,9 @@ the layout to the selected layout-name."
      user)
     (riece-display-message
      (riece-make-message (riece-current-nickname) user text nil t)))
-  (let ((next-line-add-newlines t))
-    (next-line 1)))
+  (forward-line 1)
+  (when (eobp)
+    (insert "\n")))
 
 (defun riece-command-join-channel (target key)
   (unless (riece-server-opened (riece-identity-server target))
@@ -467,26 +520,35 @@ the layout to the selected layout-name."
       (riece-join-channel target)
       (riece-switch-to-channel target))))
 
-(defun riece-command-join (target)
+(defun riece-command-join (targets)
   (interactive
-   (let ((completion-ignore-case t))
+   (let ((completion-ignore-case t)
+        (candidates (mapcar (lambda (channel)
+                              (list (riece-format-identity channel)))
+                            (delq nil (riece-get-identities-on-server
+                                       (riece-current-server-name)))))
+        (default (if riece-join-channel-candidate
+                     (riece-format-identity
+                      riece-join-channel-candidate))))
      (list
-      (if riece-join-channel-candidate
-         (let ((default (riece-format-identity
-                         riece-join-channel-candidate)))
-           (riece-completing-read-identity
-            (format (riece-mcat "Join channel/user (default %s): ") default)
-            (riece-get-identities-on-server (riece-current-server-name))
-            nil nil nil nil default))
-       (riece-completing-read-identity
-        (riece-mcat "Join channel/user: ")
-        (riece-get-identities-on-server (riece-current-server-name)))))))
-  (let ((pointer (riece-identity-member target riece-current-channels)))
-    (if pointer
+      (mapcar #'riece-parse-identity
+             (riece-completing-read-multiple
+              (if default
+                  (format (riece-mcat "Join channel/user (default %s)")
+                          default)
+                (riece-mcat "Join channel/user"))
+              candidates nil nil nil nil default)))))
+  (let (pointer)
+    (if (and (= (length targets) 1)
+            (setq pointer (riece-identity-member (car targets)
+                                                 riece-current-channels)))
        (riece-command-switch-to-channel (car pointer))
-      (if (riece-channel-p (riece-identity-prefix target))
-         (riece-command-join-channel target nil)
-       (riece-command-join-partner target)))))
+      (setq pointer targets)
+      (while pointer
+       (if (riece-channel-p (riece-identity-prefix (car pointer)))
+           (riece-command-join-channel (car pointer) nil)
+         (riece-command-join-partner (car pointer)))
+       (setq pointer (cdr pointer))))))
 
 (defun riece-command-part-channel (target message)
   (unless (riece-server-opened (riece-identity-server target))
@@ -598,8 +660,7 @@ the layout to the selected layout-name."
   "Prevent automatic scrolling of the dialogue window.
 If prefix argument ARG is non-nil, toggle frozen status."
   (interactive "P")
-  (with-current-buffer (if (eq (derived-mode-class major-mode)
-                              'riece-dialogue-mode)
+  (with-current-buffer (if (riece-derived-mode-p 'riece-dialogue-mode)
                           (current-buffer)
                         (if (and riece-channel-buffer-mode
                                  riece-channel-buffer)
@@ -616,8 +677,7 @@ If prefix argument ARG is non-nil, toggle frozen status."
 The difference from `riece-command-freeze' is that your messages are hidden.
 If prefix argument ARG is non-nil, toggle frozen status."
   (interactive "P")
-  (with-current-buffer (if (eq (derived-mode-class major-mode)
-                              'riece-dialogue-mode)
+  (with-current-buffer (if (riece-derived-mode-p 'riece-dialogue-mode)
                           (current-buffer)
                         (if (and riece-channel-buffer-mode
                                  riece-channel-buffer)
@@ -718,7 +778,9 @@ If prefix argument ARG is non-nil, toggle frozen status."
   (if (riece-server-process server-name)
       (error "%s is already opened" server-name))
   (riece-open-server
-   (riece-server-name-to-server server-name)
+   (riece-server-name-to-server (if (equal server-name "")
+                                   riece-server
+                                 server-name))
    server-name))
 
 (defun riece-command-close-server (server-name &optional message)