]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_callerid.cpp
Fix mistakenly using Clang instead of GCC on older FreeBSD versions.
[user/henk/code/inspircd.git] / src / modules / m_callerid.cpp
index 812df1da0ba3fd86384663e996854cafbe0a7b0d..4147f0b161f57a4453ea9eb3c040173d19a10576 100644 (file)
@@ -82,9 +82,11 @@ struct CallerIDExtInfo : public ExtensionItem
                        User *u = ServerInstance->FindNick(tok);
                        if ((u) && (u->registered == REG_ALL) && (!u->quitting) && (!IS_SERVER(u)))
                        {
-                               callerid_data* other = this->get(u, true);
-                               other->wholistsme.push_back(dat);
-                               dat->accepting.insert(u);
+                               if (dat->accepting.insert(u).second)
+                               {
+                                       callerid_data* other = this->get(u, true);
+                                       other->wholistsme.push_back(dat);
+                               }
                        }
                }
 
@@ -114,11 +116,16 @@ struct CallerIDExtInfo : public ExtensionItem
                        callerid_data *targ = this->get(*it, false);
 
                        if (!targ)
+                       {
+                               ServerInstance->Logs->Log("m_callerid", DEFAULT, "ERROR: Inconsistency detected in callerid state, please report (1)");
                                continue; // shouldn't happen, but oh well.
+                       }
 
                        std::list<callerid_data*>::iterator it2 = std::find(targ->wholistsme.begin(), targ->wholistsme.end(), dat);
                        if (it2 != targ->wholistsme.end())
                                targ->wholistsme.erase(it2);
+                       else
+                               ServerInstance->Logs->Log("m_callerid", DEFAULT, "ERROR: Inconsistency detected in callerid state, please report (2)");
                }
                delete dat;
        }
@@ -139,7 +146,7 @@ public:
                extInfo(Creator)
        {
                allow_empty_last_param = false;
-               syntax = "{[+|-]<nicks>}|*}";
+               syntax = "*|(+|-)<nick>[,(+|-)<nick> ...]";
                TRANSLATE2(TR_CUSTOM, TR_END);
        }
 
@@ -164,6 +171,9 @@ public:
                                dash = true;
                                tok.erase(0, 1); // Remove the dash.
                        }
+                       else if (tok[0] == '+')
+                               tok.erase(0, 1);
+
                        User* u = ServerInstance->FindNick(tok);
                        if ((!u) || (u->registered != REG_ALL) || (u->quitting) || (IS_SERVER(u)))
                                continue;
@@ -187,7 +197,7 @@ public:
                /* Even if callerid mode is not set, we let them manage their ACCEPT list so that if they go +g they can
                 * have a list already setup. */
 
-               std::string tok = parameters[0];
+               const std::string& tok = parameters[0];
 
                if (tok == "*")
                {
@@ -197,7 +207,12 @@ public:
                }
                else if (tok[0] == '-')
                {
-                       User* whotoremove = ServerInstance->FindNick(tok.substr(1));
+                       User* whotoremove;
+                       if (IS_LOCAL(user))
+                               whotoremove = ServerInstance->FindNickOnly(tok.substr(1));
+                       else
+                               whotoremove = ServerInstance->FindNick(tok.substr(1));
+
                        if (whotoremove)
                                return (RemoveAccept(user, whotoremove) ? CMD_SUCCESS : CMD_FAILURE);
                        else
@@ -205,7 +220,13 @@ public:
                }
                else
                {
-                       User* whotoadd = ServerInstance->FindNick(tok[0] == '+' ? tok.substr(1) : tok);
+                       const std::string target = (tok[0] == '+' ? tok.substr(1) : tok);
+                       User* whotoadd;
+                       if (IS_LOCAL(user))
+                               whotoadd = ServerInstance->FindNickOnly(target);
+                       else
+                               whotoadd = ServerInstance->FindNick(target);
+
                        if ((whotoadd) && (whotoadd->registered == REG_ALL) && (!whotoadd->quitting) && (!IS_SERVER(whotoadd)))
                                return (AddAccept(user, whotoadd) ? CMD_SUCCESS : CMD_FAILURE);
                        else
@@ -278,6 +299,7 @@ public:
                if (!dat2)
                {
                        // How the fuck is this possible.
+                       ServerInstance->Logs->Log("m_callerid", DEFAULT, "ERROR: Inconsistency detected in callerid state, please report (3)");
                        return false;
                }
 
@@ -285,6 +307,9 @@ public:
                if (it != dat2->wholistsme.end())
                        // Found me!
                        dat2->wholistsme.erase(it);
+               else
+                       ServerInstance->Logs->Log("m_callerid", DEFAULT, "ERROR: Inconsistency detected in callerid state, please report (4)");
+
 
                user->WriteServ("NOTICE %s :%s is no longer on your accept list", user->nick.c_str(), whotoremove->nick.c_str());
                return true;
@@ -322,6 +347,8 @@ private:
 
                        if (it2 != dat->accepting.end())
                                dat->accepting.erase(it2);
+                       else
+                               ServerInstance->Logs->Log("m_callerid", DEFAULT, "ERROR: Inconsistency detected in callerid state, please report (5)");
                }
 
                userdata->wholistsme.clear();
@@ -360,7 +387,7 @@ public:
 
        ModResult PreText(User* user, User* dest, std::string& text)
        {
-               if (!dest->IsModeSet('g'))
+               if (!dest->IsModeSet('g') || (user == dest))
                        return MOD_RES_PASSTHRU;
 
                if (operoverride && IS_OPER(user))