]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Probably wont compile yet - purge_empty_channels refactor
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Thu, 9 Mar 2006 11:24:30 +0000 (11:24 +0000)
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Thu, 9 Mar 2006 11:24:30 +0000 (11:24 +0000)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@3579 e03df62e-2008-0410-955e-edbf42e46eb7

include/channels.h
include/users.h
src/channels.cpp
src/helperfuncs.cpp
src/modules/m_spanningtree.cpp
src/users.cpp

index c7a0a8777e941019599ba51d16c44ad437f438a0..e14c81f270143da501c1b1cdbff919a6a2962219 100644 (file)
@@ -213,8 +213,9 @@ class chanrec : public Extensible
 
         /** Delete a user pointer to the internal reference list
         * @param user The user to delete
+        * @return number of users left on the channel
          */
-       void DelUser(userrec* user);
+       unsigned long DelUser(userrec* user);
        void DelOppedUser(userrec* user);
        void DelHalfoppedUser(userrec* user);
        void DelVoicedUser(userrec* user);
index 71563abfa9354f482d8a3979f3cae52b3ed2ae62..294bc1e1f358b42f3fecf78c242ffeff7d88961e 100644 (file)
@@ -151,7 +151,7 @@ class userrec : public connection
         */
        char modes[54];
        
-       std::vector<ucrec> chans;
+       std::vector<ucrec*> chans;
        
        /** The server the user is connected to.
         */
index 95e51115686df6b2704a140f0ec4bb113574b2d1..1574ffc0bd0f7592692fdf235e7f6b9b4aaabe44 100644 (file)
@@ -66,7 +66,7 @@ extern chan_hash chanlist;
 
 using namespace std;
 
-chanrec* ForceChan(chanrec* Ptr,ucrec &a,userrec* user, int created);
+chanrec* ForceChan(chanrec* Ptr,ucrec *a,userrec* user, int created);
 
 chanrec::chanrec()
 {
@@ -133,7 +133,7 @@ void chanrec::AddUser(userrec* user)
        internal_userlist[user] = user;
 }
 
-void chanrec::DelUser(userrec* user)
+unsigned long chanrec::DelUser(userrec* user)
 {
        CUList::iterator a = internal_userlist.find(user);
        if (a != internal_userlist.end())
@@ -143,8 +143,9 @@ void chanrec::DelUser(userrec* user)
                DelOppedUser(user);
                DelHalfoppedUser(user);
                DelVoicedUser(user);
-               return;
+               return internal_userlist.size();
        }
+       return internal_userlist.size();
 }
 
 bool chanrec::HasUser(userrec* user)
