PARAM_ALWAYS
};
+class PrefixMode;
+class ListModeBase;
+
/** Each mode is implemented by ONE ModeHandler class.
* You must derive ModeHandler and add the child class to
* the list of modes handled by the ircd, using
enum Class
{
MC_PREFIX,
+ MC_LIST,
MC_OTHER
};
*/
char mode;
- /** Mode prefix, or 0
- */
- char prefix;
-
/**
* True if the mode requires oper status
* to set.
*/
int levelrequired;
- /** The prefix rank of this mode, used to compare prefix
- * modes
- */
- unsigned int prefixrank;
-
public:
/**
* The constructor for ModeHandler initalizes the mode handler.
* Returns true if the mode is a list mode
*/
bool IsListMode() const { return list; }
+
/**
- * Mode prefix or 0. If this is defined, you should
- * also implement GetPrefixRank() to return an integer
- * value for this mode prefix.
+ * Check whether this mode is a prefix mode
+ * @return non-NULL if this mode is a prefix mode, NULL otherwise
*/
- inline char GetPrefix() const { return prefix; }
+ PrefixMode* IsPrefixMode();
+
/**
- * Get the 'value' of this modes prefix.
- * determines which to display when there are multiple.
- * The mode with the highest value is ranked first. See the
- * PrefixModeValue enum and Channel::GetPrefixValue() for
- * more information.
+ * Check whether this mode handler inherits from ListModeBase
+ * @return non-NULL if this mode handler inherits from ListModeBase, NULL otherwise
*/
- unsigned int GetPrefixRank() const { return prefixrank; }
+ ListModeBase* IsListModeBase();
+
/**
* Returns the mode's type
*/
* for example changing the topic on a channel having +t set requires a rank that is >= than the rank of a halfop,
* but there is no such restriction when +t isn't set.
*/
-class PrefixMode : public ModeHandler
+class CoreExport PrefixMode : public ModeHandler
{
+ protected:
+ /** The prefix character granted by this mode. '@' for op, '+' for voice, etc.
+ * If 0, this mode does not have a visible prefix character.
+ */
+ char prefix;
+
+ /** The prefix rank of this mode, used to compare prefix
+ * modes
+ */
+ unsigned int prefixrank;
+
public:
/**
* Constructor
* @param stack The mode stack to add the mode change to
*/
void RemoveMode(Channel* chan, irc::modestacker& stack);
+
+ /**
+ * Mode prefix or 0. If this is defined, you should
+ * also implement GetPrefixRank() to return an integer
+ * value for this mode prefix.
+ */
+ char GetPrefix() const { return prefix; }
+
+ /**
+ * Get the 'value' of this modes prefix.
+ * determines which to display when there are multiple.
+ * The mode with the highest value is ranked first. See the
+ * PrefixModeValue enum and Channel::GetPrefixValue() for
+ * more information.
+ */
+ unsigned int GetPrefixRank() const { return prefixrank; }
};
/** A prebuilt mode handler which handles a simple user mode, e.g. no parameters, usable by any user, with no extra
*/
ModeHandler* modehandlers[256];
+ /** Lists of mode handlers by type
+ */
+ struct
+ {
+ /** List of mode handlers that inherit from ListModeBase
+ */
+ std::vector<ListModeBase*> list;
+
+ /** List of mode handlers that inherit from PrefixMode
+ */
+ std::vector<PrefixMode*> prefix;
+ } mhlist;
+
/** Mode watcher classes
*/
std::multimap<std::string, ModeWatcher*> modewatchermap;
std::string Cached004ModeList;
public:
+ typedef std::vector<ListModeBase*> ListModeList;
+ typedef std::vector<PrefixMode*> PrefixModeList;
+
typedef unsigned int ModeProcessFlag;
enum ModeProcessFlags
{
*/
ModeHandler* FindMode(unsigned const char modeletter, ModeType mt);
+ /** Find the mode handler for the given prefix mode
+ * @param modeletter The mode letter to search for
+ * @return A pointer to the PrefixMode or NULL if the mode wasn't found or it isn't a prefix mode
+ */
+ PrefixMode* FindPrefixMode(unsigned char modeletter);
+
/** Find a mode handler by its prefix.
* If there is no mode handler with the given prefix, NULL will be returned.
* @param pfxletter The prefix to find, e.g. '@'
* @return The mode handler which handles this prefix, or NULL if there is none.
*/
- ModeHandler* FindPrefix(unsigned const char pfxletter);
+ PrefixMode* FindPrefix(unsigned const char pfxletter);
/** Returns a list of modes, space seperated by type:
* 1. User modes
* just the "@%+" part if the parameter false
*/
std::string BuildPrefixes(bool lettersAndModes = true);
+
+ /** Get a list of all mode handlers that inherit from ListModeBase
+ * @return A list containing ListModeBase modes
+ */
+ const ListModeList& GetListModes() const { return mhlist.list; }
+
+ /** Get a list of all prefix modes
+ * @return A list containing all prefix modes
+ */
+ const PrefixModeList& GetPrefixModes() const { return mhlist.prefix; }
};
inline const std::string& ModeParser::GetModeListFor004Numeric()
{
return Cached004ModeList;
}
+
+inline PrefixMode* ModeHandler::IsPrefixMode()
+{
+ return (this->type_id == MC_PREFIX ? static_cast<PrefixMode*>(this) : NULL);
+}
+
+inline ListModeBase* ModeHandler::IsListModeBase()
+{
+ return (this->type_id == MC_LIST ? reinterpret_cast<ListModeBase*>(this) : NULL);
+}