The code used into mode-message and rpl_channelmodeis-message is exactly the same, so let's factorize this a bit to less code.
Signed-off-by: Julien Danjou julien@danjou.info --- event.lisp | 34 ++++++---------------------------- package.lisp | 1 + utility.lisp | 15 +++++++++++++++ 3 files changed, 22 insertions(+), 28 deletions(-)
diff --git a/event.lisp b/event.lisp index 5e6e417..57ccf51 100644 --- a/event.lisp +++ b/event.lisp @@ -279,20 +279,9 @@ objects in sync.")) (destructuring-bind (target channel &rest mode-arguments) arguments - (let* ((channel (find-channel connection channel)) - (mode-changes - (when channel - (parse-mode-arguments connection channel mode-arguments - :server-p (user connection))))) - (dolist (change mode-changes) - (destructuring-bind - (op mode-name value) - change - (unless (has-mode-p channel mode-name) - (add-mode channel mode-name - (make-mode connection channel mode-name))) - (funcall (if (char= #+ op) #'set-mode #'unset-mode) - channel mode-name value))))))) + (let ((channel (find-channel connection channel))) + (when channel + (apply-mode-changes connection channel mode-arguments (user connection)))))))
(defmethod default-hook ((message irc-mode-message)) (destructuring-bind @@ -300,20 +289,9 @@ objects in sync.")) (arguments message) (let* ((connection (connection message)) (target (or (find-channel connection target) - (find-user connection target))) - (mode-changes - (when target - (parse-mode-arguments connection target arguments - :server-p (user connection))))) - (dolist (change mode-changes) - (destructuring-bind - (op mode-name value) - change - (unless (has-mode-p target mode-name) - (add-mode target mode-name - (make-mode connection target mode-name))) - (funcall (if (char= #+ op) #'set-mode #'unset-mode) - target mode-name value)))))) + (find-user connection target)))) + (when target + (apply-mode-changes connection target arguments (user connection))))))
(defmethod default-hook ((message irc-nick-message)) (with-slots diff --git a/package.lisp b/package.lisp index c09537a..bd5a480 100644 --- a/package.lisp +++ b/package.lisp @@ -32,6 +32,7 @@ :get-mode :set-mode :unset-mode + :apply-mode-changes :parse-mode-arguments :parse-raw-message :normalize-nickname diff --git a/utility.lisp b/utility.lisp index 12c327c..9894ed0 100644 --- a/utility.lisp +++ b/utility.lisp @@ -493,6 +493,21 @@ It returns a list of mode-description records." (split-sequence:split-sequence #: x)) (split-sequence:split-sequence #, argument)))
+(defun apply-mode-changes (connection target mode-arguments server-p) + (dolist (change (parse-mode-arguments connection target mode-arguments + :server-p server-p)) + (apply-mode-change connection target change))) + +(defun apply-mode-change (connection target change) + (destructuring-bind + (op mode-name value) + change + (unless (has-mode-p target mode-name) + (add-mode target mode-name + (make-mode connection target mode-name))) + (funcall (if (char= #+ op) #'set-mode #'unset-mode) + target mode-name value))) + (defun parse-mode-arguments (connection target arguments &key server-p) "Create a list of mode changes with their arguments for `target' from `mode-string' and `arguments'.