inspircd

A modular C++ IRC daemon (ircd). https://www.inspircd.org/
Log | Files | Refs | README

commit 9433e34b2133d8f1e77fea15447ba4d0259a5fb0
parent 938837af9fe92d0fef811db96a5e9d6bf8e3ae11
Author: Peter Powell <petpow@saberuk.com>
Date:   Wed, 12 Jun 2019 21:46:07 +0100

Show the mode syntax in ERR_INVALIDMODEPARAM.

Diffstat:
Minclude/mode.h | 6++++++
Minclude/numericbuilder.h | 27+++++++++++++++++++++++++--
Msrc/coremods/core_channel/cmode_k.cpp | 1+
Msrc/coremods/core_channel/cmode_l.cpp | 1+
Msrc/coremods/core_channel/core_channel.h | 1+
Msrc/coremods/core_user/umode_s.cpp | 1+
Msrc/mode.cpp | 6+++++-
Msrc/modules/m_anticaps.cpp | 3++-
Msrc/modules/m_autoop.cpp | 1+
Msrc/modules/m_banexception.cpp | 1+
Msrc/modules/m_chanfilter.cpp | 3++-
Msrc/modules/m_chanhistory.cpp | 1+
Msrc/modules/m_delaymsg.cpp | 1+
Msrc/modules/m_exemptchanops.cpp | 7++++---
Msrc/modules/m_inviteexception.cpp | 1+
Msrc/modules/m_joinflood.cpp | 1+
Msrc/modules/m_kicknorejoin.cpp | 1+
Msrc/modules/m_messageflood.cpp | 1+
Msrc/modules/m_nickflood.cpp | 1+
Msrc/modules/m_redirect.cpp | 5++++-
Msrc/modules/m_repeat.cpp | 18+++++++++---------
21 files changed, 70 insertions(+), 18 deletions(-)

