]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/mode.cpp
Rewrite invite system
[user/henk/code/inspircd.git] / src / mode.cpp
index 5642e35b67e829bc7cc2edaee6c775ff21be7a94..671b5d85456ddd44ec294a049c20d998e40c120b 100644 (file)
@@ -152,36 +152,6 @@ void ModeWatcher::AfterMode(User*, User*, Channel*, const std::string&, bool)
 {
 }
 
-void ModeParser::DisplayCurrentModes(User* user, User* targetuser, Channel* targetchannel)
-{
-       if (targetchannel)
-       {
-               /* Display channel's current mode string */
-               user->WriteNumeric(RPL_CHANNELMODEIS, "%s +%s", targetchannel->name.c_str(), targetchannel->ChanModes(targetchannel->HasUser(user)));
-               user->WriteNumeric(RPL_CHANNELCREATED, "%s %lu", targetchannel->name.c_str(), (unsigned long)targetchannel->age);
-               return;
-       }
-       else
-       {
-               if (targetuser == user || user->HasPrivPermission("users/auspex"))
-               {
-                       /* Display user's current mode string */
-                       user->WriteNumeric(RPL_UMODEIS, ":+%s", targetuser->FormatModes());
-                       if ((targetuser->IsOper()))
-                       {
-                               ModeHandler* snomask = FindMode('s', MODETYPE_USER);
-                               user->WriteNumeric(RPL_SNOMASKIS, "%s :Server notice mask", snomask->GetUserParameter(user).c_str());
-                       }
-                       return;
-               }
-               else
-               {
-                       user->WriteNumeric(ERR_USERSDONTMATCH, ":Can't view modes for other users");
-                       return;
-               }
-       }
-}
-
 PrefixMode::PrefixMode(Module* Creator, const std::string& Name, char ModeLetter, unsigned int Rank, char PrefixChar)
        : ModeHandler(Creator, Name, ModeLetter, PARAM_ALWAYS, MODETYPE_CHANNEL, MC_PREFIX)
        , prefix(PrefixChar), prefixrank(Rank)
