[cl-irc-devel] [PATCH] Register current user nickname on rpl_welcome

Erik Huelsmann ehuels at gmail.com
Sun Jan 13 18:31:50 UTC 2013


Hi Julien,

Committed to trunk as r233.

Thanks!

Bye,

Erik.


On Wed, Dec 19, 2012 at 5:13 PM, Julien Danjou <julien at danjou.info> wrote:

> Currently, the user nickname is recorded in the connection object when
> `connect' is called. Unfortunately, if it happens that the nickname used to
> connect is already taken, err_nicknameinuse is received and the connection
> is not established (yet).
>
> The thing to do to handle this, is to issue a `nick' command in
> err_nicknameinuse to pick a different nickname.
>
> The problem is that such a case, even if a NICK request was sent (and might
> or not be successful), there's no NICK reply sent by the server, because
> all
> of this happens before the welcome message has been sent. Therefore, the
> connection object as a wrong value for the user nickname (the one issued
> the
> first time, not the one actually negotiated).
>
> Consequently, functions such as `self-message-p' don't work correctly, and
> everything is just mess and chaos.
>
> To fix this, this patch stop registering the nickname at `connect' time,
> but
> does it as soon as the welcome message is received. That way, it is sure
> that the connection stores the real nickname, not the one asked for the
> first time.
>
> Signed-off-by: Julien Danjou <julien at danjou.info>
> ---
>  command.lisp  |  7 +------
>  event.lisp    | 13 +++++++++++++
>  protocol.lisp |  1 +
>  3 files changed, 15 insertions(+), 6 deletions(-)
>
> diff --git a/command.lisp b/command.lisp
> index c0277fc..aac445b 100644
> --- a/command.lisp
> +++ b/command.lisp
> @@ -296,13 +296,8 @@ connect to.  `connection-security' determines which
> port number is found.
>                                        :socket socket
>                                        :network-stream stream
>                                        :client-stream logging-stream
> -                                      :server-name server))
> -         (user (make-user connection
> -                          :nickname nickname
> -                          :username username
> -                          :realname realname)))
> +                                      :server-name server)))
>      #+sbcl (setf (sb-bsd-sockets::sockopt-keep-alive (usocket:socket
> socket)) t)
> -    (setf (user connection) user)
>      (unless (null password)
>        (pass connection password))
>      (nick connection nickname)
> diff --git a/event.lisp b/event.lisp
> index 3b99d4a..eb97fc9 100644
> --- a/event.lisp
> +++ b/event.lisp
> @@ -141,6 +141,19 @@ objects in sync."))
>                (username user) username
>                (hostname user) hostname)))))
>
> +(defmethod default-hook ((message irc-rpl_welcome-message))
> +  (with-slots
> +      (connection host user arguments)
> +      message
> +    (destructuring-bind
> +        (nickname welcome-message)
> +        arguments
> +      (setf (user connection)
> +            (make-user connection
> +                       :nickname nickname
> +                       :hostname host
> +                       :username user)))))
> +
>  (defmethod default-hook ((message irc-rpl_list-message))
>    (destructuring-bind
>        (channel count topic)
> diff --git a/protocol.lisp b/protocol.lisp
> index b464697..1c2ec19 100644
> --- a/protocol.lisp
> +++ b/protocol.lisp
> @@ -246,6 +246,7 @@ connection.")
>                       irc-rpl_topic-message
>                       irc-rpl_namreply-message
>                       irc-rpl_endofnames-message
> +                     irc-rpl_welcome-message
>                       irc-ping-message
>                       irc-join-message
>                       irc-topic-message
> --
> 1.8.1.rc0
>
>
> _______________________________________________
> 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/caf6d0e1/attachment.html>


More information about the cl-irc-devel mailing list