diff --git a/include/mode.h b/include/mode.h @@ -154,6 +154,9 @@ class CoreExport ModeHandler : public ServiceProvider /** 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. @@ -329,6 +332,9 @@ class CoreExport ModeHandler : public ServiceProvider return adding ? ranktoset : ranktounset; } + /** Retrieves the syntax of the parameter for this mode. */ + const std::string& GetSyntax() const { return syntax; } + friend class ModeParser; }; diff --git a/include/numericbuilder.h b/include/numericbuilder.h @@ -207,6 +207,29 @@ namespace Numerics /* 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) @@ -214,7 +237,7 @@ class Numerics::InvalidModeParameter : public Numeric::Numeric 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 = "") @@ -223,7 +246,7 @@ class Numerics::InvalidModeParameter : public Numeric::Numeric 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); } }; diff --git a/src/coremods/core_channel/cmode_k.cpp b/src/coremods/core_channel/cmode_k.cpp @@ -28,6 +28,7 @@ const std::string::size_type ModeChannelKey::maxkeylen = 32; ModeChannelKey::ModeChannelKey(Module* Creator) : ParamMode<ModeChannelKey, LocalStringExt>(Creator, "key", 'k', PARAM_ALWAYS) { + syntax = "<key>"; } ModeAction ModeChannelKey::OnModeChange(User* source, User*, Channel* channel, std::string &parameter, bool adding) diff --git a/src/coremods/core_channel/cmode_l.cpp b/src/coremods/core_channel/cmode_l.cpp @@ -26,6 +26,7 @@ ModeChannelLimit::ModeChannelLimit(Module* Creator) : ParamMode<ModeChannelLimit, LocalIntExt>(Creator, "limit", 'l') , minlimit(0) { + syntax = "<limit>"; } bool ModeChannelLimit::ResolveModeConflict(std::string &their_param, const std::string &our_param, Channel*) diff --git a/src/coremods/core_channel/core_channel.h b/src/coremods/core_channel/core_channel.h @@ -168,6 +168,7 @@ class ModeChannelBan : public ListModeBase ModeChannelBan(Module* Creator) : ListModeBase(Creator, "ban", 'b', "End of channel ban list", 367, 368, true) { + syntax = "<mask>"; } }; diff --git a/src/coremods/core_user/umode_s.cpp b/src/coremods/core_user/umode_s.cpp @@ -26,6 +26,7 @@ ModeUserServerNoticeMask::ModeUserServerNoticeMask(Module* Creator) : ModeHandler(Creator, "snomask", 's', PARAM_SETONLY, MODETYPE_USER) { oper = true; + syntax = "(+|-)<snomasks>"; } ModeAction ModeUserServerNoticeMask::OnModeChange(User* source, User* dest, Channel*, std::string &parameter, bool adding) diff --git a/src/mode.cpp b/src/mode.cpp @@ -89,7 +89,10 @@ void ModeHandler::DisplayEmptyList(User*, Channel*) 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 @@ -171,6 +174,7 @@ PrefixMode::PrefixMode(Module* Creator, const std::string& Name, char ModeLetter , selfremove(true) { list = true; + syntax = "<nick>"; } ModResult PrefixMode::AccessCheck(User* src, Channel*, std::string& value, bool adding) diff --git a/src/modules/m_anticaps.cpp b/src/modules/m_anticaps.cpp @@ -101,6 +101,7 @@ class AntiCapsMode : public ParamMode<AntiCapsMode, SimpleExtItem<AntiCapsSettin 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 @@ -113,7 +114,7 @@ class AntiCapsMode : public ParamMode<AntiCapsMode, SimpleExtItem<AntiCapsSettin // 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; } diff --git a/src/modules/m_autoop.cpp b/src/modules/m_autoop.cpp @@ -30,6 +30,7 @@ class AutoOpList : public ListModeBase : ListModeBase(Creator, "autoop", 'w', "End of Channel Access List", 910, 911, true) { ranktoset = ranktounset = OP_VALUE; + syntax = "<prefix>:<mask>"; tidy = false; } diff --git a/src/modules/m_banexception.cpp b/src/modules/m_banexception.cpp @@ -41,6 +41,7 @@ class BanException : public ListModeBase BanException(Module* Creator) : ListModeBase(Creator, "banexception", 'e', "End of Channel Exception List", 348, 349, true) { + syntax = "<mask>"; } }; diff --git a/src/modules/m_chanfilter.cpp b/src/modules/m_chanfilter.cpp @@ -37,13 +37,14 @@ class ChanFilter : public ListModeBase 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; } diff --git a/src/modules/m_chanhistory.cpp b/src/modules/m_chanhistory.cpp @@ -56,6 +56,7 @@ class HistoryMode : public ParamMode<HistoryMode, SimpleExtItem<HistoryList> > 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 diff --git a/src/modules/m_delaymsg.cpp b/src/modules/m_delaymsg.cpp @@ -29,6 +29,7 @@ class DelayMsgMode : public ParamMode<DelayMsgMode, LocalIntExt> , 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 diff --git a/src/modules/m_exemptchanops.cpp b/src/modules/m_exemptchanops.cpp @@ -29,6 +29,7 @@ class ExemptChanOps : public ListModeBase 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) @@ -77,7 +78,7 @@ class ExemptChanOps : public ListModeBase 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; } @@ -89,13 +90,13 @@ class ExemptChanOps : public ListModeBase 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; } diff --git a/src/modules/m_inviteexception.cpp b/src/modules/m_inviteexception.cpp @@ -42,6 +42,7 @@ class InviteException : public ListModeBase InviteException(Module* Creator) : ListModeBase(Creator, "invex", 'I', "End of Channel Invite Exception List", 346, 347, true) { + syntax = "<mask>"; } }; diff --git a/src/modules/m_joinflood.cpp b/src/modules/m_joinflood.cpp @@ -97,6 +97,7 @@ class JoinFlood : public ParamMode<JoinFlood, SimpleExtItem<joinfloodsettings> > JoinFlood(Module* Creator) : ParamMode<JoinFlood, SimpleExtItem<joinfloodsettings> >(Creator, "joinflood", 'j') { + syntax = "<joins>:<seconds>"; } ModeAction OnSet(User* source, Channel* channel, std::string& parameter) CXX11_OVERRIDE diff --git a/src/modules/m_kicknorejoin.cpp b/src/modules/m_kicknorejoin.cpp @@ -97,6 +97,7 @@ class KickRejoin : public ParamMode<KickRejoin, SimpleExtItem<KickRejoinData> > : ParamMode<KickRejoin, SimpleExtItem<KickRejoinData> >(Creator, "kicknorejoin", 'J') , max(60) { + syntax = "<seconds>"; } ModeAction OnSet(User* source, Channel* channel, std::string& parameter) CXX11_OVERRIDE diff --git a/src/modules/m_messageflood.cpp b/src/modules/m_messageflood.cpp @@ -72,6 +72,7 @@ class MsgFlood : public ParamMode<MsgFlood, SimpleExtItem<floodsettings> > MsgFlood(Module* Creator) : ParamMode<MsgFlood, SimpleExtItem<floodsettings> >(Creator, "flood", 'f') { + syntax = "[*]<messages>:<seconds>"; } ModeAction OnSet(User* source, Channel* channel, std::string& parameter) CXX11_OVERRIDE diff --git a/src/modules/m_nickflood.cpp b/src/modules/m_nickflood.cpp @@ -84,6 +84,7 @@ class NickFlood : public ParamMode<NickFlood, SimpleExtItem<nickfloodsettings> > 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 diff --git a/src/modules/m_redirect.cpp b/src/modules/m_redirect.cpp @@ -30,7 +30,10 @@ class Redirect : public ParamMode<Redirect, LocalStringExt> { 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 { diff --git a/src/modules/m_repeat.cpp b/src/modules/m_repeat.cpp @@ -125,6 +125,7 @@ class RepeatMode : public ParamMode<RepeatMode, SimpleExtItem<ChannelSettings> > : 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 @@ -140,15 +141,14 @@ class RepeatMode : public ParamMode<RepeatMode, SimpleExtItem<ChannelSettings> > 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; } @@ -309,14 +309,14 @@ class RepeatMode : public ParamMode<RepeatMode, SimpleExtItem<ChannelSettings> > 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; } @@ -324,10 +324,10 @@ class RepeatMode : public ParamMode<RepeatMode, SimpleExtItem<ChannelSettings> > { 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; } @@ -335,10 +335,10 @@ class RepeatMode : public ParamMode<RepeatMode, SimpleExtItem<ChannelSettings> > { 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; }