]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/channels.cpp
Removal of ancient TRUE/FALSE #defines (C-ish stuff)
[user/henk/code/inspircd.git] / src / channels.cpp
index 1574ffc0bd0f7592692fdf235e7f6b9b4aaabe44..3f2eca3f5f85ff33e12594c9ff5667e94dec9a15 100644 (file)
@@ -71,14 +71,14 @@ chanrec* ForceChan(chanrec* Ptr,ucrec *a,userrec* user, int created);
 chanrec::chanrec()
 {
        *name = *topic = *setby = *key = 0;
-       created = topicset = limit = binarymodes = 0;
+       created = topicset = limit = 0;
        internal_userlist.clear();
-       memset(&custom_modes,0,64);
+       memset(&modes,0,64);
 }
 
 void chanrec::SetCustomMode(char mode,bool mode_on)
 {
-       custom_modes[mode-65] = mode_on;
+       modes[mode-65] = mode_on;
        if (!mode_on)
                this->SetCustomModeParam(mode,"",false);
 }
@@ -108,19 +108,30 @@ void chanrec::SetCustomModeParam(char mode,char* parameter,bool mode_on)
        }
 }
 
-bool chanrec::IsCustomModeSet(char mode)
+bool chanrec::IsModeSet(char mode)
 {
-       return custom_modes[mode-65];
+       return modes[mode-65];
 }
 
 std::string chanrec::GetModeParameter(char mode)
 {
-       std::map<char,char*>::iterator n = custom_mode_params.find(mode);
-       if (n != custom_mode_params.end())
+       if (mode == 'k')
        {
-               return n->second;
+               return this->key;
+       }
+       else if (mode == 'l')
+       {
+               return ConvToStr(this->limit);
+       }
+       else
+       {
+               std::map<char,char*>::iterator n = custom_mode_params.find(mode);
+               if (n != custom_mode_params.end())
+               {
+                       return n->second;
+               }
+               return "";
        }
-       return "";
 }
 
 long chanrec::GetUserCounter()
@@ -254,7 +265,8 @@ chanrec* add_channel(userrec *user, const char* cn, const char* key, bool overri
                /* create a new one */
                chanlist[cname] = new chanrec();
                strlcpy(chanlist[cname]->name, cname,CHANMAX);
-               chanlist[cname]->binarymodes = CM_TOPICLOCK | CM_NOEXTERNAL;
+               chanlist[cname]->modes[CM_TOPICLOCK] = chanlist[cname]->modes[CM_NOEXTERNAL] = 1;
+               //chanlist[cname]->binarymodes = CM_TOPICLOCK | CM_NOEXTERNAL;
                chanlist[cname]->created = TIME;
                *chanlist[cname]->topic = 0;
                strlcpy(chanlist[cname]->setby, user->nick,NICKMAX-1);
@@ -311,7 +323,7 @@ chanrec* add_channel(userrec *user, const char* cn, const char* key, bool overri
                                                }
                                        }
                                }
-                               if (Ptr->binarymodes & CM_INVITEONLY)
+                               if (Ptr->modes[CM_INVITEONLY])
                                {
                                        MOD_RESULT = 0;
                                        irc::string xname(Ptr->name);
@@ -373,11 +385,11 @@ chanrec* add_channel(userrec *user, const char* cn, const char* key, bool overri
 
        log(DEBUG,"Passed channel checks");
 
-       for (unsigned int index =0; index < user->chans.size(); index++)
+       for (std::vector<ucrec*>::const_iterator index = user->chans.begin(); index != user->chans.end(); index++)
        {
-               if (user->chans[index].channel == NULL)
+               if ((ucrec*)(*index)->channel == NULL)
                {
-                       return ForceChan(Ptr,user->chans[index],user,created);
+                       return ForceChan(Ptr,(ucrec*)(*index),user,created);
                }
        }
 
@@ -444,19 +456,22 @@ chanrec* ForceChan(chanrec* Ptr,ucrec *a,userrec* user, int created)
                a->uc_modes = 0;
        }
 
-       a.channel = Ptr;
+       a->channel = Ptr;
        Ptr->AddUser(user);
        WriteChannel(Ptr,user,"JOIN :%s",Ptr->name);
-       log(DEBUG,"Sent JOIN to client");
 
-       if (Ptr->topicset)
+       /* Major improvement by Brain - we dont need to be calculating all this pointlessly for remote users */
+       if (IS_LOCAL(user))
        {
-               WriteServ(user->fd,"332 %s %s :%s", user->nick, Ptr->name, Ptr->topic);
-               WriteServ(user->fd,"333 %s %s %s %lu", user->nick, Ptr->name, Ptr->setby, (unsigned long)Ptr->topicset);
+               log(DEBUG,"Sent JOIN to client");
+               if (Ptr->topicset)
+               {
+                       WriteServ(user->fd,"332 %s %s :%s", user->nick, Ptr->name, Ptr->topic);
+                       WriteServ(user->fd,"333 %s %s %s %lu", user->nick, Ptr->name, Ptr->setby, (unsigned long)Ptr->topicset);
+               }
+               userlist(user,Ptr);
+               WriteServ(user->fd,"366 %s %s :End of /NAMES list.", user->nick, Ptr->name);
        }
-
-       userlist(user,Ptr);
-       WriteServ(user->fd,"366 %s %s :End of /NAMES list.", user->nick, Ptr->name);
        FOREACH_MOD(I_OnUserJoin,OnUserJoin(user,Ptr));
        return Ptr;
 }
@@ -548,7 +563,7 @@ 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) && (user->chans[i]->channel->name == Ptr))
+               if ((user->chans[i]->channel) && (user->chans[i]->channel == Ptr))
                {
                        WriteChannelWithServ(Config->ServerName,Ptr,"KICK %s %s :%s",Ptr->name, user->nick, reason);
                        user->chans[i]->uc_modes = 0;
@@ -627,15 +642,15 @@ void kick_channel(userrec *src,userrec *user, chanrec *Ptr, char* reason)
        }
 
        FOREACH_MOD(I_OnUserKick,OnUserKick(src,user,Ptr,reason));
-
-       for (unsigned int i =0; i < user->chans.size(); i++)
+                       
+       for (std::vector<ucrec*>::const_iterator i = user->chans.begin(); i != user->chans.end(); i++)
        {
                /* zap it from the channel list of the user */
-               if ((user->chans[i].channel) && (user->chans[i].channel == Ptr->name))
+               if ((((ucrec*)(*i))->channel) && (((ucrec*)(*i))->channel == Ptr))
                {
                        WriteChannel(Ptr,src,"KICK %s %s :%s",Ptr->name, user->nick, reason);
-                       user->chans[i].uc_modes = 0;
-                       user->chans[i].channel = NULL;
+                       ((ucrec*)(*i))->uc_modes = 0;
+                       ((ucrec*)(*i))->channel = NULL;
                        log(DEBUG,"del_channel: unlinked: %s %s",user->nick,Ptr->name);
                        break;
                }