]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_redirect.cpp
Make rehash work more than once per run, and fix some uninitialized values in connect...
[user/henk/code/inspircd.git] / src / modules / m_redirect.cpp
index 9aa0dcf8b5f1432a96c6db6c9b8ce62570055b5d..f778b5fef77e402cf4ea137977e0a5b9d4f9d585 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;
                        }
                }