]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/mode.cpp
#define NO_CLIENT_LONG_LONG, makes mysql.h ANSI C++ compliant so that we can get...
[user/henk/code/inspircd.git] / src / mode.cpp
index 6805c348c8629cf7e53167dc978abea91a93d1a9..91a64f89b0102cb60e7ec6ab3b20d6b22b1f7db1 100644 (file)
@@ -149,6 +149,71 @@ bool ModeHandler::CheckTimeStamp(time_t theirs, time_t ours, const std::string&,
        return (ours < theirs);
 }
 
+SimpleUserModeHandler::SimpleUserModeHandler(InspIRCd* Instance, char modeletter) : ModeHandler(Instance, modeletter, 0, 0, false, MODETYPE_USER, false)
+{
+}
+
+SimpleUserModeHandler::~SimpleUserModeHandler()
+{
+}
+
+SimpleChannelModeHandler::~SimpleChannelModeHandler()
+{
+}
+
+SimpleChannelModeHandler::SimpleChannelModeHandler(InspIRCd* Instance, char modeletter) : ModeHandler(Instance, modeletter, 0, 0, false, MODETYPE_CHANNEL, false)
+{
+}
+
+ModeAction SimpleUserModeHandler::OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding, bool servermode)
+{
+       /* Only opers can change other users modes */
+       if (source != dest)
+               return MODEACTION_DENY;
+
+       if (adding)
+       {
+               if (!dest->IsModeSet(this->GetModeChar()))
+               {
+                       dest->SetMode(this->GetModeChar(),true);
+                       return MODEACTION_ALLOW;
+               }
+       }
+       else
+       {
+               if (dest->IsModeSet(this->GetModeChar()))
+               {
+                       dest->SetMode(this->GetModeChar(),false);
+                       return MODEACTION_ALLOW;
+               }
+       }
+
+       return MODEACTION_DENY;
+}
+
+
+ModeAction SimpleChannelModeHandler::OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding, bool servermode)
+{
+       if (adding)
+       {
+               if (!channel->IsModeSet(this->GetModeChar()))
+               {
+                       channel->SetMode(this->GetModeChar(),true);
+                       return MODEACTION_ALLOW;
+               }
+       }
+       else
+       {
+               if (channel->IsModeSet(this->GetModeChar()))
+               {
+                       channel->SetMode(this->GetModeChar(),false);
+                       return MODEACTION_ALLOW;
+               }
+       }
+
+       return MODEACTION_DENY;
+}
+
 ModeWatcher::ModeWatcher(InspIRCd* Instance, char modeletter, ModeType type) : ServerInstance(Instance), mode(modeletter), m_type(type)
 {
 }
@@ -577,14 +642,23 @@ void ModeParser::Process(const char* const* parameters, int pcnt, User *user, bo
                                                        /* It's an oper only mode, check if theyre an oper. If they arent,
                                                         * eat any parameter that  came with the mode, and continue to next
                                                         */
-                                                       if ((IS_LOCAL(user)) && (modehandlers[handler_id]->NeedsOper()) && (!user->HasModePermission(modehandlers[handler_id]->GetModeChar(), type)))
+                                                       if (adding && (IS_LOCAL(user)) && (modehandlers[handler_id]->NeedsOper()) && (!user->HasModePermission(modehandlers[handler_id]->GetModeChar(), type)))
                                                        {
-                                                               user->WriteNumeric(481, "%s :Permission Denied - Oper type %s does not have access to %sset %s mode %c",
-                                                                               user->nick,
-                                                                               user->oper,
-                                                                               adding ? "" : "un",
-                                                                               type == MODETYPE_CHANNEL ? "channel" : "user",
-                                                                               modehandlers[handler_id]->GetModeChar());
+                                                               if (IS_OPER(user))
+                                                               {
+                                                                       user->WriteNumeric(481, "%s :Permission Denied - Oper type %s does not have access to set %s mode %c",
+                                                                                       user->nick,
+                                                                                       user->oper,
+                                                                                       type == MODETYPE_CHANNEL ? "channel" : "user",
+                                                                                       modehandlers[handler_id]->GetModeChar());
+                                                               }
+                                                               else
+                                                               {
+                                                                       user->WriteNumeric(481, "%s :Permission Denied - Only operators may set %s mode %c",
+                                                                                       user->nick,
+                                                                                       type == MODETYPE_CHANNEL ? "channel" : "user",
+                                                                                       modehandlers[handler_id]->GetModeChar());
+                                                               }
                                                                continue;
                                                        }
 
@@ -1116,9 +1190,8 @@ ModeParser::ModeParser(InspIRCd* Instance) : ServerInstance(Instance)
                NULL
        };
 
-       /* Clear mode list */
+       /* Clear mode handler list */
        memset(modehandlers, 0, sizeof(modehandlers));
-       memset(modewatchers, 0, sizeof(modewatchers));
 
        /* Last parse string */
        LastParse.clear();