Support Scandinavian alphabets, described in RFC2812, 2.2.
[elisp/riece.git] / lisp / riece-commands.el
index f5adb10..ed5dcbd 100644 (file)
   "Select the next channel."
   (interactive)
   (when (> (length riece-current-channels) 1)
-    (let ((pointer (cdr (string-list-member-ignore-case
+    (let ((pointer (cdr (scandinavian-member-ignore-case
                         riece-current-channel
                         riece-current-channels))))
       (while (and pointer
                  (null (car pointer)))
        (setq pointer (cdr pointer)))
+      (when (null pointer)
+       (setq pointer riece-current-channels)
+       (while (and pointer
+                   (null (car pointer)))
+         (setq pointer (cdr pointer))))
       (if (car pointer)
          (riece-command-switch-to-channel (car pointer))
        (error "No such channel!")))))
   "Select the previous channel."
   (interactive)
   (when (> (length riece-current-channels) 1)
-    (let ((pointer (string-list-member-ignore-case
+    (let ((pointer (scandinavian-member-ignore-case
                    riece-current-channel
                    riece-current-channels))
          (start riece-current-channels)
          channel)
       (while (and start (not (eq start pointer)))
-       (if (car start)
-           (setq channel (car start)))
+       (setq channel (car start))
        (setq start (cdr start)))
+      (when (null channel)
+       (setq start (copy-sequence riece-current-channels))
+       (setq start (delq nil start))
+       (and (> (length start) 1)
+            (setq channel (nth (1- (length start)) start))))
       (if channel
          (riece-command-switch-to-channel channel)
        (error "No such channel!")))))
                                         (riece-identity-prefix target))))))
 
 (defun riece-command-join-partner (target)
-  (let ((pointer (riece-identity-member target riece-current-channels)))
+  (let ((pointer (riece-identity-member-safe target riece-current-channels)))
     (if pointer
        (riece-command-switch-to-channel (car pointer))
       (riece-join-channel target)
         (setq key
               (riece-read-passwd (format "Key for %s: " target))))
      (list target key)))
-  (let ((pointer (riece-identity-member target riece-current-channels)))
+  (let ((pointer (riece-identity-member-safe target riece-current-channels)))
     (if pointer
        (riece-command-switch-to-channel (car pointer))
       (if (riece-channel-p target)
              (riece-channel-p target))
         (setq message (read-string "Message: ")))
      (list target message)))
-  (if (riece-identity-member target riece-current-channels)
+  (if (riece-identity-member-safe target riece-current-channels)
       (if (riece-channel-p target)
          (riece-command-part-channel target message)
        (riece-part-channel target)
 (defun riece-command-toggle-away (&optional message)
   "Mark yourself as being away."
   (interactive
-   (if current-prefix-arg
+   (if (and (not (riece-user-get-away (riece-current-nickname)))
+           (or (null riece-away-message)
+               current-prefix-arg))
        (let ((message (read-string "Away message: ")))
         (list message))))
   (if message
   "Prevent automatic scrolling of the dialogue window.
 If prefix argument ARG is non-nil, toggle frozen status."
   (interactive "P")
-  (riece-freeze (if riece-channel-buffer-mode
-                   riece-channel-buffer
-                 riece-dialogue-buffer)
-               (if arg (prefix-numeric-value arg))))
+  (with-current-buffer (if (and riece-channel-buffer-mode
+                               riece-channel-buffer)
+                          riece-channel-buffer
+                        riece-dialogue-buffer)
+    (setq riece-freeze (if arg
+                          (< 0 (prefix-numeric-value arg))
+                        (not riece-freeze))))
+  (riece-update-status-indicators)
+  (force-mode-line-update t))
 
 (defun riece-command-toggle-own-freeze (&optional arg)
   "Prevent automatic scrolling of the dialogue window.
 The difference from `riece-command-freeze' is that your messages are hidden.
 If prefix argument ARG is non-nil, toggle frozen status."
   (interactive "P")
-  (riece-own-freeze (if riece-channel-buffer-mode
-                       riece-channel-buffer
-                     riece-dialogue-buffer)
-                   (if arg (prefix-numeric-value arg))))
+  (with-current-buffer (if (and riece-channel-buffer-mode
+                               riece-channel-buffer)
+                          riece-channel-buffer
+                        riece-dialogue-buffer)
+    (if (if arg
+           (< 0 (prefix-numeric-value arg))
+         (not (eq riece-freeze 'own)))
+       (setq riece-freeze 'own)
+      (setq riece-freeze nil)))
+  (riece-update-status-indicators)
+  (force-mode-line-update t))
 
 (defun riece-command-quit (&optional arg)
   "Quit IRC."
@@ -556,9 +579,11 @@ If prefix argument ARG is non-nil, toggle frozen status."
 (defun riece-command-open-server (server-name)
   (interactive
    (list (completing-read "Server: " riece-server-alist)))
-  (riece-open-server
-   (riece-server-name-to-server server-name)
-   server-name))
+  (if (assoc server-name riece-server-process-alist)
+      (error "%s is already opened" server-name)
+    (riece-open-server
+     (riece-server-name-to-server server-name)
+     server-name)))
 
 (defun riece-command-close-server (server-name &optional message)
   (interactive