]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/mode.cpp
Fix modules/extra symlinks when calculating dependencies
[user/henk/code/inspircd.git] / src / mode.cpp
index 86438bf733fce705c18b9933e1d3546fbb563c91..965619eea490dad84b951d91cbf7bf23145a6e2c 100644 (file)
@@ -49,8 +49,6 @@
 /* +s (server notice masks) */
 #include "modes/umode_s.h"
 
-InspIRCd* ModeHandler::ServerInstance;
-
 ModeHandler::ModeHandler(Module* Creator, char modeletter, ParamSpec Params, ModeType type)
        : mode(modeletter), parameters_taken(Params), list(false), m_type(type), m_paramtype(TR_TEXT),
        oper(false), prefix(0), count(0), levelrequired(HALFOP_VALUE), creator(Creator)
@@ -106,6 +104,11 @@ std::string ModeHandler::GetUserParameter(User* user)
        return "";
 }
 
+ModResult ModeHandler::AccessCheck(User*, Channel*, std::string &, bool)
+{
+       return MOD_RES_PASSTHRU;
+}
+
 ModeAction ModeHandler::OnModeChange(User*, User*, Channel*, std::string&, bool)
 {
        return MODEACTION_DENY;
@@ -135,7 +138,7 @@ void ModeHandler::OnParameterMissing(User* user, User* dest, Channel* channel)
 {
 }
 
-bool ModeHandler::CheckTimeStamp(std::string& theirs, const std::string& ours, Channel*)
+bool ModeHandler::ResolveModeConflict(std::string& theirs, const std::string& ours, Channel*)
 {
        return (theirs < ours);
 }
@@ -185,7 +188,7 @@ ModeAction SimpleChannelModeHandler::OnModeChange(User* source, User* dest, Chan
        return MODEACTION_DENY;
 }
 
-ModeWatcher::ModeWatcher(InspIRCd* Instance, char modeletter, ModeType type) : ServerInstance(Instance), mode(modeletter), m_type(type)
+ModeWatcher::ModeWatcher(char modeletter, ModeType type) : mode(modeletter), m_type(type)
 {
 }
 
@@ -265,28 +268,35 @@ ModeAction ModeParser::TryMode(User* user, User* targetuser, Channel* chan, bool
        int pcnt = mh->GetNumParams(adding);
 
        ModResult MOD_RESULT;
-       FIRST_MOD_RESULT(ServerInstance, OnRawMode, MOD_RESULT, (user, chan, modechar, parameter, adding, pcnt));
+       FIRST_MOD_RESULT(OnRawMode, MOD_RESULT, (user, chan, modechar, parameter, adding, pcnt));
 
        if (IS_LOCAL(user) && (MOD_RESULT == MOD_RES_DENY))
                return MODEACTION_DENY;
 
        if (chan && !SkipACL && (MOD_RESULT != MOD_RES_ALLOW))
        {
-               unsigned int neededrank = mh->GetLevelRequired();
-               /* Compare our rank on the channel against the rank of the required prefix,
-                * allow if >= ours. Because mIRC and xchat throw a tizz if the modes shown
-                * 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.
-                */
-               unsigned int ourrank = chan->GetPrefixValue(user);
-               if (ourrank < neededrank)
-               {
-                       /* Bog off */
-                       // TODO replace with a real search for the proper prefix
-                       char needed = neededrank > HALFOP_VALUE ? '@' : '%';
-                       user->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :You must have channel privilege %c or above to %sset channel mode %c",
-                                       user->nick.c_str(), chan->name.c_str(), needed, adding ? "" : "un", modechar);
+               MOD_RESULT = mh->AccessCheck(user, chan, parameter, adding);
+
+               if (MOD_RESULT == MOD_RES_DENY)
                        return MODEACTION_DENY;
+               if (MOD_RESULT == MOD_RES_PASSTHRU)
+               {
+                       unsigned int neededrank = mh->GetLevelRequired();
+                       /* Compare our rank on the channel against the rank of the required prefix,
+                        * allow if >= ours. Because mIRC and xchat throw a tizz if the modes shown
+                        * 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.
+                        */
+                       unsigned int ourrank = chan->GetPrefixValue(user);
+                       if (ourrank < neededrank)
+                       {
+                               /* Bog off */
+                               // TODO replace with a real search for the proper prefix
+                               char needed = neededrank > HALFOP_VALUE ? '@' : '%';
+                               user->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :You must have channel privilege %c or above to %sset channel mode %c",
+                                               user->nick.c_str(), chan->name.c_str(), needed, adding ? "" : "un", modechar);
+                               return MODEACTION_DENY;
+                       }
                }
        }
 
@@ -318,7 +328,7 @@ ModeAction ModeParser::TryMode(User* user, User* targetuser, Channel* chan, bool
                if (IS_OPER(user))
                {
                        user->WriteNumeric(ERR_NOPRIVILEGES, "%s :Permission Denied - Oper type %s does not have access to set %s mode %c",
-                                       user->nick.c_str(), user->oper.c_str(), type == MODETYPE_CHANNEL ? "channel" : "user", modechar);
+                                       user->nick.c_str(), irc::Spacify(user->oper.c_str()), type == MODETYPE_CHANNEL ? "channel" : "user", modechar);
                }
                else
                {
@@ -385,7 +395,7 @@ void ModeParser::Process(const std::vector<std::string>& parameters, User *user,
        else
        {
                ModResult MOD_RESULT;
-               FIRST_MOD_RESULT(ServerInstance, OnPreMode, MOD_RESULT, (user, targetuser, targetchannel, parameters));
+               FIRST_MOD_RESULT(OnPreMode, MOD_RESULT, (user, targetuser, targetchannel, parameters));
                if (MOD_RESULT == MOD_RES_DENY)
                        return;
                SkipAccessChecks = (MOD_RESULT == MOD_RES_ALLOW);
@@ -440,7 +450,7 @@ void ModeParser::Process(const std::vector<std::string>& parameters, User *user,
                        if (merge && targetchannel && targetchannel->IsModeSet(modechar) && !mh->IsListMode())
                        {
                                std::string ours = targetchannel->GetModeParameter(modechar);
-                               if (!mh->CheckTimeStamp(parameter, ours, targetchannel))
+                               if (!mh->ResolveModeConflict(parameter, ours, targetchannel))
                                        /* we won the mode merge, don't apply this mode */
                                        continue;
                        }
@@ -461,9 +471,16 @@ void ModeParser::Process(const std::vector<std::string>& parameters, User *user,
 
                if (pcnt)
                {
+                       TranslateType tt = mh->GetTranslateType();
+                       if (tt == TR_NICK)
+                       {
+                               User* u = ServerInstance->FindNick(parameter);
+                               if (u)
+                                       parameter = u->nick;
+                       }
                        output_parameters << " " << parameter;
                        LastParseParams.push_back(parameter);
-                       LastParseTranslate.push_back(mh->GetTranslateType());
+                       LastParseTranslate.push_back(tt);
                }
 
                if ( (output_mode.length() + output_parameters.str().length() > 450)
@@ -528,7 +545,7 @@ void ModeParser::DisplayListModes(User* user, Channel* chan, std::string &mode_s
                        return;
 
                ModResult MOD_RESULT;
-               FIRST_MOD_RESULT(ServerInstance, OnRawMode, MOD_RESULT, (user, chan, mletter, "", true, 0));
+               FIRST_MOD_RESULT(OnRawMode, MOD_RESULT, (user, chan, mletter, "", true, 0));
                if (MOD_RESULT == MOD_RES_DENY)
                        continue;
 
@@ -941,30 +958,29 @@ void ModeHandler::RemoveMode(Channel* channel, irc::modestacker* stack)
        }
 }
 
-ModeParser::ModeParser(InspIRCd* Instance) : ServerInstance(Instance)
+ModeParser::ModeParser()
 {
-       ModeHandler::ServerInstance = Instance;
        ModeHandler* modes[] =
        {
-               new ModeChannelSecret(Instance),
-               new ModeChannelPrivate(Instance),
-               new ModeChannelModerated(Instance),
-               new ModeChannelTopicOps(Instance),
-
-               new ModeChannelNoExternal(Instance),
-               new ModeChannelInviteOnly(Instance),
-               new ModeChannelKey(Instance),
-               new ModeChannelLimit(Instance),
-
-               new ModeChannelBan(Instance),
-               new ModeChannelOp(Instance),
-               new ModeChannelHalfOp(Instance),
-               new ModeChannelVoice(Instance),
-
-               new ModeUserWallops(Instance),
-               new ModeUserInvisible(Instance),
-               new ModeUserOperator(Instance),
-               new ModeUserServerNoticeMask(Instance),
+               new ModeChannelSecret,
+               new ModeChannelPrivate,
+               new ModeChannelModerated,
+               new ModeChannelTopicOps,
+
+               new ModeChannelNoExternal,
+               new ModeChannelInviteOnly,
+               new ModeChannelKey,
+               new ModeChannelLimit,
+
+               new ModeChannelBan,
+               new ModeChannelOp,
+               new ModeChannelHalfOp,
+               new ModeChannelVoice,
+
+               new ModeUserWallops,
+               new ModeUserInvisible,
+               new ModeUserOperator,
+               new ModeUserServerNoticeMask,
 #define BUILTIN_MODE_COUNT 16
        };