]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/channels.cpp
Move some local-only fields to LocalUser
[user/henk/code/inspircd.git] / src / channels.cpp
index 22ec6e4d9f394015c78c9fc2f02d41b31109be35..d7f8f372e47b1645742027286aa4b5bee4d2bcf4 100644 (file)
@@ -125,17 +125,32 @@ Membership* Channel::AddUser(User* user)
        return memb;
 }
 
-unsigned long Channel::DelUser(User* user)
+void Channel::DelUser(User* user)
 {
        UserMembIter a = userlist.find(user);
 
        if (a != userlist.end())
        {
+               a->second->cull();
                delete a->second;
                userlist.erase(a);
        }
 
-       return userlist.size();
+       if (userlist.empty())
+       {
+               ModResult res;
+               FIRST_MOD_RESULT(OnChannelPreDelete, res, (this));
+               if (res == MOD_RES_DENY)
+                       return;
+               chan_hash::iterator iter = ServerInstance->chanlist->find(this->name);
+               /* kill the record */
+               if (iter != ServerInstance->chanlist->end())
+               {
+                       FOREACH_MOD(I_OnChannelDelete, OnChannelDelete(this));
+                       ServerInstance->chanlist->erase(iter);
+               }
+               ServerInstance->GlobalCulls.AddItem(this);
+       }
 }
 
 bool Channel::HasUser(User* user)
@@ -448,10 +463,10 @@ ModResult Channel::GetExtBanStatus(User *user, char type)
  * remove a channel from a users record, and return the number of users left.
  * Therefore, if this function returns 0 the caller should delete the Channel.
  */
-long Channel::PartUser(User *user, std::string &reason)
+void Channel::PartUser(User *user, std::string &reason)
 {
        if (!user)
-               return this->GetUserCounter();
+               return;
 
        Membership* memb = GetUser(user);
 
@@ -466,39 +481,23 @@ long Channel::PartUser(User *user, std::string &reason)
                this->RemoveAllPrefixes(user);
        }
 
-       if (!this->DelUser(user)) /* if there are no users left on the channel... */
-       {
-               chan_hash::iterator iter = ServerInstance->chanlist->find(this->name);
-               /* kill the record */
-               if (iter != ServerInstance->chanlist->end())
-               {
-                       ModResult res;
-                       FIRST_MOD_RESULT(OnChannelPreDelete, res, (this));
-                       if (res == MOD_RES_DENY)
-                               return 1; // delete halted by module
-                       FOREACH_MOD(I_OnChannelDelete, OnChannelDelete(this));
-                       ServerInstance->chanlist->erase(iter);
-               }
-               return 0;
-       }
-
-       return this->GetUserCounter();
+       this->DelUser(user);
 }
 
-long Channel::ServerKickUser(User* user, const char* reason, const std::string& servername)
+void Channel::ServerKickUser(User* user, const char* reason, const std::string& servername)
 {
        if (servername.empty() || !ServerInstance->Config->HideWhoisServer.empty())
                ServerInstance->FakeClient->server = ServerInstance->Config->ServerName;
        else
                ServerInstance->FakeClient->server = servername;
 
-       return this->KickUser(ServerInstance->FakeClient, user, reason);
+       KickUser(ServerInstance->FakeClient, user, reason);
 }
 
-long Channel::KickUser(User *src, User *user, const char* reason)
+void Channel::KickUser(User *src, User *user, const char* reason)
 {
        if (!src || !user || !reason)
-               return this->GetUserCounter();
+               return;
 
        Membership* memb = GetUser(user);
        if (IS_LOCAL(src))
@@ -506,12 +505,12 @@ long Channel::KickUser(User *src, User *user, const char* reason)
                if (!memb)
                {
                        src->WriteNumeric(ERR_USERNOTINCHANNEL, "%s %s %s :They are not on that channel",src->nick.c_str(), user->nick.c_str(), this->name.c_str());
-                       return this->GetUserCounter();
+                       return;
                }
                if ((ServerInstance->ULine(user->server)) && (!ServerInstance->ULine(src->server)))
                {
                        src->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :Only a u-line may kick a u-line from a channel.",src->nick.c_str(), this->name.c_str());
-                       return this->GetUserCounter();
+                       return;
                }
 
                ModResult res;
@@ -521,7 +520,7 @@ long Channel::KickUser(User *src, User *user, const char* reason)
                        FIRST_MOD_RESULT(OnUserPreKick, res, (src,memb,reason));
 
                if (res == MOD_RES_DENY)
-                       return this->GetUserCounter();
+                       return;
 
                if (res == MOD_RES_PASSTHRU)
                {
@@ -530,7 +529,7 @@ long Channel::KickUser(User *src, User *user, const char* reason)
                        if ((them < HALFOP_VALUE) || (them < us))
                        {
                                src->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :You must be a channel %soperator",src->nick.c_str(), this->name.c_str(), them >= HALFOP_VALUE ? "" : "half-");
-                               return this->GetUserCounter();
+                               return;
                        }
                }
        }
@@ -546,25 +545,7 @@ long Channel::KickUser(User *src, User *user, const char* reason)
                this->RemoveAllPrefixes(user);
        }
 
-       if (!this->DelUser(user))
-       /* if there are no users left on the channel */
-       {
-               chan_hash::iterator iter = ServerInstance->chanlist->find(this->name.c_str());
-
-               /* kill the record */
-               if (iter != ServerInstance->chanlist->end())
-               {
-                       ModResult res;
-                       FIRST_MOD_RESULT(OnChannelPreDelete, res, (this));
-                       if (res == MOD_RES_DENY)
-                               return 1; // delete halted by module
-                       FOREACH_MOD(I_OnChannelDelete, OnChannelDelete(this));
-                       ServerInstance->chanlist->erase(iter);
-               }
-               return 0;
-       }
-
-       return this->GetUserCounter();
+       this->DelUser(user);
 }
 
 void Channel::WriteChannel(User* user, const char* text, ...)