]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree/fjoin.cpp
Fix various rline bugs, implement /stats R, and fix the issue where you get no error...
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / fjoin.cpp
index dfe2fe13cf8c3c23ea6e2ee050e0f789e549e5d4..b891443ea1d1404a0606f83d1c2e3afe3c83e989 100644 (file)
@@ -60,7 +60,7 @@ bool TreeSocket::ForceJoin(const std::string &source, std::deque<std::string> &p
        if (params.size() < 3)
                return true;
 
-       irc::modestacker modestack(true);                               /* Modes to apply from the users in the user list */
+       irc::modestacker modestack(Instance, true);                     /* Modes to apply from the users in the user list */
        User* who = NULL;                                               /* User we are currently checking */
        std::string channel = params[0];                                /* Channel name, as a string */
        time_t TS = atoi(params[1].c_str());                            /* Timestamp given to us for remote side */
@@ -73,7 +73,7 @@ bool TreeSocket::ForceJoin(const std::string &source, std::deque<std::string> &p
 
        if (params.size() > 3)
                params[params.size() - 1] = ":" + params[params.size() - 1];
-               
+
        Utils->DoOneToAllButSender(source,"FJOIN",params,source);
 
        if (!TS)
@@ -95,7 +95,7 @@ bool TreeSocket::ForceJoin(const std::string &source, std::deque<std::string> &p
        {
                std::deque<std::string> param_list;
                if (Utils->AnnounceTSChange && chan)
-                       chan->WriteChannelWithServ(Instance->Config->ServerName, "NOTICE %s :TS for %s changed from %lu to %lu", chan->name, chan->name, (unsigned long) ourTS, (unsigned long) TS);
+                       chan->WriteChannelWithServ(Instance->Config->ServerName, "NOTICE %s :TS for %s changed from %lu to %lu", chan->name.c_str(), chan->name.c_str(), (unsigned long) ourTS, (unsigned long) TS);
                ourTS = TS;
                if (!created)
                {
@@ -109,20 +109,18 @@ bool TreeSocket::ForceJoin(const std::string &source, std::deque<std::string> &p
        if (apply_other_sides_modes)
        {
                unsigned int idx = 2;
-               int numpara = 1;
-               const char* modelist[64];
-               memset(&modelist,0,sizeof(modelist));
+               std::vector<std::string> modelist;
 
                // Mode parser needs to know what channel to act on.
-               modelist[0] = params[0].c_str();
+               modelist.push_back(params[0]);
 
                /* Remember, params[params.size() - 1] is nicklist, and we don't want to apply *that* */
                for (idx = 2; idx != (params.size() - 1); idx++)
                {
-                       modelist[numpara++] = params[idx].c_str();
+                       modelist.push_back(params[idx]);
                }
 
-               this->Instance->SendMode(modelist, numpara, this->Instance->FakeClient);
+               this->Instance->SendMode(modelist, this->Instance->FakeClient);
        }
 
        /* Now, process every 'modes,nick' pair */
@@ -143,7 +141,7 @@ bool TreeSocket::ForceJoin(const std::string &source, std::deque<std::string> &p
                                        modes += *unparsedmodes;
                                else
                                {
-                                       this->SendError(std::string("Invalid prefix '")+(*unparsedmodes)+"' in FJOIN");
+                                       this->SendError(std::string("Unknown status mode '")+(*unparsedmodes)+"' in FJOIN");
                                        return false;
                                }
 
@@ -153,7 +151,7 @@ bool TreeSocket::ForceJoin(const std::string &source, std::deque<std::string> &p
 
                        /* Advance past the comma, to the nick */
                        usr++;
-                       
+
                        /* Check the user actually exists */
                        who = this->Instance->FindUUID(usr);
                        if (who)
@@ -171,7 +169,7 @@ bool TreeSocket::ForceJoin(const std::string &source, std::deque<std::string> &p
                        }
                        else
                        {
-                               Instance->Logs->Log("m_spanningtree",SPARSE,"Warning! Invalid user %s in FJOIN to channel %s IGNORED", usr, channel.c_str());
+                               Instance->Logs->Log("m_spanningtree",SPARSE, "Ignored nonexistant user %s in fjoin to %s (probably quit?)", usr, channel.c_str());
                                continue;
                        }
                }
@@ -181,16 +179,16 @@ bool TreeSocket::ForceJoin(const std::string &source, std::deque<std::string> &p
        if (apply_other_sides_modes)
        {
                std::deque<std::string> stackresult;
-               const char* mode_junk[MAXMODES+2];
-               mode_junk[0] = channel.c_str();
+               std::vector<std::string> mode_junk;
+               mode_junk.push_back(channel);
 
                while (modestack.GetStackedLine(stackresult))
                {
                        for (size_t j = 0; j < stackresult.size(); j++)
                        {
-                               mode_junk[j+1] = stackresult[j].c_str();
+                               mode_junk.push_back(stackresult[j]);
                        }
-                       Instance->SendMode(mode_junk, stackresult.size() + 1, Instance->FakeClient);
+                       Instance->SendMode(mode_junk, Instance->FakeClient);
                }
        }
 
@@ -208,10 +206,10 @@ bool TreeSocket::RemoveStatus(const std::string &prefix, std::deque<std::string>
 
        if (c)
        {
-               irc::modestacker stack(false);
+               irc::modestacker stack(Instance, false);
                std::deque<std::string> stackresult;
-               const char* mode_junk[MAXMODES+2];
-               mode_junk[0] = c->name;
+               std::vector<std::string> mode_junk;
+               mode_junk.push_back(c->name);
 
                for (char modeletter = 'A'; modeletter <= 'z'; ++modeletter)
                {
@@ -228,11 +226,11 @@ bool TreeSocket::RemoveStatus(const std::string &prefix, std::deque<std::string>
                while (stack.GetStackedLine(stackresult))
                {
                        for (size_t j = 0; j < stackresult.size(); j++)
-                               mode_junk[j+1] = stackresult[j].c_str();
+                               mode_junk.push_back(stackresult[j]);
 
-                       Instance->SendMode(mode_junk, stackresult.size() + 1, Instance->FakeClient);
+                       Instance->SendMode(mode_junk, Instance->FakeClient);
                }
        }
        return true;
 }
+