summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/modules.h71
-rw-r--r--include/typedefs.h2
-rw-r--r--src/modules.cpp129
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;