]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/users.cpp
Convert InspIRCd::SetSignals to a static function.
[user/henk/code/inspircd.git] / src / users.cpp
index 37e3814855b3555d71303bcd3d5463da48ea5c62..6c58f0617d500c52624336a4e427a2aa2cd7c6fe 100644 (file)
@@ -112,6 +112,15 @@ LocalUser::LocalUser(int myfd, irc::sockets::sockaddrs* client, irc::sockets::so
        ChangeRealHost(GetIPString(), true);
 }
 
+LocalUser::LocalUser(int myfd, const std::string& uid, Serializable::Data& data)
+       : User(uid, ServerInstance->FakeClient->server, USERTYPE_LOCAL)
+       , eh(this)
+       , already_sent(0)
+{
+       eh.SetFd(myfd);
+       Deserialize(data);
+}
+
 User::~User()
 {
 }
@@ -314,10 +323,10 @@ bool UserIOHandler::OnSetEndPoint(const irc::sockets::sockaddrs& server, const i
        return !user->quitting;
 }
 
-void UserIOHandler::OnError(BufferedSocketError error)
+void UserIOHandler::OnError(BufferedSocketError sockerr)
 {
        ModResult res;
-       FIRST_MOD_RESULT(OnConnectionFail, res, (user, error));
+       FIRST_MOD_RESULT(OnConnectionFail, res, (user, sockerr));
        if (res != MOD_RES_ALLOW)
                ServerInstance->Users->QuitUser(user, getError());
 }
@@ -441,6 +450,13 @@ void User::UnOper()
         */
        oper = NULL;
 
+       // Remove the user from the oper list
+       stdalgo::vector::swaperase(ServerInstance->Users->all_opers, this);
+
+       // If the user is quitting we shouldn't remove any modes as it results in
+       // mode messages being broadcast across the network.
+       if (quitting)
+               return;
 
        /* Remove all oper only modes from the user when the deoper - Bug #466*/
        Modes::ChangeList changelist;
@@ -454,9 +470,6 @@ void User::UnOper()
 
        ServerInstance->Modes->Process(this, NULL, this, changelist);
 
-       // Remove the user from the oper list
-       stdalgo::vector::swaperase(ServerInstance->Users->all_opers, this);
-
        ModeHandler* opermh = ServerInstance->Modes->FindMode('o', MODETYPE_USER);
        if (opermh)
                this->SetMode(opermh, false);
@@ -745,17 +758,16 @@ void LocalUser::SetClientIP(const irc::sockets::sockaddrs& sa)
                return;
 
        ServerInstance->Users->RemoveCloneCounts(this);
-
        User::SetClientIP(sa);
-
-       FOREACH_MOD(OnSetUserIP, (this));
-
        ServerInstance->Users->AddClone(this);
 
        // Recheck the connect class.
        this->MyClass = NULL;
        this->SetClass();
        this->CheckClass();
+
+       if (!quitting)
+               FOREACH_MOD(OnSetUserIP, (this));
 }
 
 void LocalUser::Write(const ClientProtocol::SerializedMessage& text)
@@ -841,7 +853,7 @@ void User::WriteNumeric(const Numeric::Numeric& numeric)
 
 void User::WriteRemoteNotice(const std::string& text)
 {
-       ServerInstance->PI->SendUserNotice(this, text);
+       ServerInstance->PI->SendMessage(this, text, MSG_NOTICE);
 }
 
 void LocalUser::WriteRemoteNotice(const std::string& text)
@@ -1185,10 +1197,24 @@ const std::string& FakeUser::GetFullRealHost()
 }
 
 ConnectClass::ConnectClass(ConfigTag* tag, char t, const std::string& mask)
-       : config(tag), type(t), fakelag(true), name("unnamed"), registration_timeout(0), host(mask),
-       pingtime(0), softsendqmax(0), hardsendqmax(0), recvqmax(0),
-       penaltythreshold(0), commandrate(0), maxlocal(0), maxglobal(0), maxconnwarn(true), maxchans(ServerInstance->Config->MaxChans),
-       limit(0), resolvehostnames(true)
+       : config(tag)
+       , type(t)
+       , fakelag(true)
+       , name("unnamed")
+       , registration_timeout(0)
+       , host(mask)
+       , pingtime(0)
+       , softsendqmax(0)
+       , hardsendqmax(0)
+       , recvqmax(0)
+       , penaltythreshold(0)
+       , commandrate(0)
+       , maxlocal(0)
+       , maxglobal(0)
+       , maxconnwarn(true)
+       , maxchans(0)
+       , limit(0)
+       , resolvehostnames(true)
 {
 }