/** The prefix rank required to unset this mode on channels. */
unsigned int ranktounset;
+ /** If non-empty then the syntax of the parameter for this mode. */
+ std::string syntax;
+
public:
/**
* The constructor for ModeHandler initalizes the mode handler.
return adding ? ranktoset : ranktounset;
}
+ /** Retrieves the syntax of the parameter for this mode. */
+ const std::string& GetSyntax() const { return syntax; }
+
friend class ModeParser;
};
/* Builder for the ERR_INVALIDMODEPARAM numeric. */
class Numerics::InvalidModeParameter : public Numeric::Numeric
{
+ private:
+ void push_message(ModeHandler* mode, const std::string& message)
+ {
+ if (!message.empty())
+ {
+ // The caller has specified their own message.
+ push(message);
+ return;
+ }
+
+ const std::string& syntax = mode->GetSyntax();
+ if (!syntax.empty())
+ {
+ // If the mode has a syntax hint we include it in the message.
+ push(InspIRCd::Format("Invalid %s mode parameter. Syntax: %s.", mode->name.c_str(), syntax.c_str()));
+ }
+ else
+ {
+ // Otherwise, send it without.
+ push(InspIRCd::Format("Invalid %s mode parameter.", mode->name.c_str()));
+ }
+ }
+
public:
InvalidModeParameter(Channel* chan, ModeHandler* mode, const std::string& parameter, const std::string& message = "")
: Numeric(ERR_INVALIDMODEPARAM)
push(chan->name);
push(mode->GetModeChar());
push(parameter);
- push(message.empty() ? InspIRCd::Format("Invalid %s mode parameter", mode->name.c_str()) : message);
+ push_message(mode, message);
}
InvalidModeParameter(User* user, ModeHandler* mode, const std::string& parameter, const std::string& message = "")
push(user->registered & REG_NICK ? user->nick : "*");
push(mode->GetModeChar());
push(parameter);
- push(message.empty() ? InspIRCd::Format("Invalid %s mode parameter", mode->name.c_str()) : message);
+ push_message(mode, message);
}
};
ModeChannelKey::ModeChannelKey(Module* Creator)
: ParamMode<ModeChannelKey, LocalStringExt>(Creator, "key", 'k', PARAM_ALWAYS)
{
+ syntax = "<key>";
}
ModeAction ModeChannelKey::OnModeChange(User* source, User*, Channel* channel, std::string ¶meter, bool adding)
: ParamMode<ModeChannelLimit, LocalIntExt>(Creator, "limit", 'l')
, minlimit(0)
{
+ syntax = "<limit>";
}
bool ModeChannelLimit::ResolveModeConflict(std::string &their_param, const std::string &our_param, Channel*)
ModeChannelBan(Module* Creator)
: ListModeBase(Creator, "ban", 'b', "End of channel ban list", 367, 368, true)
{
+ syntax = "<mask>";
}
};
: ModeHandler(Creator, "snomask", 's', PARAM_SETONLY, MODETYPE_USER)
{
oper = true;
+ syntax = "(+|-)<snomasks>";
}
ModeAction ModeUserServerNoticeMask::OnModeChange(User* source, User* dest, Channel*, std::string ¶meter, bool adding)
void ModeHandler::OnParameterMissing(User* user, User* dest, Channel* channel)
{
- const std::string message = InspIRCd::Format("You must specify a parameter for the %s mode", name.c_str());
+ std::string message = InspIRCd::Format("You must specify a parameter for the %s mode.", name.c_str());
+ if (!syntax.empty())
+ message.append(InspIRCd::Format(" Syntax: %s.", syntax.c_str()));
+
if (channel)
user->WriteNumeric(Numerics::InvalidModeParameter(channel, this, "*", message));
else
, selfremove(true)
{
list = true;
+ syntax = "<nick>";
}
ModResult PrefixMode::AccessCheck(User* src, Channel*, std::string& value, bool adding)
AntiCapsMode(Module* Creator)
: ParamMode<AntiCapsMode, SimpleExtItem<AntiCapsSettings> >(Creator, "anticaps", 'B')
{
+ syntax = "{ban|block|mute|kick|kickban}:<minlen>:<percent>";
}
ModeAction OnSet(User* source, Channel* channel, std::string& parameter) CXX11_OVERRIDE
// Attempt to parse the method.
if (!ParseMethod(stream, method) || !ParseMinimumLength(stream, minlen) || !ParsePercent(stream, percent))
{
- source->WriteNumeric(Numerics::InvalidModeParameter(channel, this, parameter, "Invalid anticaps mode parameter. Syntax: <ban|block|mute|kick|kickban>:{minlen}:{percent}."));
+ source->WriteNumeric(Numerics::InvalidModeParameter(channel, this, parameter));
return MODEACTION_DENY;
}
: ListModeBase(Creator, "autoop", 'w', "End of Channel Access List", 910, 911, true)
{
ranktoset = ranktounset = OP_VALUE;
+ syntax = "<prefix>:<mask>";
tidy = false;
}
BanException(Module* Creator)
: ListModeBase(Creator, "banexception", 'e', "End of Channel Exception List", 348, 349, true)
{
+ syntax = "<mask>";
}
};
ChanFilter(Module* Creator)
: ListModeBase(Creator, "filter", 'g', "End of channel spamfilter list", 941, 940, false)
{
+ syntax = "<pattern>";
}
bool ValidateParam(User* user, Channel* chan, std::string& word) CXX11_OVERRIDE
{
if (word.length() > maxlen)
{
- user->WriteNumeric(Numerics::InvalidModeParameter(chan, this, word, "Word is too long for the spamfilter list"));
+ user->WriteNumeric(Numerics::InvalidModeParameter(chan, this, word, "Word is too long for the spamfilter list."));
return false;
}
HistoryMode(Module* Creator)
: ParamMode<HistoryMode, SimpleExtItem<HistoryList> >(Creator, "history", 'H')
{
+ syntax = "<max-messages>:<max-duration>";
}
ModeAction OnSet(User* source, Channel* channel, std::string& parameter) CXX11_OVERRIDE
, jointime("delaymsg", ExtensionItem::EXT_MEMBERSHIP, Parent)
{
ranktoset = ranktounset = OP_VALUE;
+ syntax = "<seconds>";
}
bool ResolveModeConflict(std::string& their_param, const std::string& our_param, Channel*) CXX11_OVERRIDE
ExemptChanOps(Module* Creator)
: ListModeBase(Creator, "exemptchanops", 'X', "End of channel exemptchanops list", 954, 953, false)
{
+ syntax = "<restriction>:<prefix>";
}
static PrefixMode* FindMode(const std::string& mode)
std::string prefix;
if (!ParseEntry(word, restriction, prefix))
{
- user->WriteNumeric(Numerics::InvalidModeParameter(chan, this, word, "Invalid exemptchanops entry, format is <restriction>:<prefix>"));
+ user->WriteNumeric(Numerics::InvalidModeParameter(chan, this, word));
return false;
}
if (!ServerInstance->Modes->FindMode(restriction, MODETYPE_CHANNEL))
{
- user->WriteNumeric(Numerics::InvalidModeParameter(chan, this, word, "Unknown restriction"));
+ user->WriteNumeric(Numerics::InvalidModeParameter(chan, this, word, "Unknown restriction."));
return false;
}
if (prefix != "*" && !FindMode(prefix))
{
- user->WriteNumeric(Numerics::InvalidModeParameter(chan, this, word, "Unknown prefix mode"));
+ user->WriteNumeric(Numerics::InvalidModeParameter(chan, this, word, "Unknown prefix mode."));
return false;
}
InviteException(Module* Creator)
: ListModeBase(Creator, "invex", 'I', "End of Channel Invite Exception List", 346, 347, true)
{
+ syntax = "<mask>";
}
};
JoinFlood(Module* Creator)
: ParamMode<JoinFlood, SimpleExtItem<joinfloodsettings> >(Creator, "joinflood", 'j')
{
+ syntax = "<joins>:<seconds>";
}
ModeAction OnSet(User* source, Channel* channel, std::string& parameter) CXX11_OVERRIDE
: ParamMode<KickRejoin, SimpleExtItem<KickRejoinData> >(Creator, "kicknorejoin", 'J')
, max(60)
{
+ syntax = "<seconds>";
}
ModeAction OnSet(User* source, Channel* channel, std::string& parameter) CXX11_OVERRIDE
MsgFlood(Module* Creator)
: ParamMode<MsgFlood, SimpleExtItem<floodsettings> >(Creator, "flood", 'f')
{
+ syntax = "[*]<messages>:<seconds>";
}
ModeAction OnSet(User* source, Channel* channel, std::string& parameter) CXX11_OVERRIDE
NickFlood(Module* Creator)
: ParamMode<NickFlood, SimpleExtItem<nickfloodsettings> >(Creator, "nickflood", 'F')
{
+ syntax = "<nick-changes>:<seconds>";
}
ModeAction OnSet(User* source, Channel* channel, std::string& parameter) CXX11_OVERRIDE
{
public:
Redirect(Module* Creator)
- : ParamMode<Redirect, LocalStringExt>(Creator, "redirect", 'L') { }
+ : ParamMode<Redirect, LocalStringExt>(Creator, "redirect", 'L')
+ {
+ syntax = "<target>";
+ }
ModeAction OnSet(User* source, Channel* channel, std::string& parameter) CXX11_OVERRIDE
{
: ParamMode<RepeatMode, SimpleExtItem<ChannelSettings> >(Creator, "repeat", 'E')
, MemberInfoExt("repeat_memb", ExtensionItem::EXT_MEMBERSHIP, Creator)
{
+ syntax = "[~|*]<lines>:<sec>[:<difference>][:<backlog>]";
}
void OnUnset(User* source, Channel* chan) CXX11_OVERRIDE
ChannelSettings settings;
if (!ParseSettings(source, parameter, settings))
{
- source->WriteNumeric(Numerics::InvalidModeParameter(channel, this, parameter,
- "Invalid repeat syntax. Syntax is: [~|*]<lines>:<sec>[:<difference>][:<backlog>]"));
+ source->WriteNumeric(Numerics::InvalidModeParameter(channel, this, parameter));
return MODEACTION_DENY;
}
if ((settings.Backlog > 0) && (settings.Lines > settings.Backlog))
{
source->WriteNumeric(Numerics::InvalidModeParameter(channel, this, parameter,
- "Invalid repeat syntax. You can't set lines higher than backlog."));
+ "You can't set lines higher than backlog."));
return MODEACTION_DENY;
}
if (ms.MaxLines && settings.Lines > ms.MaxLines)
{
source->WriteNumeric(Numerics::InvalidModeParameter(channel, this, parameter, InspIRCd::Format(
- "Invalid repeat parameter. The line number you specified is too great. Maximum allowed is %u.", ms.MaxLines)));
+ "The line number you specified is too big. Maximum allowed is %u.", ms.MaxLines)));
return false;
}
if (ms.MaxSecs && settings.Seconds > ms.MaxSecs)
{
source->WriteNumeric(Numerics::InvalidModeParameter(channel, this, parameter, InspIRCd::Format(
- "Invalid repeat parameter. The seconds you specified are too great. Maximum allowed is %u.", ms.MaxSecs)));
+ "The seconds you specified are too big. Maximum allowed is %u.", ms.MaxSecs)));
return false;
}
{
if (ms.MaxDiff == 0)
source->WriteNumeric(Numerics::InvalidModeParameter(channel, this, parameter,
- "Invalid repeat parameter. The server administrator has disabled matching on edit distance."));
+ "The server administrator has disabled matching on edit distance."));
else
source->WriteNumeric(Numerics::InvalidModeParameter(channel, this, parameter, InspIRCd::Format(
- "Invalid repeat parameter. The distance you specified is too great. Maximum allowed is %u.", ms.MaxDiff)));
+ "The distance you specified is too big. Maximum allowed is %u.", ms.MaxDiff)));
return false;
}
{
if (ms.MaxBacklog == 0)
source->WriteNumeric(Numerics::InvalidModeParameter(channel, this, parameter,
- "Invalid repeat parameter. The server administrator has disabled backlog matching."));
+ "The server administrator has disabled backlog matching."));
else
source->WriteNumeric(Numerics::InvalidModeParameter(channel, this, parameter, InspIRCd::Format(
- "Invalid repeat paramter. The backlog you specified is too great. Maximum allowed is %u.", ms.MaxBacklog)));
+ "The backlog you specified is too big. Maximum allowed is %u.", ms.MaxBacklog)));
return false;
}