]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/users.cpp
Change the syntax of FOREACH macros to be less dumb.
[user/henk/code/inspircd.git] / src / users.cpp
index 468c2aa36e92980402ccf29c8dd22f31c6baa803..0cd92faefe7bedb4b69df08a76243897cc301dcb 100644 (file)
 
 already_sent_t LocalUser::already_sent_id = 0;
 
-std::string User::ProcessNoticeMasks(const char *sm)
-{
-       bool adding = true, oldadding = false;
-       const char *c = sm;
-       std::string output;
-
-       while (c && *c)
-       {
-               switch (*c)
-               {
-                       case '+':
-                               adding = true;
-                       break;
-                       case '-':
-                               adding = false;
-                       break;
-                       case '*':
-                               for (unsigned char d = 'a'; d <= 'z'; d++)
-                               {
-                                       if (!ServerInstance->SNO->masks[d - 'a'].Description.empty())
-                                       {
-                                               if ((!IsNoticeMaskSet(d) && adding) || (IsNoticeMaskSet(d) && !adding))
-                                               {
-                                                       if ((oldadding != adding) || (!output.length()))
-                                                               output += (adding ? '+' : '-');
-
-                                                       this->SetNoticeMask(d, adding);
-
-                                                       output += d;
-                                               }
-                                               oldadding = adding;
-                                               char u = toupper(d);
-                                               if ((!IsNoticeMaskSet(u) && adding) || (IsNoticeMaskSet(u) && !adding))
-                                               {
-                                                       if ((oldadding != adding) || (!output.length()))
-                                                               output += (adding ? '+' : '-');
-
-                                                       this->SetNoticeMask(u, adding);
-
-                                                       output += u;
-                                               }
-                                               oldadding = adding;
-                                       }
-                               }
-                       break;
-                       default:
-                               if (isalpha(*c))
-                               {
-                                       if ((!IsNoticeMaskSet(*c) && adding) || (IsNoticeMaskSet(*c) && !adding))
-                                       {
-                                               if ((oldadding != adding) || (!output.length()))
-                                                       output += (adding ? '+' : '-');
-
-                                               this->SetNoticeMask(*c, adding);
-
-                                               output += *c;
-                                       }
-                               }
-                               else
-                                       this->WriteNumeric(ERR_UNKNOWNSNOMASK, "%s %c :is unknown snomask char to me", this->nick.c_str(), *c);
-
-                               oldadding = adding;
-                       break;
-               }
-
-               c++;
-       }
-
-       std::string s = this->FormatNoticeMasks();
-       if (s.length() == 0)
-       {
-               this->modes[UM_SNOMASK] = false;
-       }
-
-       return output;
-}
-
 bool User::IsNoticeMaskSet(unsigned char sm)
 {
        if (!isalpha(sm))
@@ -115,26 +38,6 @@ bool User::IsNoticeMaskSet(unsigned char sm)
        return (snomasks[sm-65]);
 }
 
-void User::SetNoticeMask(unsigned char sm, bool value)
-{
-       if (!isalpha(sm))
-               return;
-       snomasks[sm-65] = value;
-}
-
-std::string User::FormatNoticeMasks()
-{
-       std::string data;
-
-       for (unsigned char n = 0; n < 64; n++)
-       {
-               if (snomasks[n])
-                       data.push_back(n + 65); 
-       }
-
-       return data;
-}
-
 bool User::IsModeSet(unsigned char m)
 {
        if (!isalpha(m))
@@ -142,13 +45,6 @@ bool User::IsModeSet(unsigned char m)
        return (modes[m-65]);
 }
 
