/*
* InspIRCd -- Internet Relay Chat Daemon
*
+ * Copyright (C) 2013-2016 Attila Molnar <attilamolnar@hush.com>
+ * Copyright (C) 2012-2013, 2017-2021 Sadie Powell <sadie@witchery.services>
+ * Copyright (C) 2012 Robby <robby@chatbelgie.be>
* Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
- * Copyright (C) 2004-2006, 2008 Craig Edwards <craigedwards@brainbox.cc>
- * Copyright (C) 2007 Robin Burchell <robin+git@viroteck.net>
+ * Copyright (C) 2008 Thomas Stagner <aquanight@inspircd.org>
+ * Copyright (C) 2007-2008 Robin Burchell <robin+git@viroteck.net>
* Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
+ * Copyright (C) 2006-2008, 2010 Craig Edwards <brain@inspircd.org>
*
* This file is part of InspIRCd. InspIRCd is free software: you can
* redistribute it and/or modify it under the terms of the GNU General Public
* inside the mode parser as in the 1.0 api,
* so the only use of this value (along with
* IsListMode()) is for the core to determine
- * wether your module can produce 'lists' or not
+ * whether your module can produce 'lists' or not
* (e.g. banlists, etc)
*/
bool list;
/** 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.
+ * The constructor for ModeHandler initializes the mode handler.
* The constructor of any class you derive from ModeHandler should
* probably call this constructor with the parameters set correctly.
* @param me The module which created this mode
* @return MODEACTION_ALLOW to allow the mode, or MODEACTION_DENY to prevent the mode, also see the description of 'parameter'.
*/
virtual ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding); /* Can change the mode parameter as its a ref */
+
/**
* If your mode is a listmode, then this method will be called for displaying an item list, e.g. on MODE \#channel +modechar
* without any parameter or other modes in the command.
*/
virtual void OnParameterMissing(User* user, User* dest, Channel* channel);
+ /** Called when a user attempts to set a mode and the parameter is invalid.
+ * @param user The user issuing the mode change
+ * @param targetchannel Either the channel target or NULL if changing a user mode.
+ * @param targetuser Either the user target or NULL if changing a channel mode.
+ * @param parameter The invalid parameter.
+ */
+ virtual void OnParameterInvalid(User* user, Channel* targetchannel, User* targetuser, const std::string& parameter);
+
+
/**
* If your mode is a listmode, this method will be called to display an empty list (just the end of list numeric)
* @param user The user issuing the command
- * @param channel The channel tehy're requesting an item list of (e.g. a banlist, or an exception list etc)
+ * @param channel The channel they're requesting an item list of (e.g. a banlist, or an exception list etc)
*/
virtual void DisplayEmptyList(User* user, Channel* channel);
/**
* When a MODETYPE_USER mode handler is being removed, the core will call this method for every user on the server.
- * The usermode will be removed using the appropiate server mode using InspIRCd::SendMode().
+ * The usermode will be removed using the appropriate server mode using InspIRCd::SendMode().
* @param user The user which the server wants to remove your mode from
*/
void RemoveMode(User* user);
return adding ? ranktoset : ranktounset;
}
+ /** Retrieves the syntax of the parameter for this mode. */
+ const std::string& GetSyntax() const { return syntax; }
+
friend class ModeParser;
};
class CoreExport SimpleUserModeHandler : public ModeHandler
{
public:
- SimpleUserModeHandler(Module* Creator, const std::string& Name, char modeletter)
- : ModeHandler(Creator, Name, modeletter, PARAM_NONE, MODETYPE_USER) {}
+ SimpleUserModeHandler(Module* Creator, const std::string& Name, char modeletter, bool operonly = false)
+ : ModeHandler(Creator, Name, modeletter, PARAM_NONE, MODETYPE_USER)
+ {
+ oper = operonly;
+ }
+
ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string& parameter, bool adding) CXX11_OVERRIDE;
};
class CoreExport SimpleChannelModeHandler : public ModeHandler
{
public:
- SimpleChannelModeHandler(Module* Creator, const std::string& Name, char modeletter)
- : ModeHandler(Creator, Name, modeletter, PARAM_NONE, MODETYPE_CHANNEL) {}
+ SimpleChannelModeHandler(Module* Creator, const std::string& Name, char modeletter, bool operonly = false)
+ : ModeHandler(Creator, Name, modeletter, PARAM_NONE, MODETYPE_CHANNEL)
+ {
+ oper = operonly;
+ }
+
ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string& parameter, bool adding) CXX11_OVERRIDE;
};
class CoreExport ModeParser : public fakederef<ModeParser>
{
public:
+ /** The maximum number of modes which can be created. */
static const ModeHandler::Id MODEID_MAX = 64;
+ /** The maximum length of a mode parameter. */
+ static const size_t MODE_PARAM_MAX = 250;
+
/** Type of the container that maps mode names to ModeHandlers
*/
typedef TR1NS::unordered_map<std::string, ModeHandler*, irc::insensitive, irc::StrHashComp> ModeHandlerMap;
*/
ModeAction TryMode(User* user, User* targu, Channel* targc, Modes::Change& mcitem, bool SkipACL);
- /** Returns a list of user or channel mode characters.
- * Used for constructing the parts of the mode list in the 004 numeric.
- * @param mt Controls whether to list user modes or channel modes
- * @param needparam Return modes only if they require a parameter to be set
- * @return The available mode letters that satisfy the given conditions
- */
- std::string CreateModeList(ModeType mt, bool needparam = false);
-
- /** Recreate the cached mode list that is displayed in the 004 numeric
- * in Cached004ModeList.
- * Called when a mode handler is added or removed.
- */
- void RecreateModeListFor004Numeric();
-
/** Allocates an unused id for the given mode type, throws a ModuleException if out of ids.
* @param mt The type of the mode to allocate the id for
* @return The id
*/
ModeHandler::Id AllocateModeId(ModeType mt);
- /** The string representing the last set of modes to be parsed.
- * Use GetLastParse() to get this value, to be used for display purposes.
- */
- std::string LastParse;
-
- /** Cached mode list for use in 004 numeric
- */
- TR1NS::array<std::string, 3> Cached004ModeList;
-
public:
typedef std::vector<ListModeBase*> ListModeList;
typedef std::vector<PrefixMode*> PrefixModeList;
ModeParser();
~ModeParser();
- /** Initialize all built-in modes
- */
- static void InitBuiltinModes();
-
static bool IsModeChar(char chr);
/** Tidy a banmask. This makes a banmask 'acceptable' if fields are left out.
* This method can be used on both IPV4 and IPV6 user masks.
*/
static void CleanMask(std::string &mask);
- /** Get the last string to be processed, as it was sent to the user or channel.
- * Use this to display a string you just sent to be parsed, as the actual output
- * may be different to what you sent after it has been 'cleaned up' by the parser.
- * @return Last parsed string, as seen by users.
- */
- const std::string& GetLastParse() const { return LastParse; }
+
+ /** Gets the last mode change to be processed. */
+ const Modes::ChangeList& GetLastChangeList() const { return LastChangeList; }
/** Add a mode to the mode parser.
* Throws a ModuleException if the mode cannot be added.
* @param user The source of the mode change, can be a server user.
* @param targetchannel Channel to apply the mode change on. NULL if changing modes on a channel.
* @param targetuser User to apply the mode change on. NULL if changing modes on a user.
- * @param changelist Modes to change in form of a Modes::ChangeList. May not process
+ * @param changelist Modes to change in form of a Modes::ChangeList. May not process
* the entire list due to MODE line length and max modes limitations.
* @param flags Optional flags controlling how the mode change is processed,
* defaults to MODE_NONE.
* is a channel mode change.
* @param parameters List of strings describing the mode change to convert to a ChangeList.
* Must be using the same format as the parameters of a MODE command.
- * @param changelist ChangeList object to populate.
- * @param beginindex Index of the first element that is part of the MODE list in the parameters
- * container. Defaults to 1.
- * @param endindex Index of the first element that is not part of the MODE list. By default,
- * the entire container is considered part of the MODE list.
+ * @param changelist ChangeList object to populate.
+ * @param beginindex Index of the first element that is part of the MODE list in the parameters
+ * container. Defaults to 1.
+ * @param endindex Index of the first element that is not part of the MODE list. By default,
+ * the entire container is considered part of the MODE list.
*/
void ModeParamsToChangeList(User* user, ModeType type, const std::vector<std::string>& parameters, Modes::ChangeList& changelist, unsigned int beginindex = 1, unsigned int endindex = UINT_MAX);
/** Find the mode handler for a given mode and type.
* @param modeletter mode letter to search for
* @param mt type of mode to search for, user or channel
- * @returns a pointer to a ModeHandler class, or NULL of there isnt a handler for the given mode
+ * @returns a pointer to a ModeHandler class, or NULL of there isn't a handler for the given mode
*/
ModeHandler* FindMode(unsigned const char modeletter, ModeType mt);
*/
PrefixMode* FindPrefix(unsigned const char pfxletter);
- /** Returns an array of modes:
- * 1. User modes
- * 2. Channel modes
- * 3. Channel modes that require a parameter when set
- * This is sent to users as the last part of the 004 numeric
- */
- const TR1NS::array<std::string, 3>& GetModeListFor004Numeric();
-
- /** Generates a list of modes, comma seperated by type:
+ /** Generates a list of modes, comma separated by type:
* 1; Listmodes EXCEPT those with a prefix
* 2; Modes that take a param when adding or removing
* 3; Modes that only take a param when adding
void ShowListModeList(User* user, Channel* chan, ModeHandler* mh);
};
-inline const TR1NS::array<std::string, 3>& ModeParser::GetModeListFor004Numeric()
-{
- return Cached004ModeList;
-}
-
inline PrefixMode* ModeHandler::IsPrefixMode()
{
return (this->type_id == MC_PREFIX ? static_cast<PrefixMode*>(this) : NULL);