+2004-02-27 Daiki Ueno <ueno@unixuser.org>
+
+ * riece.el (riece): Setup signal slots.
+
+ * riece-unread.el (riece-unread-after-display-message-function):
+ Don't call riece-redisplay-buffers.
+
+ * riece-naming.el (riece-naming-assert-names): New function.
+ (riece-naming-assert-join): Emit 'join signal.
+ (riece-naming-assert-part): Emit 'part signal.
+ (riece-naming-assert-rename): Emit 'rename signal.
+
+ * riece-message.el (riece-message-buffer): Don't call
+ riece-redisplay-buffers.
+
+ * riece-handle.el (riece-handle-nick-message): Don't call
+ riece-redisplay-buffers.
+ (riece-handle-join-message): Ditto.
+ (riece-handle-part-message): Ditto.
+ (riece-handle-kick-message): Ditto.
+ (riece-handle-kill-message): Ditto.
+ (riece-handle-topic-message): Ditto.
+ (riece-parse-channel-modes): Ditto.
+
+ * riece-display.el (riece-update-user-list-buffer): Use
+ riece-with-server-buffer.
+ (riece-emit-signal): Notify if signal filter fails.
+ (riece-display-connect-signals): New function.
+ (riece-update-user-list-buffer): Don't switch to user-list buffer.
+ (riece-update-channel-list-buffer): Don't switch to channel-list
+ buffer.
+ (riece-switch-to-channel): Emit 'switch-to-channel signal.
+ (riece-switch-to-nearest-channel): Ditto.
+
+ * riece-commands.el (riece-command-switch-to-channel): Don't call
+ riece-redisplay-buffers.
+ (riece-command-join-partner): Ditto.
+ (riece-command-part): Ditto.
+
+ * riece-300.el (riece-handle-353-message): Save match data before
+ calling riece-naming-assert-names; don't call riece-redisplay-buffers.
+ (riece-handle-322-message): Don't call riece-redisplay-buffers.
+
2004-02-26 Daiki Ueno <ueno@unixuser.org>
* riece-display.el: Introduce Qt like "signal-slot" abstraction
"RPL_NAMREPLY \"<channel> :[[@|+]<nick> [[@|+]<nick> [...]]]\"."
(if (string-match "^[=\*@] *\\([^ ]+\\) +:" string)
(let ((channel (match-string 1 string))
- (start 0))
+ (start 0)
+ user users)
(setq string (substring string (match-end 0)))
(while (string-match
(concat "\\([@+]\\)?\\(" riece-user-regexp "\\) *")
(riece-make-identity (match-string 2 string)
riece-server-name)
string)
- (setq start (match-end 0))
- (if (match-beginning 1)
- (if (eq (aref string (match-beginning 1)) ?@)
- (progn
- (riece-naming-assert-join
- (match-string 2 string) channel)
- (riece-channel-toggle-operator
- channel (match-string 2 string) t))
- (if (eq (aref string (match-beginning 1)) ?+)
- (progn
- (riece-naming-assert-join
- (match-string 2 string) channel)
- (riece-channel-toggle-speaker
- channel (match-string 2 string) t))))
- (riece-naming-assert-join (match-string 2 string) channel)))
+ (setq start (match-end 0)
+ user (if (match-beginning 1)
+ (if (eq (aref string (match-beginning 1)) ?@)
+ (list (match-string 2 string) ?o)
+ (if (eq (aref string (match-beginning 1)) ?+)
+ (list (match-string 2 string) ?v)))
+ (list (match-string 2 string)))
+ users (cons user users)))
+ (riece-naming-assert-names (nreverse users) channel)
(let* ((channel-identity (riece-make-identity channel
riece-server-name))
(buffer (riece-channel-buffer channel-identity)))
(riece-concat-server-name
(format "Users on %s: %s"
(riece-format-identity channel-identity t) string))
- "\n")))
- (riece-redisplay-buffers))))
+ "\n"))))))
(defun riece-handle-322-message (prefix number name string)
(if (string-match "^\\([^ ]+\\) \\([0-9]+\\) :" string)
t)
" "
info)))
- "\n"))
- (riece-redisplay-buffers))))
+ "\n")))))
(defun riece-handle-315-message (prefix number name string))
(defun riece-handle-318-message (prefix number name string))
(interactive (list (riece-completing-read-identity
"Channel/User: " riece-current-channels nil t)))
(unless (equal channel riece-current-channel)
- (riece-switch-to-channel channel)
- (riece-redisplay-buffers)))
+ (riece-switch-to-channel channel)))
(defun riece-command-switch-to-channel-by-number (number)
(interactive
(if pointer
(riece-command-switch-to-channel (car pointer))
(riece-join-channel target)
- (riece-switch-to-channel target)
- (riece-redisplay-buffers))))
+ (riece-switch-to-channel target))))
(defun riece-command-join (target &optional key)
(interactive
(if (riece-identity-member target riece-current-channels)
(if (riece-channel-p (riece-identity-prefix target))
(riece-command-part-channel target message)
- (riece-part-channel target)
- (riece-redisplay-buffers))
+ (riece-part-channel target))
(error "You are not talking with %s" target)))
(defun riece-command-change-nickname (nickname)
(while slots
(condition-case error
(if (or (null (riece-slot-filter (car slots)))
- (funcall (riece-slot-filter (car slots)) signal))
+ (condition-case error
+ (funcall (riece-slot-filter (car slots)) signal)
+ (if riece-debug
+ (message
+ "Error occurred in signal filter for \"%S\": %S"
+ (riece-signal-name signal) error))
+ nil))
(funcall (riece-slot-function (car slots))
signal (riece-slot-handback (car slots))))
(error
(if riece-debug
- (message "Error occurred in slot function for signal \"%S\": %S"
+ (message "Error occurred in slot function for \"%S\": %S"
(riece-signal-name signal) error))))
(setq slots (cdr slots))))))
+(defun riece-display-connect-signals ()
+ (riece-connect-signal
+ 'switch-to-channel
+ (riece-make-slot
+ (lambda (signal handback)
+ (riece-update-status-indicators)
+ (riece-update-channel-indicator)
+ (riece-update-long-channel-indicator)
+ (save-excursion
+ (set-buffer riece-user-list-buffer)
+ (run-hooks 'riece-update-buffer-functions))
+ (save-excursion
+ (set-buffer riece-channel-list-buffer)
+ (run-hooks 'riece-update-buffer-functions))
+ (save-excursion
+ (riece-redraw-layout)))))
+ (riece-connect-signal
+ 'names
+ (riece-make-slot
+ (lambda (signal handback)
+ (save-excursion
+ (set-buffer riece-user-list-buffer)
+ (run-hooks 'riece-update-buffer-functions)))))
+ (riece-connect-signal
+ 'join
+ (riece-make-slot
+ (lambda (signal handback)
+ (save-excursion
+ (set-buffer riece-user-list-buffer)
+ (run-hooks 'riece-update-buffer-functions)))
+ (lambda (signal)
+ (and (riece-identity-equal (nth 1 (riece-signal-args signal))
+ riece-current-channel)
+ (not (riece-identity-equal (car (riece-signal-args signal))
+ (riece-current-nickname)))))))
+ (riece-connect-signal
+ 'part
+ (riece-make-slot
+ (lambda (signal handback)
+ (save-excursion
+ (set-buffer riece-user-list-buffer)
+ (run-hooks 'riece-update-buffer-functions)))
+ (lambda (signal)
+ (and (riece-identity-equal (nth 1 (riece-signal-args signal))
+ riece-current-channel)
+ (not (riece-identity-equal (car (riece-signal-args signal))
+ (riece-current-nickname)))))))
+ (riece-connect-signal
+ 'rename
+ (riece-make-slot
+ (lambda (signal handback)
+ (save-excursion
+ (set-buffer riece-user-list-buffer)
+ (run-hooks 'riece-update-buffer-functions)))
+ (lambda (signal)
+ (and (equal (riece-identity-server (nth 1 (riece-signal-args signal)))
+ (riece-identity-server riece-current-channel))
+ (riece-with-server-buffer (riece-identity-server
+ riece-current-channel)
+ (riece-identity-assoc
+ (riece-identity-prefix (nth 1 (riece-signal-args signal)))
+ (riece-channel-get-users (riece-identity-prefix
+ riece-current-channel))
+ t))))))
+ (riece-connect-signal
+ 'rename
+ (riece-make-slot
+ (lambda (signal handback)
+ (riece-update-status-indicators)
+ (riece-update-channel-indicator))
+ (lambda (signal)
+ (riece-identity-equal (nth 1 (riece-signal-args signal))
+ (riece-current-nickname))))))
+
(defun riece-update-user-list-buffer ()
(save-excursion
- (set-buffer riece-user-list-buffer)
(if (and riece-current-channel
(riece-channel-p (riece-identity-prefix riece-current-channel)))
(let* ((users
- (with-current-buffer (process-buffer (riece-server-process
- (riece-identity-server
- riece-current-channel)))
+ (riece-with-server-buffer (riece-identity-server
+ riece-current-channel)
(riece-channel-get-users (riece-identity-prefix
riece-current-channel))))
(inhibit-read-only t)
(defun riece-update-channel-list-buffer ()
(save-excursion
- (set-buffer riece-channel-list-buffer)
(let ((inhibit-read-only t)
buffer-read-only
(index 1)
(let ((last riece-current-channel))
(setq riece-current-channel identity
riece-channel-buffer (riece-channel-buffer riece-current-channel))
- (run-hook-with-args 'riece-after-switch-to-channel-functions last)))
+ (run-hook-with-args 'riece-after-switch-to-channel-functions last)
+ (riece-emit-signal (riece-make-signal 'switch-to-channel))))
(defun riece-join-channel (identity)
(unless (riece-identity-member identity riece-current-channels)
(riece-switch-to-channel identity)
(let ((last riece-current-channel))
(run-hook-with-args 'riece-after-switch-to-channel-functions last)
- (setq riece-current-channel nil)))))
+ (setq riece-current-channel nil)
+ (riece-emit-signal (riece-make-signal 'switch-to-channel))))))
(defun riece-part-channel (identity)
(let ((pointer (riece-identity-member identity riece-current-channels)))
(format "%s -> %s"
(riece-format-identity old-identity t)
(riece-format-identity new-identity t)))
- "\n"))
- (riece-redisplay-buffers)))
+ "\n"))))
(defun riece-handle-privmsg-message (prefix string)
(let* ((user (riece-prefix-nickname prefix))
(riece-user-get-user-at-host user)
(riece-format-identity channel-identity t)))
"\n")))
- (setq channels (cdr channels)))
- (riece-redisplay-buffers)))
+ (setq channels (cdr channels)))))
(defun riece-handle-part-message (prefix string)
(let* ((user (riece-prefix-nickname prefix))
(riece-format-identity channel-identity t))
message))
"\n")))
- (setq channels (cdr channels)))
- (riece-redisplay-buffers)))
+ (setq channels (cdr channels)))))
(defun riece-handle-kick-message (prefix string)
(let* ((kicker (riece-prefix-nickname prefix))
(riece-format-identity user-identity t)
(riece-format-identity channel-identity t))
message))
- "\n")))
- (riece-redisplay-buffers)))
+ "\n")))))
(defun riece-handle-quit-message (prefix string)
(let* ((user (riece-prefix-nickname prefix))
(format "%s has left IRC"
(riece-format-identity user-identity t))
message))
- "\n"))))
- (riece-redisplay-buffers))
+ "\n")))))
(defun riece-handle-kill-message (prefix string)
(let* ((killer (riece-prefix-nickname prefix))
(riece-format-identity killer-identity t)
(riece-format-identity user-identity t))
message))
- "\n")))
- (riece-redisplay-buffers)))
+ "\n")))))
(defun riece-handle-invite-message (prefix string)
(let* ((user (riece-prefix-nickname prefix))
(riece-format-identity channel-identity t)
(riece-format-identity user-identity t)
topic))
- "\n"))
- (riece-redisplay-buffers))))
+ "\n")))))
(defsubst riece-parse-channel-modes (string channel)
(while (string-match "^[-+]\\([^ ]*\\) *" string)
(riece-format-identity channel-identity t)
(riece-format-identity user-identity t)
string))
- "\n"))
- (riece-redisplay-buffers)))))
+ "\n"))))))
(provide 'riece-handle)
;; If you are not joined any channel,
;; switch to the target immediately.
(unless riece-current-channel
- (riece-switch-to-channel target))
- (riece-redisplay-buffers))
+ (riece-switch-to-channel target)))
(riece-channel-buffer target)))
(defun riece-message-parent-buffers (message buffer)
(defun riece-naming-assert-join (user-name channel-name)
(riece-user-toggle-channel user-name channel-name t)
(riece-channel-toggle-user channel-name user-name t)
- (if (riece-identity-equal-no-server user-name riece-real-nickname)
- (let ((channel-identity (riece-make-identity channel-name
- riece-server-name)))
- (riece-join-channel channel-identity)
- (riece-switch-to-channel channel-identity)
- (setq riece-join-channel-candidate nil))))
+ (let ((user-identity (riece-make-identity user-name
+ riece-server-name))
+ (channel-identity (riece-make-identity channel-name
+ riece-server-name)))
+ (when (riece-identity-equal-no-server user-name riece-real-nickname)
+ (riece-join-channel channel-identity)
+ (riece-switch-to-channel channel-identity)
+ (setq riece-join-channel-candidate nil))
+ (riece-emit-signal (riece-make-signal 'join
+ user-identity
+ channel-identity))))
(defun riece-naming-assert-part (user-name channel-name)
(riece-user-toggle-channel user-name channel-name nil)
(riece-channel-toggle-user channel-name user-name nil)
(riece-channel-toggle-operator channel-name user-name nil)
(riece-channel-toggle-speaker channel-name user-name nil)
- (if (riece-identity-equal-no-server user-name riece-real-nickname)
- (riece-part-channel (riece-make-identity channel-name
- riece-server-name))))
+ (let ((user-identity (riece-make-identity user-name
+ riece-server-name))
+ (channel-identity (riece-make-identity channel-name
+ riece-server-name)))
+ (if (riece-identity-equal-no-server user-name riece-real-nickname)
+ (riece-part-channel channel-identity))
+ (riece-emit-signal (riece-make-signal 'part
+ user-identity
+ channel-identity))))
(defun riece-naming-assert-rename (old-name new-name)
(if (riece-identity-equal-no-server old-name riece-real-nickname)
riece-channel-buffer-alist)
riece-channel-buffer-alist))))
(if (riece-identity-equal old-identity riece-current-channel)
- (riece-switch-to-channel new-identity)))))
+ (riece-switch-to-channel new-identity)))
+ (riece-emit-signal (riece-make-signal 'rename old-identity new-identity))))
+
+(defun riece-naming-assert-names (users channel-name)
+ (let ((channel-identity (riece-make-identity channel-name
+ riece-server-name))
+ user-identity-list)
+ (while users
+ (riece-user-toggle-channel (car (car users)) channel-name t)
+ (riece-channel-toggle-user channel-name (car (car users)) t)
+ (if (memq ?o (cdr (car users)))
+ (riece-channel-toggle-operator channel-name
+ (car (car users))
+ t)
+ (if (memq ?v (cdr (car users)))
+ (riece-channel-toggle-speaker channel-name
+ (car (car users))
+ t)))
+ (setq user-identity-list
+ (cons (riece-make-identity (car (car users))
+ riece-server-name)
+ user-identity-list))
+ (when (riece-identity-equal-no-server (car (car users))
+ riece-real-nickname)
+ (riece-join-channel channel-identity)
+ (riece-switch-to-channel channel-identity)
+ (setq riece-join-channel-candidate nil))
+ (setq users (cdr users)))
+ (riece-emit-signal (riece-make-signal 'names
+ (nreverse user-identity-list)
+ channel-identity))))
(provide 'riece-naming)
(riece-identity-member (riece-message-target message)
riece-unread-channels))
(setq riece-unread-channels
- (cons (riece-message-target message) riece-unread-channels))
- (riece-redisplay-buffers)))
+ (cons (riece-message-target message) riece-unread-channels))))
(defun riece-unread-after-switch-to-channel-function (last)
(setq riece-unread-channels
(riece-shrink-buffer (car buffers)))
(setq buffers (cdr buffers))))))))
(switch-to-buffer riece-command-buffer)
+ (riece-display-connect-signals)
(riece-redisplay-buffers)
(riece-open-server riece-server "")
(let ((server-list riece-startup-server-list))