@@ -387,7 +388,7 @@ chanrec* add_channel(userrec *user, const char* cn, const char* key, bool overri
         */
        if (!IS_LOCAL(user)) /* was a check on fd < 0 */
        {
-               ucrec a;
+               ucrec* a = new ucrec();
                chanrec* c = ForceChan(Ptr,a,user,created);
                user->chans.push_back(a);
                return c;
@@ -397,7 +398,7 @@ chanrec* add_channel(userrec *user, const char* cn, const char* key, bool overri
                /* Oper allows extension up to the OPERMAXCHANS value */
                if (user->chans.size() < OPERMAXCHANS)
                {
-                       ucrec a;
+                       ucrec* a = new ucrec();
                        chanrec* c = ForceChan(Ptr,a,user,created);
                        user->chans.push_back(a);
                        return c;
@@ -419,10 +420,10 @@ chanrec* add_channel(userrec *user, const char* cn, const char* key, bool overri
                        chanlist.erase(n);
                        for (unsigned int index =0; index < user->chans.size(); index++)
                        {
-                               if (user->chans[index].channel == Ptr)
+                               if (user->chans[index]->channel == Ptr)
                                {
-                                       user->chans[index].channel = NULL;
-                                       user->chans[index].uc_modes = 0;        
+                                       user->chans[index]->channel = NULL;
+                                       user->chans[index]->uc_modes = 0;       
                                }
                        }
                }
@@ -430,17 +431,17 @@ chanrec* add_channel(userrec *user, const char* cn, const char* key, bool overri
        return NULL;
 }
 
-chanrec* ForceChan(chanrec* Ptr,ucrec &a,userrec* user, int created)
+chanrec* ForceChan(chanrec* Ptr,ucrec *a,userrec* user, int created)
 {
        if (created == 2)
        {
                /* first user in is given ops */
-               a.uc_modes = UCMODE_OP;
+               a->uc_modes = UCMODE_OP;
                Ptr->AddOppedUser(user);
        }
        else
        {
-               a.uc_modes = 0;
+               a->uc_modes = 0;
        }
 
        a.channel = Ptr;
@@ -483,7 +484,7 @@ chanrec* del_channel(userrec *user, const char* cname, const char* reason, bool
        for (unsigned int i =0; i < user->chans.size(); i++)
        {
                /* zap it from the channel list of the user */
-               if (user->chans[i].channel == Ptr)
+               if (user->chans[i]->channel == Ptr)
                {
                        if (reason)
                        {
@@ -495,8 +496,8 @@ chanrec* del_channel(userrec *user, const char* cname, const char* reason, bool
                                FOREACH_MOD(I_OnUserPart,OnUserPart(user,Ptr,""));
                                WriteChannel(Ptr,user,"PART :%s",Ptr->name);
                        }
-                       user->chans[i].uc_modes = 0;
-                       user->chans[i].channel = NULL;
+                       user->chans[i]->uc_modes = 0;
+                       user->chans[i]->channel = NULL;
                        log(DEBUG,"del_channel: unlinked: %s %s",user->nick,Ptr->name);
                        break;
                }
@@ -547,12 +548,11 @@ void server_kick_channel(userrec* user, chanrec* Ptr, char* reason, bool trigger
 
        for (unsigned int i =0; i < user->chans.size(); i++)
        {
-               if (user->chans[i].channel)
-               if (!strcasecmp(user->chans[i].channel->name,Ptr->name))
+               if ((user->chans[i]->channel) && (user->chans[i]->channel->name == Ptr))
                {
                        WriteChannelWithServ(Config->ServerName,Ptr,"KICK %s %s :%s",Ptr->name, user->nick, reason);
-                       user->chans[i].uc_modes = 0;
-                       user->chans[i].channel = NULL;
+                       user->chans[i]->uc_modes = 0;
+                       user->chans[i]->channel = NULL;
                        break;
                }
        }
@@ -631,23 +631,18 @@ void kick_channel(userrec *src,userrec *user, chanrec *Ptr, char* reason)
        for (unsigned int i =0; i < user->chans.size(); i++)
        {
                /* zap it from the channel list of the user */
-               if (user->chans[i].channel)
+               if ((user->chans[i].channel) && (user->chans[i].channel == Ptr->name))
                {
-                       if (!strcasecmp(user->chans[i].channel->name,Ptr->name))
-                       {
-                               WriteChannel(Ptr,src,"KICK %s %s :%s",Ptr->name, user->nick, reason);
-                               user->chans[i].uc_modes = 0;
-                               user->chans[i].channel = NULL;
-                               log(DEBUG,"del_channel: unlinked: %s %s",user->nick,Ptr->name);
-                               break;
-                       }
+                       WriteChannel(Ptr,src,"KICK %s %s :%s",Ptr->name, user->nick, reason);
+                       user->chans[i].uc_modes = 0;
+                       user->chans[i].channel = NULL;
+                       log(DEBUG,"del_channel: unlinked: %s %s",user->nick,Ptr->name);
+                       break;
                }
        }
 
-       Ptr->DelUser(user);
-
+       if (!Ptr->DelUser(user))
        /* if there are no users left on the channel */
-       if (!usercount(Ptr))
        {
                chan_hash::iterator iter = chanlist.find(Ptr->name);
 
index d2ec1f7d0c2a994b2a396f14ae2a4244579dfe0e..f728516f90752b45b59f1cd720ce281c8d078092 100644 (file)
@@ -1219,49 +1219,37 @@ long GetMaxBans(char* name)
 void purge_empty_chans(userrec* u)
 {
        int purge = 0;
+       std::vector<chanrec*> to_delete;
 
        // firstly decrement the count on each channel
-       for (unsigned int f = 0; f < u->chans.size(); f++)
+       for (std::vector<ucrec*>::iterator f = u->chans.begin(); f != u->chans.end(); f++)
        {
-               if (u->chans[f].channel)
+               ucrec* (ucrec*)*f;
+               if (f->channel)
                {
-                       u->chans[f].channel->DelUser(u);
+                       if (f->channel->DelUser(u) == 0)
+                       {
+                               /* No users left in here, mark it for deletion */
+                               to_delete.push_back(f->channel);
+                               f->channel = NULL;
+                       }
                }
        }
 
-       for (unsigned int i = 0; i < u->chans.size(); i++)
+       for (std::vector<chanrec*>::iterator n = to_delete.begin(); n != to_delete.end(); n++)
        {
-               if (u->chans[i].channel)
+               chanrec* thischan = (chanrec*)*n;
+               chan_hash::iterator i2 = chanlist.find(thischan->name);
+               if (i2 != chanlist.end())
                {
-                       if (!usercount(u->chans[i].channel))
-                       {
-                               chan_hash::iterator i2 = chanlist.find(u->chans[i].channel->name);
-
-                               /* kill the record */
-                               if (i2 != chanlist.end())
-                               {
-                                       log(DEBUG,"del_channel: destroyed: %s",i2->second->name);
-
-                                       if (i2->second)
-                                       {
-                                               FOREACH_MOD(I_OnChannelDelete,OnChannelDelete(i2->second));
-                                               delete i2->second;
-                                       }
-
-                                       chanlist.erase(i2);
-                                       purge++;
-                                       u->chans[i].channel = NULL;
-                               }
-                       }
-                       else
-                       {
-                               log(DEBUG,"skipped purge for %s",u->chans[i].channel->name);
-                       }
+                       FOREACH_MOD(I_OnChannelDelete,OnChannelDelete(i2->second));
+                       delete i2->second;
+                       chanlist.erase(i2);
                }
        }
 
-       log(DEBUG,"completed channel purge, killed %lu",(unsigned long)purge);
-       DeleteOper(u);
+       if (*u->oper)
+               DeleteOper(u);
 }
 
 
index bb97d2b055a365222e529d8c1edd0f4760d20f2c..e99bd814d4efcb2c78e7c6a0adcdf105085db295 100644 (file)
@@ -1111,11 +1111,6 @@ class TreeSocket : public InspSocket
                strlcpy(clientlist[tempnick]->modes, modes.c_str(),53);
                inet_aton(params[6].c_str(),&clientlist[tempnick]->ip4);
 
-               ucrec a;
-               a.channel = NULL;
-               a.uc_modes = 0;
-               clientlist[tempnick]->chans.resize(MAXCHANS);
-
                WriteOpers("*** Client connecting at %s: %s!%s@%s [%s]",clientlist[tempnick]->server,clientlist[tempnick]->nick,clientlist[tempnick]->ident,clientlist[tempnick]->host,(char*)inet_ntoa(clientlist[tempnick]->ip4));
 
                params[7] = ":" + params[7];
index 94ed97d93f9b3b0f4df0c0defb63bcd8ebc62c88..9bc006bbc4725c5bc32cce0eeda72e1754ef4859 100644 (file)
@@ -113,10 +113,20 @@ userrec::userrec()
        sendq = "";
        chans.clear();
        invites.clear();
+        clientlist[tempnick]->chans.resize(MAXCHANS);
+        for (unsigned int n = 0; n < MAXCHANS; n++)
+        {       
+               clientlist[tempnick]->chans[n] = new ucrec();
+        }
 }
 
 userrec::~userrec()
 {
+       for (std::vector<ucrec*>::iterator n = clientlist[tempnick]->chans.begin(); n != clientlist[tempnick]->chans.end(); n++)
+       {
+               ucrec* x = (ucrec*)*n;
+               delete x;
+       }
 }
 
 void userrec::MakeHost(char* nhost)
@@ -616,11 +626,6 @@ void AddClient(int socket, int port, bool iscached, in_addr ip4)
         clientlist[tempnick]->sendqmax = class_sqmax;
         clientlist[tempnick]->recvqmax = class_rqmax;
 
-        ucrec a;
-        a.channel = NULL;
-        a.uc_modes = 0;
-       clientlist[tempnick]->chans.resize(MAXCHANS);
-
        fd_ref_table[socket] = clientlist[tempnick];
        local_users.push_back(clientlist[tempnick]);