]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/mode.cpp
Module API changes to use Membership* where sensible
[user/henk/code/inspircd.git] / src / mode.cpp
index 38f7835fccbd5de48ae08df89fb6782cc687e419..c760df3f5c93f9940cce104feb9cba81c0c0b863 100644 (file)
@@ -248,66 +248,6 @@ User* ModeParser::SanityChecks(User *user, const char *dest, Channel *chan, int)
        return d;
 }
 
-const char* ModeParser::Grant(User *d,Channel *chan,int MASK)
-{
-       if (!chan)
-               return "";
-
-       UCListIter n = d->chans.find(chan);
-       if (n != d->chans.end())
-       {
-               if (n->second & MASK)
-               {
-                       return "";
-               }
-               n->second = n->second | MASK;
-               switch (MASK)
-               {
-                       case UCMODE_OP:
-                               n->first->AddOppedUser(d);
-                       break;
-                       case UCMODE_HOP:
-                               n->first->AddHalfoppedUser(d);
-                       break;
-                       case UCMODE_VOICE:
-                               n->first->AddVoicedUser(d);
-                       break;
-               }
-               return d->nick.c_str();
-       }
-       return "";
-}
-
-const char* ModeParser::Revoke(User *d,Channel *chan,int MASK)
-{
-       if (!chan)
-               return "";
-
-       UCListIter n = d->chans.find(chan);
-       if (n != d->chans.end())
-       {
-               if ((n->second & MASK) == 0)
-               {
-                       return "";
-               }
-               n->second ^= MASK;
-               switch (MASK)
-               {
-                       case UCMODE_OP:
-                               n->first->DelOppedUser(d);
-                       break;
-                       case UCMODE_HOP:
-                               n->first->DelHalfoppedUser(d);
-                       break;
-                       case UCMODE_VOICE:
-                               n->first->DelVoicedUser(d);
-                       break;
-               }
-               return d->nick.c_str();
-       }
-       return "";
-}
-
 void ModeParser::DisplayCurrentModes(User *user, User* targetuser, Channel* targetchannel, const char* text)
 {
        if (targetchannel)
@@ -319,12 +259,6 @@ void ModeParser::DisplayCurrentModes(User *user, User* targetuser, Channel* targ
        }
        else
        {
-               if (targetuser->Visibility && !targetuser->Visibility->VisibleTo(user))
-               {
-                       user->WriteNumeric(ERR_NOSUCHNICK, "%s %s :No such nick/channel",user->nick.c_str(), text);
-                       return;
-               }
-
                if (targetuser == user || user->HasPrivPermission("users/auspex"))
                {
                        /* Display user's current mode string */
@@ -335,7 +269,7 @@ void ModeParser::DisplayCurrentModes(User *user, User* targetuser, Channel* targ
                }
                else
                {
-                       user->WriteNumeric(ERR_USERSDONTMATCH, "%s :Can't change mode for other users", user->nick.c_str());
+                       user->WriteNumeric(ERR_USERSDONTMATCH, "%s :Can't view modes for other users", user->nick.c_str());
                        return;
                }
        }
@@ -380,10 +314,8 @@ ModeAction ModeParser::TryMode(User* user, User* targetuser, Channel* chan, bool
                         * in NAMES(X) are not in rank order, we know the most powerful mode is listed
                         * first, so we don't need to iterate, we just look up the first instead.
                         */
-                       std::string modestring = chan->GetAllPrefixChars(user);
-                       char ml = (modestring.empty() ? '\0' : modestring[0]);
-                       ModeHandler* ourmode = FindPrefix(ml);
-                       if (!ourmode || ourmode->GetPrefixRank() < neededrank)
+                       unsigned int ourrank = chan->GetPrefixValue(user);
+                       if (ourrank < neededrank)
                        {
                                /* Bog off */
                                user->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :You must have channel privilege %c or above to %sset channel mode %c",
@@ -442,11 +374,11 @@ ModeAction ModeParser::TryMode(User* user, User* targetuser, Channel* chan, bool
 
        mh->ChangeCount(adding ? 1 : -1);
 
-       if (mh->GetPrefix() && chan)
+       if (mh->GetPrefixRank() && chan)
        {
                User* user_to_prefix = ServerInstance->FindNick(parameter);
                if (user_to_prefix)
-                       chan->SetPrefix(user_to_prefix, mh->GetPrefix(), mh->GetPrefixRank(), adding);
+                       chan->SetPrefix(user_to_prefix, modechar, mh->GetPrefixRank(), adding);
        }
 
        for (ModeWatchIter watchers = modewatchers[handler_id].begin(); watchers != modewatchers[handler_id].end(); watchers++)
@@ -485,27 +417,26 @@ void ModeParser::Process(const std::vector<std::string>& parameters, User *user,
        {
                SkipAccessChecks = true;
        }
-       else if (targetchannel)
+       else
        {
                /* Overall access control hook for mode change */
+               int hook = targetchannel ? AC_GENERAL_MODE : AC_GENERAL_UMODE;
+
                LastParse = mode_sequence;
                ModResult MOD_RESULT;
-               FIRST_MOD_RESULT(ServerInstance, OnAccessCheck, MOD_RESULT, (user, NULL, targetchannel, AC_GENERAL_MODE));
+               FIRST_MOD_RESULT(ServerInstance, OnAccessCheck, MOD_RESULT, (user, targetuser, targetchannel, hook));
                LastParse.clear();
                if (MOD_RESULT == MOD_RES_DENY)
                        return;
                SkipAccessChecks = (MOD_RESULT == MOD_RES_ALLOW);
        }
-       else
+
+       if (targetuser && !SkipAccessChecks && user != targetuser)
        {
-               if (user != targetuser)
-               {
-                       user->WriteNumeric(ERR_USERSDONTMATCH, "%s :Can't change mode for other users", user->nick.c_str());
-                       return;
-               }
+               user->WriteNumeric(ERR_USERSDONTMATCH, "%s :Can't change mode for other users", user->nick.c_str());
+               return;
        }
 
-
        std::string output_mode;
        std::ostringstream output_parameters;
        LastParseParams.push_back(output_mode);
@@ -642,7 +573,7 @@ void ModeParser::DisplayListModes(User* user, Channel* chan, std::string &mode_s
                        continue;
 
                bool display = true;
-               if (!user->HasPrivPermission("channels/auspex") && ServerInstance->Config->HideModeLists[mletter] && (chan->GetStatus(user) < STATUS_HOP))
+               if (!user->HasPrivPermission("channels/auspex") && ServerInstance->Config->HideModeLists[mletter] && (chan->GetPrefixValue(user) < HALFOP_VALUE))
                {
                        user->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :Only half-operators and above may view the +%c list",
                                user->nick.c_str(), chan->name.c_str(), mletter);
@@ -932,17 +863,11 @@ std::string ModeParser::GiveModeList(ModeMasks m)
        return type1 + "," + type2 + "," + type3 + "," + type4;
 }
 
-bool ModeParser::PrefixComparison(prefixtype one, prefixtype two)
-{
-       return one.second > two.second;
-}
-
 std::string ModeParser::BuildPrefixes()
 {
        std::string mletters;
        std::string mprefixes;
-       pfxcontainer pfx;
-       std::map<char,char> prefix_to_mode;
+       std::map<int,std::pair<char,char> > prefixes;
 
        for (unsigned char mode = 'A'; mode <= 'z'; mode++)
        {
@@ -950,17 +875,15 @@ std::string ModeParser::BuildPrefixes()
 
                if ((modehandlers[pos]) && (modehandlers[pos]->GetPrefix()))
                {
-                       pfx.push_back(std::make_pair<char,unsigned int>(modehandlers[pos]->GetPrefix(), modehandlers[pos]->GetPrefixRank()));
-                       prefix_to_mode[modehandlers[pos]->GetPrefix()] = modehandlers[pos]->GetModeChar();
+                       prefixes[modehandlers[pos]->GetPrefixRank()] = std::make_pair(
+                               modehandlers[pos]->GetPrefix(), modehandlers[pos]->GetModeChar());
                }
        }
 
-       sort(pfx.begin(), pfx.end(), ModeParser::PrefixComparison);
-
-       for (pfxcontainer::iterator n = pfx.begin(); n != pfx.end(); n++)
+       for(std::map<int,std::pair<char,char> >::reverse_iterator n = prefixes.rbegin(); n != prefixes.rend(); n++)
        {
-               mletters = mletters + n->first;
-               mprefixes = mprefixes + prefix_to_mode.find(n->first)->second;
+               mletters = mletters + n->second.first;
+               mprefixes = mprefixes + n->second.second;
        }
 
        return "(" + mprefixes + ")" + mletters;