]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Fix fast quit/connect by changing nick to UID on QuitUser
authordanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>
Tue, 10 Mar 2009 22:56:09 +0000 (22:56 +0000)
committerdanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>
Tue, 10 Mar 2009 22:56:09 +0000 (22:56 +0000)
This requires moving the sending of the QUIT back to usermanager from cull_list
in order to prevent client desyncs.

git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@11203 e03df62e-2008-0410-955e-edbf42e46eb7

src/cull_list.cpp
src/usermanager.cpp

index abefa8b5750fc8ec059aefd552597936acba40cf..95301f3e2d88a20684432abcdcefe3f27d256087 100644 (file)
@@ -42,13 +42,8 @@ int CullList::Apply()
                std::vector<User *>::iterator a = list.begin();
 
                User *u = (*a);
-               user_hash::iterator iter = ServerInstance->Users->clientlist->find(u->nick);
-               const std::string& preset_reason = u->GetOperQuit();
-               std::string reason;
-               std::string oper_reason;
-
-               reason.assign(u->quitmsg, 0, ServerInstance->Config->Limits.MaxQuit);
-               oper_reason.assign(preset_reason.empty() ? preset_reason : u->operquitmsg, 0, ServerInstance->Config->Limits.MaxQuit);
+               // user has been moved onto their UID; that's why this isn't find(u->nick)
+               user_hash::iterator iter = ServerInstance->Users->clientlist->find(u->uuid);
 
                if (u->registered != REG_ALL)
                        if (ServerInstance->Users->unregistered_count)
@@ -58,19 +53,7 @@ int CullList::Apply()
                {
                        if (!u->sendq.empty())
                                u->FlushWriteBuf();
-               }
 
-               if (u->registered == REG_ALL)
-               {
-                       FOREACH_MOD_I(ServerInstance,I_OnUserQuit,OnUserQuit(u, reason, oper_reason));
-                       u->PurgeEmptyChannels();
-                       u->WriteCommonQuit(reason, oper_reason);
-               }
-
-               FOREACH_MOD_I(ServerInstance,I_OnUserDisconnect,OnUserDisconnect(u));
-
-               if (IS_LOCAL(u))
-               {
                        if (u->GetIOHook())
                        {
                                try
@@ -97,14 +80,14 @@ int CullList::Apply()
                        {
                                if (!u->quietquit)
                                {
-                                       ServerInstance->SNO->WriteToSnoMask('q',"Client exiting: %s!%s@%s [%s]", u->nick.c_str(), u->ident.c_str(), u->host.c_str(), oper_reason.c_str());
+                                       ServerInstance->SNO->WriteToSnoMask('q',"Client exiting: %s!%s@%s [%s]", u->nick.c_str(), u->ident.c_str(), u->host.c_str(), u->operquitmsg.c_str());
                                }
                        }
                        else
                        {
                                if ((!ServerInstance->SilentULine(u->server)) && (!u->quietquit))
                                {
-                                       ServerInstance->SNO->WriteToSnoMask('Q',"Client exiting on server %s: %s!%s@%s [%s]", u->server, u->nick.c_str(), u->ident.c_str(), u->host.c_str(), oper_reason.c_str());
+                                       ServerInstance->SNO->WriteToSnoMask('Q',"Client exiting on server %s: %s!%s@%s [%s]", u->server, u->nick.c_str(), u->ident.c_str(), u->host.c_str(), u->operquitmsg.c_str());
                                }
                        }
                        u->AddToWhoWas();
index f8b1f0de257cfe4d4b4d53f8c911c810460ac055..cf068171deb3b7384e9f419fcf922a226b45f533 100644 (file)
@@ -184,12 +184,33 @@ void UserManager::QuitUser(User *user, const std::string &quitreason, const char
        user->quietquit = false;
        user->quitmsg = quitreason;
 
+       std::string reason;
+       std::string oper_reason;
+       reason.assign(quitreason, 0, ServerInstance->Config->Limits.MaxQuit);
        if (!*operreason)
+       {
                user->operquitmsg = quitreason;
+               oper_reason.assign(quitreason, 0, ServerInstance->Config->Limits.MaxQuit);
+       }
        else
+       {
                user->operquitmsg = operreason;
+               oper_reason.assign(operreason, 0, ServerInstance->Config->Limits.MaxQuit);
+       }
 
        ServerInstance->GlobalCulls.AddItem(user);
+
+       if (user->registered == REG_ALL)
+       {
+               FOREACH_MOD_I(ServerInstance,I_OnUserQuit,OnUserQuit(user, reason, oper_reason));
+               user->PurgeEmptyChannels();
+               user->WriteCommonQuit(reason, oper_reason);
+       }
+
+       FOREACH_MOD_I(ServerInstance,I_OnUserDisconnect,OnUserDisconnect(user));
+
+       // Move the user onto their UID, to allow nick to be reused immediately
+       user->UpdateNickHash(user->uuid.c_str());
 }