diff options
-rw-r--r-- | include/modules.h | 71 | ||||
-rw-r--r-- | include/typedefs.h | 2 | ||||
-rw-r--r-- | src/modules.cpp | 129 |
3 files changed, 6 insertions, 196 deletions
diff --git a/include/modules.h b/include/modules.h index a04fd0c1e..4ba987fd3 100644 --- a/include/modules.h +++ b/include/modules.h @@ -74,6 +74,7 @@ enum TargetTypeFlags { #include <sstream> #include <typeinfo> #include "timer.h" +#include "mode.h" class Server; class ServerConfig; @@ -265,22 +266,6 @@ class Event : public ModuleMessage char* Send(); }; -/** Holds an extended mode's details. - * Used internally by modules.cpp - */ -class ExtMode : public classbase -{ - public: - char modechar; - int type; - bool needsoper; - int params_when_on; - int params_when_off; - bool list; - ExtMode(char mc, int ty, bool oper, int p_on, int p_off) : modechar(mc), type(ty), needsoper(oper), params_when_on(p_on), params_when_off(p_off), list(false) { }; -}; - - /** This class can be used on its own to represent an exception, or derived to represent a module-specific exception. * When a module whishes to abort, e.g. within a constructor, it should throw an exception using ModuleException or * a class derived from ModuleException. If a module throws an exception during its constructor, the module will not @@ -472,7 +457,7 @@ class Module : public classbase * @param user The user issuing the mode * @param target The user or channel having the mode set on them * @param modechar The mode character being set - * @param type The type of mode (user or channel) being set + * @param type The type of 4mode (user or channel) being set * @param mode_on True if the mode is being set, false if it is being unset * @param params A list of parameters for any channel mode (currently supports either 0 or 1 parameters) */ @@ -907,7 +892,7 @@ class Module : public classbase * AC_DEVOICE (4) - a user is being devoiced<br> * AC_HALFOP (5) - a user is being halfopped<br> * AC_DEHALFOP (6) - a user is being dehalfopped<br> - * AC_INVITE (7) - a user is being invited<br> + * AC_INVITE () - a user is being invited<br> * AC_GENERAL_MODE (8) - a user channel mode is being changed<br><br> * Upon returning from your function you must return either ACR_DEFAULT, to indicate the module wishes * to do nothing, or ACR_DENY where approprate to deny the action, and ACR_ALLOW where appropriate to allow @@ -1471,48 +1456,7 @@ class Server : public classbase */ virtual Admin GetAdmin(); - /** Adds an extended mode letter which is parsed by a module. - * This allows modules to add extra mode letters, e.g. +x for hostcloak. - * the "type" parameter is either MT_CHANNEL, MT_CLIENT, or MT_SERVER, to - * indicate wether the mode is a channel mode, a client mode, or a server mode. - * requires_oper is used with MT_CLIENT type modes only to indicate the mode can only - * be set or unset by an oper. If this is used for MT_CHANNEL type modes it is ignored. - * params_when_on is the number of modes to expect when the mode is turned on - * (for type MT_CHANNEL only), e.g. with mode +k, this would have a value of 1. - * the params_when_off value has a similar value to params_when_on, except it indicates - * the number of parameters to expect when the mode is disabled. Modes which act in a similar - * way to channel mode +l (e.g. require a parameter to enable, but not to disable) should - * use this parameter. The function returns false if the mode is unavailable, and will not - * attempt to allocate another character, as this will confuse users. This also means that - * as only one module can claim a specific mode character, the core does not need to keep track - * of which modules own which modes, which speeds up operation of the server. In this version, - * a mode can have at most one parameter, attempting to use more parameters will have undefined - * effects. - */ - virtual bool AddExtendedMode(char modechar, int type, bool requires_oper, int params_when_on, int params_when_off); - - /** Adds an extended mode letter which is parsed by a module and handled in a list fashion. - * This call is used to implement modes like +q and +a. The characteristics of these modes are - * as follows: - * - * (1) They are ALWAYS on channels, not on users, therefore their type is MT_CHANNEL - * - * (2) They always take exactly one parameter when being added or removed - * - * (3) They can be set multiple times, usually on users in channels - * - * (4) The mode and its parameter are NOT stored in the channels modes structure - * - * It is down to the module handling the mode to maintain state and determine what 'items' (e.g. users, - * or a banlist) have the mode set on them, and process the modes at the correct times, e.g. during access - * checks on channels, etc. When the extended mode is triggered the OnExtendedMode method will be triggered - * as above. Note that the target you are given will be a channel, if for example your mode is set 'on a user' - * (in for example +a) you must use Server::Find to locate the user the mode is operating on. - * Your mode handler may return 1 to handle the mode AND tell the core to display the mode change, e.g. - * '+aaa one two three' in the case of the mode for 'two', or it may return -1 to 'eat' the mode change, - * so the above example would become '+aa one three' after processing. - */ - virtual bool AddExtendedListMode(char modechar); + virtual bool AddMode(ModeHandler* mh, const unsigned char modechar); /** Adds a command to the command table. * This allows modules to add extra commands into the command table. You must place a function within your @@ -1976,11 +1920,4 @@ typedef DLLFactory<ModuleFactory> ircd_module; typedef std::vector<Module*> ModuleList; typedef std::vector<ircd_module*> FactoryList; -bool ModeDefined(char c, int i); -bool ModeDefinedOper(char c, int i); -int ModeDefinedOn(char c, int i); -int ModeDefinedOff(char c, int i); -void ModeMakeList(char modechar); -bool ModeIsListMode(char modechar, int type); - #endif diff --git a/include/typedefs.h b/include/typedefs.h index cd8c82039..4b6d22b98 100644 --- a/include/typedefs.h +++ b/include/typedefs.h @@ -17,8 +17,6 @@ typedef nspace::hash_map<std::string, userrec*, nspace::hash<string>, irc::StrHa typedef nspace::hash_map<std::string, chanrec*, nspace::hash<string>, irc::StrHashComp> chan_hash; typedef std::vector<std::string> servernamelist; -typedef std::vector<ExtMode> ExtModeList; -typedef ExtModeList::iterator ExtModeListIter; typedef std::deque<std::string> file_cache; #endif diff --git a/src/modules.cpp b/src/modules.cpp index 2f236b1c9..e53f0c775 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -59,96 +59,8 @@ extern command_table cmdlist; class Server; -ExtModeList EMode; featurelist Features; -// returns true if an extended mode character is in use -bool ModeDefined(char modechar, int type) -{ - for (ExtModeListIter i = EMode.begin(); i < EMode.end(); i++) - { - if ((i->modechar == modechar) && (i->type == type)) - { - return true; - } - } - return false; -} - -bool ModeIsListMode(char modechar, int type) -{ - for (ExtModeListIter i = EMode.begin(); i < EMode.end(); i++) - { - if ((i->modechar == modechar) && (i->type == type) && (i->list == true)) - { - return true; - } - } - return false; -} - -bool ModeDefinedOper(char modechar, int type) -{ - for (ExtModeListIter i = EMode.begin(); i < EMode.end(); i++) - { - if ((i->modechar == modechar) && (i->type == type) && (i->needsoper == true)) - { - return true; - } - } - return false; -} - -// returns number of parameters for a custom mode when it is switched on -int ModeDefinedOn(char modechar, int type) -{ - for (ExtModeListIter i = EMode.begin(); i < EMode.end(); i++) - { - if ((i->modechar == modechar) && (i->type == type)) - { - return i->params_when_on; - } - } - return 0; -} - -// returns number of parameters for a custom mode when it is switched on -int ModeDefinedOff(char modechar, int type) -{ - for (ExtModeListIter i = EMode.begin(); i < EMode.end(); i++) - { - if ((i->modechar == modechar) && (i->type == type)) - { - return i->params_when_off; - } - } - return 0; -} - -// returns true if an extended mode character is in use -bool DoAddExtendedMode(char modechar, int type, bool requires_oper, int params_on, int params_off) -{ - if (ModeDefined(modechar,type)) { - return false; - } - EMode.push_back(ExtMode(modechar,type,requires_oper,params_on,params_off)); - return true; -} - -// turns a mode into a listmode -void ModeMakeList(char modechar) -{ - for (ExtModeListIter i = EMode.begin(); i < EMode.end(); i++) - { - if ((i->modechar == modechar) && (i->type == MT_CHANNEL)) - { - i->list = true; - return; - } - } - return; -} - // version is a simple class for holding a modules version number Version::Version(int major, int minor, int revision, int build, int flags) : Major(major), Minor(minor), Revision(revision), Build(build), Flags(flags) { }; @@ -668,45 +580,9 @@ Admin Server::GetAdmin() } - -bool Server::AddExtendedMode(char modechar, int type, bool requires_oper, int params_when_on, int params_when_off) -{ - if (((modechar >= 'A') && (modechar <= 'Z')) || ((modechar >= 'a') && (modechar <= 'z'))) - { - if (type == MT_SERVER) - { - ModuleException e("Modes of type MT_SERVER are reserved for future expansion"); - throw(e); - return false; - } - if (((params_when_on>0) || (params_when_off>0)) && (type == MT_CLIENT)) - { - ModuleException e("Parameters on MT_CLIENT modes are not supported"); - throw(e); - return false; - } - if ((params_when_on>1) || (params_when_off>1)) - { - ModuleException e("More than one parameter for an MT_CHANNEL mode is not yet supported"); - throw(e); - return false; - } - return DoAddExtendedMode(modechar,type,requires_oper,params_when_on,params_when_off); - } - else - { - ModuleException e("Muppet modechar detected."); - throw(e); - } - return false; -} - -bool Server::AddExtendedListMode(char modechar) +bool Server::AddMode(ModeHandler* mh, const unsigned char mode) { - bool res = DoAddExtendedMode(modechar,MT_CHANNEL,false,1,1); - if (res) - ModeMakeList(modechar); - return res; + return ServerInstance->ModeGrok->AddMode(mh,mode); } int Server::CountUsers(chanrec* c) @@ -714,7 +590,6 @@ int Server::CountUsers(chanrec* c) return usercount(c); } - bool Server::UserToPseudo(userrec* user, const std::string &message) { unsigned int old_fd = user->fd; |