@@ -248,7 +218,7 @@ ModeAction ModeParser::TryMode(User* user, User* targetuser, Channel* chan, Mode
        std::string& parameter = mcitem.param;
        // crop mode parameter size to 250 characters
        if (parameter.length() > 250 && adding)
-               parameter = parameter.substr(0, 250);
+               parameter.erase(250);
 
        ModResult MOD_RESULT;
        FIRST_MOD_RESULT(OnRawMode, MOD_RESULT, (user, chan, mh, parameter, adding));
@@ -298,8 +268,8 @@ ModeAction ModeParser::TryMode(User* user, User* targetuser, Channel* chan, Mode
        }
 
        // Ask mode watchers whether this mode change is OK
-       std::pair<ModeWatchIter, ModeWatchIter> itpair = modewatchermap.equal_range(mh->name);
-       for (ModeWatchIter i = itpair.first; i != itpair.second; ++i)
+       std::pair<ModeWatcherMap::iterator, ModeWatcherMap::iterator> itpair = modewatchermap.equal_range(mh->name);
+       for (ModeWatcherMap::iterator i = itpair.first; i != itpair.second; ++i)
        {
                ModeWatcher* mw = i->second;
                if (mw->GetModeType() == type)
@@ -350,7 +320,7 @@ ModeAction ModeParser::TryMode(User* user, User* targetuser, Channel* chan, Mode
                return ma;
 
        itpair = modewatchermap.equal_range(mh->name);
-       for (ModeWatchIter i = itpair.first; i != itpair.second; ++i)
+       for (ModeWatcherMap::iterator i = itpair.first; i != itpair.second; ++i)
        {
                ModeWatcher* mw = i->second;
                if (mw->GetModeType() == type)
@@ -360,71 +330,6 @@ ModeAction ModeParser::TryMode(User* user, User* targetuser, Channel* chan, Mode
        return MODEACTION_ALLOW;
 }
 
-void ModeParser::Process(const std::vector<std::string>& parameters, User* user, ModeProcessFlag flags)
-{
-       const std::string& target = parameters[0];
-       Channel* targetchannel = ServerInstance->FindChan(target);
-       User* targetuser = NULL;
-       if (!targetchannel)
-       {
-               if (IS_LOCAL(user))
-                       targetuser = ServerInstance->FindNickOnly(target);
-               else
-                       targetuser = ServerInstance->FindNick(target);
-       }
-       ModeType type = targetchannel ? MODETYPE_CHANNEL : MODETYPE_USER;
-
-       LastParse.clear();
-       LastChangeList.clear();
-
-       if ((!targetchannel) && ((!targetuser) || (IS_SERVER(targetuser))))
-       {
-               user->WriteNumeric(ERR_NOSUCHNICK, "%s :No such nick/channel", target.c_str());
-               return;
-       }
-       if (parameters.size() == 1)
-       {
-               this->DisplayCurrentModes(user, targetuser, targetchannel);
-               return;
-       }
-
-       // Populate a temporary Modes::ChangeList with the parameters
-       Modes::ChangeList changelist;
-       ModeParamsToChangeList(user, type, parameters, changelist);
-
-       ModResult MOD_RESULT;
-       FIRST_MOD_RESULT(OnPreMode, MOD_RESULT, (user, targetuser, targetchannel, changelist));
-
-       if (IS_LOCAL(user))
-       {
-               if (MOD_RESULT == MOD_RES_PASSTHRU)
-               {
-                       if ((targetuser) && (user != targetuser))
-                       {
-                               // Local users may only change the modes of other users if a module explicitly allows it
-                               user->WriteNumeric(ERR_USERSDONTMATCH, ":Can't change mode for other users");
-                               return;
-                       }
-
-                       // This is a mode change by a local user and modules didn't explicitly allow/deny.
-                       // Ensure access checks will happen for each mode being changed.
-                       flags |= MODE_CHECKACCESS;
-               }
-               else if (MOD_RESULT == MOD_RES_DENY)
-                       return; // Entire mode change denied by a module
-       }
-
-       ProcessSingle(user, targetchannel, targetuser, changelist, flags);
-
-       if ((LastParse.empty()) && (targetchannel) && (parameters.size() == 2))
-       {
-               /* Special case for displaying the list for listmodes,
-                * e.g. MODE #chan b, or MODE #chan +b without a parameter
-                */
-               this->DisplayListModes(user, targetchannel, parameters[1]);
-       }
-}
-
 void ModeParser::ModeParamsToChangeList(User* user, ModeType type, const std::vector<std::string>& parameters, Modes::ChangeList& changelist, unsigned int beginindex, unsigned int endindex)
 {
        if (endindex > parameters.size())
@@ -580,33 +485,6 @@ unsigned int ModeParser::ProcessSingle(User* user, Channel* targetchannel, User*
        return modes_processed;
 }
 
-void ModeParser::DisplayListModes(User* user, Channel* chan, const std::string& mode_sequence)
-{
-       seq++;
-
-       for (std::string::const_iterator letter = mode_sequence.begin(); letter != mode_sequence.end(); letter++)
-       {
-               unsigned char mletter = *letter;
-               if (mletter == '+')
-                       continue;
-
-               /* Ensure the user doesnt request the same mode twice,
-                * so they cant flood themselves off out of idiocy.
-                */
-               if (sent[mletter] == seq)
-                       continue;
-
-               sent[mletter] = seq;
-
-               ModeHandler *mh = this->FindMode(mletter, MODETYPE_CHANNEL);
-
-               if (!mh || !mh->IsListMode())
-                       return;
-
-               ShowListModeList(user, chan, mh);
-       }
-}
-
 void ModeParser::ShowListModeList(User* user, Channel* chan, ModeHandler* mh)
 {
        {
@@ -615,18 +493,11 @@ void ModeParser::ShowListModeList(User* user, Channel* chan, ModeHandler* mh)
                if (MOD_RESULT == MOD_RES_DENY)
                        return;
 
-               unsigned char mletter = mh->GetModeChar();
                bool display = true;
-               if (!user->HasPrivPermission("channels/auspex") && ServerInstance->Config->HideModeLists[mletter] && (chan->GetPrefixValue(user) < HALFOP_VALUE))
-               {
-                       user->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s :You do not have access to view the +%c list",
-                               chan->name.c_str(), mletter);
-                       display = false;
-               }
 
                // Ask mode watchers whether it's OK to show the list
-               std::pair<ModeWatchIter, ModeWatchIter> itpair = modewatchermap.equal_range(mh->name);
-               for (ModeWatchIter i = itpair.first; i != itpair.second; ++i)
+               std::pair<ModeWatcherMap::iterator, ModeWatcherMap::iterator> itpair = modewatchermap.equal_range(mh->name);
+               for (ModeWatcherMap::iterator i = itpair.first; i != itpair.second; ++i)
                {
                        ModeWatcher* mw = i->second;
                        if (mw->GetModeType() == MODETYPE_CHANNEL)
@@ -919,7 +790,7 @@ std::string ModeParser::BuildPrefixes(bool lettersAndModes)
 {
        std::string mletters;
        std::string mprefixes;
-       std::map<int,std::pair<char,char> > prefixes;
+       insp::flat_map<int, std::pair<char, char> > prefixes;
 
        const PrefixModeList& list = GetPrefixModes();
        for (PrefixModeList::const_iterator i = list.begin(); i != list.end(); ++i)
@@ -929,7 +800,7 @@ std::string ModeParser::BuildPrefixes(bool lettersAndModes)
                        prefixes[pm->GetPrefixRank()] = std::make_pair(pm->GetPrefix(), pm->GetModeChar());
        }
 
-       for(std::map<int,std::pair<char,char> >::reverse_iterator n = prefixes.rbegin(); n != prefixes.rend(); n++)
+       for (insp::flat_map<int, std::pair<char, char> >::reverse_iterator n = prefixes.rbegin(); n != prefixes.rend(); ++n)
        {
                mletters = mletters + n->second.first;
                mprefixes = mprefixes + n->second.second;
@@ -945,8 +816,8 @@ void ModeParser::AddModeWatcher(ModeWatcher* mw)
 
 bool ModeParser::DelModeWatcher(ModeWatcher* mw)
 {
-       std::pair<ModeWatchIter, ModeWatchIter> itpair = modewatchermap.equal_range(mw->GetModeName());
-       for (ModeWatchIter i = itpair.first; i != itpair.second; ++i)
+       std::pair<ModeWatcherMap::iterator, ModeWatcherMap::iterator> itpair = modewatchermap.equal_range(mw->GetModeName());
+       for (ModeWatcherMap::iterator i = itpair.first; i != itpair.second; ++i)
        {
                if (i->second == mw)
                {
@@ -1043,9 +914,6 @@ ModeParser::ModeParser()
        /* Clear mode handler list */
        memset(modehandlers, 0, sizeof(modehandlers));
        memset(modehandlersbyid, 0, sizeof(modehandlersbyid));
-
-       seq = 0;
-       memset(&sent, 0, sizeof(sent));
 }
 
 ModeParser::~ModeParser()