<div dir="ltr">Hi Julien,<div><br></div><div style>Committed to trunk as r233.</div><div style><br></div><div style>Thanks!</div><div style><br></div><div style>Bye,</div><div style><br></div><div style>Erik.</div></div><div class="gmail_extra">
<br><br><div class="gmail_quote">On Wed, Dec 19, 2012 at 5:13 PM, Julien Danjou <span dir="ltr"><<a href="mailto:julien@danjou.info" target="_blank">julien@danjou.info</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Currently, the user nickname is recorded in the connection object when<br>
`connect' is called. Unfortunately, if it happens that the nickname used to<br>
connect is already taken, err_nicknameinuse is received and the connection<br>
is not established (yet).<br>
<br>
The thing to do to handle this, is to issue a `nick' command in<br>
err_nicknameinuse to pick a different nickname.<br>
<br>
The problem is that such a case, even if a NICK request was sent (and might<br>
or not be successful), there's no NICK reply sent by the server, because all<br>
of this happens before the welcome message has been sent. Therefore, the<br>
connection object as a wrong value for the user nickname (the one issued the<br>
first time, not the one actually negotiated).<br>
<br>
Consequently, functions such as `self-message-p' don't work correctly, and<br>
everything is just mess and chaos.<br>
<br>
To fix this, this patch stop registering the nickname at `connect' time, but<br>
does it as soon as the welcome message is received. That way, it is sure<br>
that the connection stores the real nickname, not the one asked for the<br>
first time.<br>
<br>
Signed-off-by: Julien Danjou <<a href="mailto:julien@danjou.info">julien@danjou.info</a>><br>
---<br>
 command.lisp  |  7 +------<br>
 event.lisp    | 13 +++++++++++++<br>
 protocol.lisp |  1 +<br>
 3 files changed, 15 insertions(+), 6 deletions(-)<br>
<br>
diff --git a/command.lisp b/command.lisp<br>
index c0277fc..aac445b 100644<br>
--- a/command.lisp<br>
+++ b/command.lisp<br>
@@ -296,13 +296,8 @@ connect to.  `connection-security' determines which port number is found.<br>
                                       :socket socket<br>
                                       :network-stream stream<br>
                                       :client-stream logging-stream<br>
-                                      :server-name server))<br>
-         (user (make-user connection<br>
-                          :nickname nickname<br>
-                          :username username<br>
-                          :realname realname)))<br>
+                                      :server-name server)))<br>
     #+sbcl (setf (sb-bsd-sockets::sockopt-keep-alive (usocket:socket socket)) t)<br>
-    (setf (user connection) user)<br>
     (unless (null password)<br>
       (pass connection password))<br>
     (nick connection nickname)<br>
diff --git a/event.lisp b/event.lisp<br>
index 3b99d4a..eb97fc9 100644<br>
--- a/event.lisp<br>
+++ b/event.lisp<br>
@@ -141,6 +141,19 @@ objects in sync."))<br>
               (username user) username<br>
               (hostname user) hostname)))))<br>
<br>
+(defmethod default-hook ((message irc-rpl_welcome-message))<br>
+  (with-slots<br>
+      (connection host user arguments)<br>
+      message<br>
+    (destructuring-bind<br>
+        (nickname welcome-message)<br>
+        arguments<br>
+      (setf (user connection)<br>
+            (make-user connection<br>
+                       :nickname nickname<br>
+                       :hostname host<br>
+                       :username user)))))<br>
+<br>
 (defmethod default-hook ((message irc-rpl_list-message))<br>
   (destructuring-bind<br>
       (channel count topic)<br>
diff --git a/protocol.lisp b/protocol.lisp<br>
index b464697..1c2ec19 100644<br>
--- a/protocol.lisp<br>
+++ b/protocol.lisp<br>
@@ -246,6 +246,7 @@ connection.")<br>
                      irc-rpl_topic-message<br>
                      irc-rpl_namreply-message<br>
                      irc-rpl_endofnames-message<br>
+                     irc-rpl_welcome-message<br>
                      irc-ping-message<br>
                      irc-join-message<br>
                      irc-topic-message<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.8.1.rc0<br>
<br>
<br>
_______________________________________________<br>
cl-irc-devel site list<br>
<a href="mailto:cl-irc-devel@common-lisp.net">cl-irc-devel@common-lisp.net</a><br>
<a href="http://common-lisp.net/mailman/listinfo/cl-irc-devel" target="_blank">http://common-lisp.net/mailman/listinfo/cl-irc-devel</a><br>
</font></span></blockquote></div><br></div>