]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Show the mode syntax in ERR_INVALIDMODEPARAM.
authorPeter Powell <petpow@saberuk.com>
Wed, 12 Jun 2019 20:46:07 +0000 (21:46 +0100)
committerPeter Powell <petpow@saberuk.com>
Wed, 12 Jun 2019 20:52:58 +0000 (21:52 +0100)
21 files changed:
include/mode.h
include/numericbuilder.h
src/coremods/core_channel/cmode_k.cpp
src/coremods/core_channel/cmode_l.cpp
src/coremods/core_channel/core_channel.h
src/coremods/core_user/umode_s.cpp
src/mode.cpp
src/modules/m_anticaps.cpp
src/modules/m_autoop.cpp
src/modules/m_banexception.cpp
src/modules/m_chanfilter.cpp
src/modules/m_chanhistory.cpp
src/modules/m_delaymsg.cpp
src/modules/m_exemptchanops.cpp
src/modules/m_inviteexception.cpp
src/modules/m_joinflood.cpp
src/modules/m_kicknorejoin.cpp
src/modules/m_messageflood.cpp
src/modules/m_nickflood.cpp
src/modules/m_redirect.cpp
src/modules/m_repeat.cpp

index fe02838b2fc80aef7b47d98deab905818e718cef..683f4b55b27502556940ba4207bcccbd917723cf 100644 (file)
@@ -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;
 };
 
index 0d55093ca59c3db15d9f75b787f2872fa7dc918d..4431fbc527f5bd3edd14fc22676c7c66de3f2c36 100644 (file)
@@ -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);
        }
 };
 
index 43f41ddfd2bed788841761ce6527367d7b841647..ff8beeaf9aeea37bb2b7c040f0fb4b7a6d584693 100644 (file)
@@ -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)
index e71eb500e01ace4b363596c650bdde69493d38fd..d3b806956320fb70a4e0bdbd2f3f8c7ee1c5a57c 100644 (file)
@@ -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*)
index c054d5265e6c4435361e69aa526653ff67c1aaea..bfcf59358badc5509df8668f02aa611ab2b35a46 100644 (file)
@@ -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>";
        }
 };
 
index 7c83e008bd101b6ebe1b34d9cc8d9e2eb0f3a3b7..4c3725ee5c6fcf476add26c32a0c04f44ef31fc4 100644 (file)
@@ -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)
index aa4d50b08ac21deee4c511cde8d75b2cb9b34dd9..159474985b1daec0a0e2f7dd17bbb7de83030545 100644 (file)
@@ -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)
index ef3c750ce55c9a498aef28c13f132286f23cd160..8f020ed03d1410d9319025bff2c084b5d9fbee45 100644 (file)
@@ -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;
                }
 
index b1b08228c50a71a8a4c3d9786bf2ad5814204543..339666457f1534b8b274c8adbb5206754a242e56 100644 (file)
@@ -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;
        }
 
index c7864ea9e88b56311eef5aa8b172eec865a2bdbe..44b93b457fb8afe9edb240cdfe8019c66f90d3c9 100644 (file)
@@ -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>";
        }
 };
 
index 051b8c60d0d9062f14f74c18d1749141c769b210..b2323176c8676f231338ea0b9b6bdcda22fb7843 100644 (file)
@@ -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;
                }
 
index ed7bb684fd1229d576002c812e0f0d9b129c34c2..7db851ee37316d61a6cc315b9de2394f9583495c 100644 (file)
@@ -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
index 6acaa9a2f2947b7f51f7bacf92813a7120e1faf7..04d4119c7e4592d134f0b41606f7ce37dcd582d0 100644 (file)
@@ -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
index b10a44859dcc3d51468b6a515615b7dd1164caf7..794b06f6abc77e4d91502ee53729b22f99f98901 100644 (file)
@@ -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;
                }
 
index b12c98b5da42eaf82bbc589817e9341360f0a89c..03a2fbc7c59d4ae91cd9f722f6a28bf2d4fe1ebf 100644 (file)
@@ -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>";
        }
 };
 
index 1b9deac5fe6f8289e82d65db2c02ef51c240ad9b..cccdd15b60fa6717f4ac3ab86ce1e123a4d42a8c 100644 (file)
@@ -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
index ec5ac661e89c224463c251d9d2b6b20196231ab0..5130bcbddd956957bc4c1a9f1c9a0d1dbcdeebf0 100644 (file)
@@ -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
index 7b96804f05976793271c04e94ebbc2fbadce6f80..ea5493c785261c05135c8ad060b88d7b0a29cd22 100644 (file)
@@ -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
index 9b8bbcdb6e823666faf11c97fd0e4a4ca3f4ef6a..48f085dde937201623e3a2a9a47a9e8fff7cdf78 100644 (file)
@@ -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
index 5e14b211e5324d95ccf39f5cf6cd8787d457f0c0..3d10663aa4557d6dd23e5ac351ef733127a52563 100644 (file)
@@ -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
        {
index a2e9b1f8b7b778f791bcc8f1df2cf145a1cc3f77..57a6edab6b7842e09b51180d1ac18757a76f67a2 100644 (file)
@@ -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;
                }