]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_callerid.cpp
fix some unitialised vectors and tidy up a bit.
[user/henk/code/inspircd.git] / src / modules / m_callerid.cpp
index 6098ff9e9a8d8aae8c1ca928312883fecd7b807d..2a349fdb0f8adc2d926e0e86fd3fef432dbb5c9b 100644 (file)
@@ -7,7 +7,7 @@
 
 /* $ModDesc: Implementation of callerid (umode +g & /accept, ala hybrid etc) */
 
-class callerid_data
+class callerid_data : public classbase
 {
  public:
        time_t lastnotify;
@@ -48,33 +48,23 @@ void RemoveData(User* who)
 
 void RemoveFromAllAccepts(InspIRCd* ServerInstance, User* who)
 {
-       for (user_hash::iterator i = ServerInstance->clientlist->begin(); i != ServerInstance->clientlist->end(); ++i)
+       for (user_hash::iterator i = ServerInstance->Users->clientlist->begin(); i != ServerInstance->Users->clientlist->end(); ++i)
        {
                callerid_data* dat = GetData(i->second, false);
                if (!dat) continue;
                std::set<User*>& accepting = dat->accepting;
-               std::set<User*>::iterator i = accepting.find(who);
-               if (i == accepting.end()) continue;
-               accepting.erase(i);
+               std::set<User*>::iterator iter = accepting.find(who);
+               if (iter == accepting.end()) continue;
+               accepting.erase(iter);
        }
 }
 
-class User_g : public ModeHandler
+class User_g : public SimpleUserModeHandler
 {
 private:
 
 public:
-       User_g(InspIRCd* Instance) : ModeHandler(Instance, 'g', 0, 0, false, MODETYPE_USER, false) { }
-
-       ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding)
-       {
-               if (adding != dest->IsModeSet('g'))
-               {
-                       dest->SetMode('g', adding);
-                       return MODEACTION_ALLOW;
-               }
-               return MODEACTION_DENY;
-       }
+       User_g(InspIRCd* Instance) : SimpleUserModeHandler(Instance, 'g') { }
 };
 
 class CommandAccept : public Command
@@ -93,9 +83,10 @@ public:
         * /accept nick1,nick2,nick3 *
         * to add 3 nicks and then show your list
         */
-       CmdResult Handle(const char** parameters, int pcnt, User* user)
+
+       CmdResult Handle(const std::vector<std::string> &parameters, User* user)
        {
-               if (pcnt < 1)
+               if (parameters.size() < 1)
                {
                        /* Command stuff should've dealt with this already */
                        return CMD_FAILURE;
@@ -103,9 +94,9 @@ 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. */
                bool atleastonechange = false;
-               for (int i = 0; i < pcnt; ++i)
+               for (int i = 0; i < (int)parameters.size(); ++i)
                {
-                       const char* arg = parameters[i];
+                       const char* arg = parameters[i].c_str();
                        irc::commasepstream css(arg);
                        std::string tok;
                        while (css.GetToken(tok))
@@ -134,7 +125,7 @@ public:
                                        }
                                        else
                                        {
-                                               user->WriteServ("401 %s %s :No such nick/channel", user->nick, tok.c_str());
+                                               user->WriteNumeric(401, "%s %s :No such nick/channel", user->nick, tok.c_str());
                                        }
                                }
                        }
@@ -149,10 +140,10 @@ public:
                {
                        for (std::set<User*>::iterator i = dat->accepting.begin(); i != dat->accepting.end(); ++i)
                        {
-                               user->WriteServ("281 %s %s", user->nick, (*i)->nick);
+                               user->WriteNumeric(281, "%s %s", user->nick, (*i)->nick);
                        }
                }
-               user->WriteServ("282 %s :End of ACCEPT list", user->nick);
+               user->WriteNumeric(282, "%s :End of ACCEPT list", user->nick);
        }
 
        bool AddAccept(User* user, User* whotoadd, bool quiet)
@@ -161,12 +152,12 @@ public:
                std::set<User*>& accepting = dat->accepting;
                if (accepting.size() >= maxaccepts)
                {
-                       if (!quiet) user->WriteServ("456 %s :Accept list is full (limit is %d)", user->nick, maxaccepts);
+                       if (!quiet) user->WriteNumeric(456, "%s :Accept list is full (limit is %d)", user->nick, maxaccepts);
                        return false;
                }
                if (!accepting.insert(whotoadd).second)
                {
-                       if (!quiet) user->WriteServ("457 %s %s :is already on your accept list", user->nick, whotoadd->nick);
+                       if (!quiet) user->WriteNumeric(457, "%s %s :is already on your accept list", user->nick, whotoadd->nick);
                        return false;
                }
                return true;
@@ -177,14 +168,14 @@ public:
                callerid_data* dat = GetData(user, false);
                if (!dat)
                {
-                       if (!quiet) user->WriteServ("458 %s %s :is not on your accept list", user->nick, whotoremove->nick);
+                       if (!quiet) user->WriteNumeric(458, "%s %s :is not on your accept list", user->nick, whotoremove->nick);
                        return false;
                }
                std::set<User*>& accepting = dat->accepting;
                std::set<User*>::iterator i = accepting.find(whotoremove);
                if (i == accepting.end())
                {
-                       if (!quiet) user->WriteServ("458 %s %s :is not on your accept list", user->nick, whotoremove->nick);
+                       if (!quiet) user->WriteNumeric(458, "%s %s :is not on your accept list", user->nick, whotoremove->nick);
                        return false;
                }
                accepting.erase(i);