-void User::SetMode(unsigned char m, bool value)
-{
-       if (!isalpha(m))
-               return;
-       modes[m-65] = value;
-}
-
 const char* User::FormatModes(bool showparameters)
 {
        static std::string data;
@@ -471,13 +367,14 @@ CullResult FakeUser::cull()
 
 void User::Oper(OperInfo* info)
 {
-       if (this->IsModeSet('o'))
+       ModeHandler* opermh = ServerInstance->Modes->FindMode('o', MODETYPE_USER);
+       if (this->IsModeSet(opermh))
                this->UnOper();
 
-       this->modes[UM_OPERATOR] = 1;
+       this->SetMode(opermh, true);
        this->oper = info;
        this->WriteServ("MODE %s :+o", this->nick.c_str());
-       FOREACH_MOD(I_OnOper, OnOper(this, info->name));
+       FOREACH_MOD(OnOper, (this, info->name));
 
        std::string opername;
        if (info->oper_block)
@@ -505,7 +402,7 @@ void User::Oper(OperInfo* info)
        if (IS_LOCAL(this))
                oper->init();
 
-       FOREACH_MOD(I_OnPostOper,OnPostOper(this, oper->name, opername));
+       FOREACH_MOD(OnPostOper, (this, oper->name, opername));
 }
 
 void OperInfo::init()
@@ -594,13 +491,14 @@ void User::UnOper()
        /* remove the user from the oper list. Will remove multiple entries as a safeguard against bug #404 */
        ServerInstance->Users->all_opers.remove(this);
 
-       this->modes[UM_OPERATOR] = 0;
+       ModeHandler* opermh = ServerInstance->Modes->FindMode('o', MODETYPE_USER);
+       this->SetMode(opermh, false);
 }
 
 /*
  * Check class restrictions
  */
-void LocalUser::CheckClass()
+void LocalUser::CheckClass(bool clone_count)
 {
        ConnectClass* a = this->MyClass;
 
@@ -614,19 +512,22 @@ void LocalUser::CheckClass()
                ServerInstance->Users->QuitUser(this, a->config->getString("reason", "Unauthorised connection"));
                return;
        }
-       else if ((a->GetMaxLocal()) && (ServerInstance->Users->LocalCloneCount(this) > a->GetMaxLocal()))
-       {
-               ServerInstance->Users->QuitUser(this, "No more connections allowed from your host via this connect class (local)");
-               if (a->maxconnwarn)
-                       ServerInstance->SNO->WriteToSnoMask('a', "WARNING: maximum LOCAL connections (%ld) exceeded for IP %s", a->GetMaxLocal(), this->GetIPString().c_str());
-               return;
-       }
-       else if ((a->GetMaxGlobal()) && (ServerInstance->Users->GlobalCloneCount(this) > a->GetMaxGlobal()))
+       else if (clone_count)
        {
-               ServerInstance->Users->QuitUser(this, "No more connections allowed from your host via this connect class (global)");
-               if (a->maxconnwarn)
-                       ServerInstance->SNO->WriteToSnoMask('a', "WARNING: maximum GLOBAL connections (%ld) exceeded for IP %s", a->GetMaxGlobal(), this->GetIPString().c_str());
-               return;
+               if ((a->GetMaxLocal()) && (ServerInstance->Users->LocalCloneCount(this) > a->GetMaxLocal()))
+               {
+                       ServerInstance->Users->QuitUser(this, "No more connections allowed from your host via this connect class (local)");
+                       if (a->maxconnwarn)
+                               ServerInstance->SNO->WriteToSnoMask('a', "WARNING: maximum LOCAL connections (%ld) exceeded for IP %s", a->GetMaxLocal(), this->GetIPString().c_str());
+                       return;
+               }
+               else if ((a->GetMaxGlobal()) && (ServerInstance->Users->GlobalCloneCount(this) > a->GetMaxGlobal()))
+               {
+                       ServerInstance->Users->QuitUser(this, "No more connections allowed from your host via this connect class (global)");
+                       if (a->maxconnwarn)
+                               ServerInstance->SNO->WriteToSnoMask('a', "WARNING: maximum GLOBAL connections (%ld) exceeded for IP %s", a->GetMaxGlobal(), this->GetIPString().c_str());
+                       return;
+               }
        }
 
        this->nping = ServerInstance->Time() + a->GetPingTime() + ServerInstance->Config->dns_timeout;
@@ -707,11 +608,11 @@ void LocalUser::FullConnect()
         * We don't set REG_ALL until triggering OnUserConnect, so some module events don't spew out stuff
         * for a user that doesn't exist yet.
         */
-       FOREACH_MOD(I_OnUserConnect,OnUserConnect(this));
+       FOREACH_MOD(OnUserConnect, (this));
 
        this->registered = REG_ALL;
 
