[cl-irc-devel] [PATCH 3/6] Factorize mode change
Erik Huelsmann
ehuels at gmail.com
Sun Jan 13 19:00:50 UTC 2013
Hi Julien,
Thanks for your contributions so far! This one is committed as r239.
Bye,
Erik.
On Sun, Jan 13, 2013 at 3:04 PM, Julien Danjou <julien at danjou.info> wrote:
> 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 at 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'.
> --
> 1.8.1
>
>
> _______________________________________________
> cl-irc-devel site list
> cl-irc-devel at common-lisp.net
> http://common-lisp.net/mailman/listinfo/cl-irc-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/cl-irc-devel/attachments/20130113/ea939bdc/attachment.html>
More information about the cl-irc-devel
mailing list