@@ -222,13 +213,13 @@ public:
                        delete myumode;
                        throw new ModuleException("Could not add usermode and command!");
                }
-               Implementation eventlist[] = { I_OnRehash, I_OnUserPreNick, I_OnUserQuit, I_On005Numeric, I_OnUserPreNotice, I_OnUserPreMessage };
-               ServerInstance->Modules->Attach(eventlist, this, 6);
+               Implementation eventlist[] = { I_OnRehash, I_OnUserPreNick, I_OnUserQuit, I_On005Numeric, I_OnUserPreNotice, I_OnUserPreMessage, I_OnCleanup };
+               ServerInstance->Modules->Attach(eventlist, this, 7);
        }
 
        ~ModuleCallerID()
        {
-               delete mycommand;
+               delete myumode;
        }
 
        Version GetVersion()
@@ -253,11 +244,11 @@ public:
                {
                        time_t now = time(NULL);
                        /* +g and *not* accepted */
-                       user->WriteServ("716 %s %s :is in +g mode (server-side ignore).", user->nick, dest->nick);
+                       user->WriteNumeric(716, "%s %s :is in +g mode (server-side ignore).", user->nick, dest->nick);
                        if (now > (lastnotify + (time_t)notify_cooldown))
                        {
-                               user->WriteServ("717 %s %s :has been informed that you messaged them.", user->nick, dest->nick);
-                               dest->WriteServ("718 %s %s %s@%s :is messaging you, and you have umode +g", dest->nick, user->nick, user->ident, user->dhost);
+                               user->WriteNumeric(717, "%s %s :has been informed that you messaged them.", user->nick, dest->nick);
+                               dest->WriteNumeric(718, "%s %s %s@%s :is messaging you, and you have umode +g", dest->nick, user->nick, user->ident, user->dhost);
                                lastnotify = now;
                        }
                        return 1;
@@ -279,6 +270,14 @@ public:
                return 0;
        }
 
+       void OnCleanup(int type, void* item)
+       {
+               if (type != TYPE_USER) return;
+               User* u = (User*)item;
+               /* Cleanup only happens on unload (before dtor), so keep this O(n) instead of O(n^2) which deferring to OnUserQuit would do.  */
+               RemoveData(u);
+       }
+
        int OnUserPreNick(User* user, const std::string& newnick)
        {
                if (!tracknick)
@@ -305,10 +304,10 @@ public:
                                new_maxaccepts = 16;
                                break;
                        case CONF_NOT_A_NUMBER:
-                               if (user) user->WriteServ("NOTICE %s :Invalid maxaccepts value '%s', not a number", Conf.ReadValue("callerid", "maxaccepts", "", 0).c_str());
+                               if (user) user->WriteServ("NOTICE %s :Invalid maxaccepts value '%s', not a number", user->nick, Conf.ReadValue("callerid", "maxaccepts", "", 0).c_str());
                                throw ModuleException("Invalid maxaccepts value, not a number");
                        case CONF_INT_NEGATIVE:
-                               if (user) user->WriteServ("NOTICE %s :Invalid maxaccepts value '%s', negative", Conf.ReadValue("callerid", "maxaccepts", "", 0).c_str());
+                               if (user) user->WriteServ("NOTICE %s :Invalid maxaccepts value '%s', negative", user->nick, Conf.ReadValue("callerid", "maxaccepts", "", 0).c_str());
                                throw ModuleException("Invalid maxaccepts value, negative");
                        default:
                                /* Yikes */
@@ -326,14 +325,14 @@ public:
                                new_cooldown = 16;
                                break;
                        case CONF_NOT_A_NUMBER:
-                               if (user) user->WriteServ("NOTICE %s :Invalid cooldown value '%s', not a number", Conf.ReadValue("callerid", "maxaccepts", "", 0).c_str());
+                               if (user) user->WriteServ("NOTICE %s :Invalid cooldown value '%s', not a number", user->nick, Conf.ReadValue("callerid", "maxaccepts", "", 0).c_str());
                                throw ModuleException("Invalid cooldown value, not a number");
                        case CONF_INT_NEGATIVE:
-                               if (user) user->WriteServ("NOTICE %s :Invalid cooldown value '%s', negative", Conf.ReadValue("callerid", "maxaccepts", "", 0).c_str());
+                               if (user) user->WriteServ("NOTICE %s :Invalid cooldown value '%s', negative", user->nick, Conf.ReadValue("callerid", "maxaccepts", "", 0).c_str());
                                throw ModuleException("Invalid cooldown value, negative");
                        default:
                                /* Yikes */
-                               throw ModuleException("Invalid maxaccepts value, unknown config error");
+                               throw ModuleException("Invalid cooldown value, unknown config error");
                }
                maxaccepts = new_maxaccepts;
                notify_cooldown = new_cooldown;