-       FOREACH_MOD(I_OnPostConnect,OnPostConnect(this));
+       FOREACH_MOD(OnPostConnect, (this));
 
        ServerInstance->SNO->WriteToSnoMask('c',"Client connecting on port %d (class %s): %s (%s) [%s]",
                this->GetServerPort(), this->MyClass->name.c_str(), GetFullRealHost().c_str(), this->GetIPString().c_str(), this->fullname.c_str());
@@ -839,7 +740,7 @@ bool User::ChangeNick(const std::string& newnick, bool force)
        (*(ServerInstance->Users->clientlist))[newnick] = this;
 
        if (registered == REG_ALL)
-               FOREACH_MOD(I_OnUserPostNick,OnUserPostNick(this,oldnick));
+               FOREACH_MOD(OnUserPostNick, (this,oldnick));
 
        return true;
 }
@@ -918,7 +819,7 @@ void LocalUser::SetClientIP(const irc::sockets::sockaddrs& sa, bool recheck_elin
                if (recheck_eline)
                        this->exempt = (ServerInstance->XLines->MatchesLine("E", this) != NULL);
 
-               FOREACH_MOD(I_OnSetUserIP,OnSetUserIP(this));
+               FOREACH_MOD(OnSetUserIP, (this));
        }
 }
 
@@ -1070,7 +971,7 @@ void User::WriteCommonRaw(const std::string &line, bool include_self)
 
        exceptions[this] = include_self;
 
-       FOREACH_MOD(I_OnBuildNeighborList,OnBuildNeighborList(this, include_c, exceptions));
+       FOREACH_MOD(OnBuildNeighborList, (this, include_c, exceptions));
 
        for (std::map<User*,bool>::iterator i = exceptions.begin(); i != exceptions.end(); ++i)
        {
@@ -1111,7 +1012,7 @@ void User::WriteCommonQuit(const std::string &normal_text, const std::string &op
        UserChanList include_c(chans);
        std::map<User*,bool> exceptions;
 
-       FOREACH_MOD(I_OnBuildNeighborList,OnBuildNeighborList(this, include_c, exceptions));
+       FOREACH_MOD(OnBuildNeighborList, (this, include_c, exceptions));
 
        for (std::map<User*,bool>::iterator i = exceptions.begin(); i != exceptions.end(); ++i)
        {
@@ -1216,7 +1117,7 @@ bool User::ChangeName(const char* gecos)
                FIRST_MOD_RESULT(OnChangeLocalUserGECOS, MOD_RESULT, (IS_LOCAL(this),gecos));
                if (MOD_RESULT == MOD_RES_DENY)
                        return false;
-               FOREACH_MOD(I_OnChangeName,OnChangeName(this,gecos));
+               FOREACH_MOD(OnChangeName, (this,gecos));
        }
        this->fullname.assign(gecos, 0, ServerInstance->Config->Limits.MaxGecos);
 
@@ -1234,7 +1135,7 @@ void User::DoHostCycle(const std::string &quitline)
        UserChanList include_c(chans);
        std::map<User*,bool> exceptions;
 
-       FOREACH_MOD(I_OnBuildNeighborList,OnBuildNeighborList(this, include_c, exceptions));
+       FOREACH_MOD(OnBuildNeighborList, (this, include_c, exceptions));
 
        for (std::map<User*,bool>::iterator i = exceptions.begin(); i != exceptions.end(); ++i)
        {
@@ -1302,7 +1203,7 @@ bool User::ChangeDisplayedHost(const char* shost)
                        return false;
        }
 
-       FOREACH_MOD(I_OnChangeHost, OnChangeHost(this,shost));
+       FOREACH_MOD(OnChangeHost, (this,shost));
 
        std::string quitstr = ":" + GetFullHost() + " QUIT :Changing host";
 
@@ -1324,7 +1225,7 @@ bool User::ChangeIdent(const char* newident)
        if (this->ident == newident)
                return true;
 
-       FOREACH_MOD(I_OnChangeIdent, OnChangeIdent(this,newident));
+       FOREACH_MOD(OnChangeIdent, (this,newident));
 
        std::string quitstr = ":" + GetFullHost() + " QUIT :Changing ident";