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 ¶meter, 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 ¶meter, 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)
{
}
/* 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;
}
NULL
};
- /* Clear mode list */
+ /* Clear mode handler list */
memset(modehandlers, 0, sizeof(modehandlers));
- memset(modewatchers, 0, sizeof(modewatchers));
/* Last parse string */
LastParse.clear();