]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_redirect.cpp
Replace std::deque with std::vector in spanningtree and related modules
[user/henk/code/inspircd.git] / src / modules / m_redirect.cpp
index 9aa0dcf8b5f1432a96c6db6c9b8ce62570055b5d..1a5a48b00607578722ffdacc1286f1aad6cf6165 100644 (file)
@@ -30,53 +30,49 @@ class Redirect : public ModeHandler
                        return std::make_pair(false, parameter);
        }
 
-       bool CheckTimeStamp(time_t theirs, time_t ours, const std::string &their_param, const std::string &our_param, Channel* channel)
-       {
-               /* When TS is equal, the alphabetically later one wins */
-               return (their_param < our_param);
-       }
-
-       ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding, bool)
+       ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding, bool server)
        {
                if (adding)
                {
-                       Channel* c = NULL;
-
-                       if (IS_LOCAL(source) && !ServerInstance->IsChannel(parameter.c_str(), ServerInstance->Config->Limits.ChanMax))
-                       {
-                               source->WriteNumeric(403, "%s %s :Invalid channel name", source->nick.c_str(), parameter.c_str());
-                               parameter.clear();
-                               return MODEACTION_DENY;
-                       }
-
-                       c = ServerInstance->FindChan(parameter);
-                       if (!c && !IS_OPER(source))
+                       if (IS_LOCAL(source))
                        {
-                               source->WriteNumeric(690, "%s :Target channel %s must exist to be set as a redirect.",source->nick.c_str(),parameter.c_str());
-                               parameter.clear();
-                               return MODEACTION_DENY;
+                               if (!ServerInstance->IsChannel(parameter.c_str(), ServerInstance->Config->Limits.ChanMax))
+                               {
+                                       source->WriteNumeric(403, "%s %s :Invalid channel name", source->nick.c_str(), parameter.c_str());
+                                       parameter.clear();
+                                       return MODEACTION_DENY;
+                               }
                        }
 
-                       if (c && c->GetStatus(source) < STATUS_OP && !IS_OPER(source))
+                       if (IS_LOCAL(source) && !IS_OPER(source) && !server)
                        {
-                               source->WriteNumeric(690, "%s :You must be opped on %s to set it as a redirect.",source->nick.c_str(),parameter.c_str());
-                               parameter.clear();
-                               return MODEACTION_DENY;
+                               Channel* c = ServerInstance->FindChan(parameter);
+                               if (!c)
+                               {
+                                       source->WriteNumeric(690, "%s :Target channel %s must exist to be set as a redirect.",source->nick.c_str(),parameter.c_str());
+                                       parameter.clear();
+                                       return MODEACTION_DENY;
+                               }
+                               else if (c->GetStatus(source) < STATUS_OP)
+                               {
+                                       source->WriteNumeric(690, "%s :You must be opped on %s to set it as a redirect.",source->nick.c_str(),parameter.c_str());
+                                       parameter.clear();
+                                       return MODEACTION_DENY;
+                               }
                        }
 
                        /*
                         * We used to do some checking for circular +L here, but there is no real need for this any more especially as we
                         * now catch +L looping in PreJoin. Remove it, since O(n) logic makes me sad, and we catch it anyway. :) -- w00t
                         */
-                       channel->SetMode('L', true);
-                       channel->SetModeParam('L', parameter.c_str(), true);
+                       channel->SetModeParam('L', parameter);
                        return MODEACTION_ALLOW;
                }
                else
                {
                        if (channel->IsModeSet('L'))
                        {
-                               channel->SetMode('L', false);
+                               channel->SetModeParam('L', "");
                                return MODEACTION_ALLOW;
                        }
                }
@@ -89,16 +85,15 @@ class Redirect : public ModeHandler
 class ModuleRedirect : public Module
 {
 
-       Redirect* re;
+       Redirect re;
 
  public:
 
        ModuleRedirect(InspIRCd* Me)
-               : Module(Me)
+               : Module(Me), re(Me)
        {
 
-               re = new Redirect(ServerInstance);
-               if (!ServerInstance->Modes->AddMode(re))
+               if (!ServerInstance->Modes->AddMode(&re))
                        throw ModuleException("Could not add new modes!");
                Implementation eventlist[] = { I_OnUserPreJoin };
                ServerInstance->Modules->Attach(eventlist, this, 1);
@@ -135,8 +130,7 @@ class ModuleRedirect : public Module
 
        virtual ~ModuleRedirect()
        {
-               ServerInstance->Modes->DelMode(re);
-               delete re;
+               ServerInstance->Modes->DelMode(&re);
        }
 
        virtual Version GetVersion()