]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/modules.h
Added OnUserPreInvite method for use with +V etc
[user/henk/code/inspircd.git] / include / modules.h
index 20fb5f04d7a139a424aa7169d5a56f5accc59fbc..978a9a4a6be03c7333e13dae8748b011f0e581ed 100644 (file)
@@ -1,23 +1,53 @@
-/*
-
-
-
-*/
+/*       +------------------------------------+
+ *       | Inspire Internet Relay Chat Daemon |
+ *       +------------------------------------+
+ *
+ *  Inspire is copyright (C) 2002-2004 ChatSpike-Dev.
+ *                       E-mail:
+ *                <brain@chatspike.net>
+ *               <Craig@chatspike.net>
+ *     
+ * Written by Craig Edwards, Craig McLure, and others.
+ * This program is free but copyrighted software; see
+ *            the file COPYING for details.
+ *
+ * ---------------------------------------------------
+ */
 
 
 #ifndef __PLUGIN_H
 #define __PLUGIN_H
 
+// log levels
+
 #define DEBUG 10
 #define VERBOSE 20
 #define DEFAULT 30
 #define SPARSE 40
 #define NONE 50
 
+// used with OnExtendedMode() method of modules
+
 #define MT_CHANNEL 1
 #define MT_CLIENT 2
 #define MT_SERVER 3
 
+// used with OnAccessCheck() method of modules
+
+#define ACR_DEFAULT 0          // Do default action (act as if the module isnt even loaded)
+#define ACR_DENY 1             // deny the action
+#define ACR_ALLOW 2            // allow the action
+
+#define AC_KICK 0              // a user is being kicked
+#define AC_DEOP 1              // a user is being deopped
+#define AC_OP 2                        // a user is being opped
+#define AC_VOICE 3             // a user is being voiced
+#define AC_DEVOICE 4           // a user is being devoiced
+#define AC_HALFOP 5            // a user is being halfopped
+#define AC_DEHALFOP 6          // a user is being dehalfopped
+#define AC_INVITE 7            // a user is being invited
+#define AC_GENERAL_MODE 8      // a user channel mode is being changed
+
 #include "dynamic.h"
 #include "base.h"
 #include "ctables.h"
 typedef std::deque<std::string> file_cache;
 typedef file_cache string_list;
 
+/** Holds a list of users in a channel
+ */
+typedef std::deque<userrec*> chanuserlist;
+
 
 // This #define allows us to call a method in all
 // loaded modules in a readable simple way, e.g.:
@@ -46,12 +80,12 @@ typedef file_cache string_list;
 #define FOREACH_RESULT(x) { MOD_RESULT = 0; \
                        for (int i = 0; i <= MODCOUNT; i++) { \
                        int res = modules[i]->x ; \
-                       if (res) { \
+                       if (res != 0) { \
                                MOD_RESULT = res; \
                                break; \
                        } \
                } \
-   } 
+       
    
 // *********************************************************************************************
 
@@ -159,9 +193,11 @@ class Module : public classbase
         * This method is the lowest level of handler available to a module. It will be called with raw
         * data which is passing through a connected socket. If you wish, you may munge this data by changing
         * the string parameter "raw". If you do this, after your function exits it will immediately be
-        * cut down to 510 characters plus a carriage return and linefeed.
+        * cut down to 510 characters plus a carriage return and linefeed. For INBOUND messages only (where
+        * inbound is set to true) the value of user will be the userrec of the connection sending the
+        * data. This is not possible for outbound data because the data may be being routed to multiple targets.
         */
-       virtual void OnServerRaw(std::string &raw, bool inbound);
+       virtual void OnServerRaw(std::string &raw, bool inbound, userrec* user);
 
        /** Called whenever an extended mode is to be processed.
         * The type parameter is MT_SERVER, MT_CLIENT or MT_CHANNEL, dependent on where the mode is being
@@ -172,12 +208,13 @@ class Module : public classbase
         * If the mode is a channel mode, target is a chanrec*, and if it is a user mode, target is a userrec*.
         * You must cast this value yourself to make use of it.
         */
-       virtual bool OnExtendedMode(userrec* user, void* target, char modechar, int type, bool mode_on, string_list &params);
+       virtual int OnExtendedMode(userrec* user, void* target, char modechar, int type, bool mode_on, string_list &params);
        
        /** Called whenever a user is about to join a channel, before any processing is done.
-        * Returning any nonzero value from this function stops the process immediately, causing no
+        * Returning a value of 1 from this function stops the process immediately, causing no
         * output to be sent to the user by the core. If you do this you must produce your own numerics,
-        * notices etc. This is useful for modules which may want to mimic +b, +k, +l etc.
+        * notices etc. This is useful for modules which may want to mimic +b, +k, +l etc. Returning -1 from
+        * this function forces the join to be allowed, bypassing restrictions such as banlists, invite, keys etc.
         *
         * IMPORTANT NOTE!
         *
@@ -201,7 +238,7 @@ class Module : public classbase
         * It is purposefully not possible to modify any info that has already been output, or halt the list.
         * You must write a 371 numeric to the user, containing your info in the following format:
         *
-        * <nick> :information here
+        * &lt;nick&gt; :information here
         */
        virtual void OnInfo(userrec* user);
        
@@ -211,6 +248,13 @@ class Module : public classbase
         */
        virtual void OnWhois(userrec* source, userrec* dest);
        
+       /** Called whenever a user is about to invite another user into a channel, before any processing is done.
+        * Returning any nonzero value from this function stops the process immediately, causing no
+        * output to be sent to the user by the core. If you do this you must produce your own numerics,
+        * notices etc. This is useful for modules which may want to filter invites to channels.
+        */
+       virtual int OnUserPreInvite(userrec* source,userrec* dest,chanrec* channel);
+       
        /** Called whenever a user is about to PRIVMSG A user or a channel, before any processing is done.
         * Returning any nonzero value from this function stops the process immediately, causing no
         * output to be sent to the user by the core. If you do this you must produce your own numerics,
@@ -230,6 +274,52 @@ class Module : public classbase
         * of where the message is destined to be sent.
         */
        virtual int OnUserPreNotice(userrec* user,void* dest,int target_type, std::string text);
+       
+       /** Called before any nickchange, local or remote. This can be used to implement Q-lines etc.
+        * Please note that although you can see remote nickchanges through this function, you should
+        * NOT make any changes to the userrec if the user is a remote user as this may cause a desnyc.
+        * check user->server before taking any action (including returning nonzero from the method).
+        * If your method returns nonzero, the nickchange is silently forbidden, and it is down to your
+        * module to generate some meaninful output.
+        */
+       virtual int OnUserPreNick(userrec* user, std::string newnick);
+       
+       /** Called before an action which requires a channel privilage check.
+        * This function is called before many functions which check a users status on a channel, for example
+        * before opping a user, deopping a user, kicking a user, etc.
+        * There are several values for access_type which indicate for what reason access is being checked.
+        * These are:<br><br>
+        * AC_KICK (0) - A user is being kicked<br>
+        * AC_DEOP (1) - a user is being deopped<br>
+        * AC_OP (2) - a user is being opped<br>
+        * AC_VOICE (3) - a user is being voiced<br>
+        * 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_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
+        * the action. Please note that in the case of some access checks (such as AC_GENERAL_MODE) access may be
+        * denied 'upstream' causing other checks such as AC_DEOP to not be reached. Be very careful with use of the
+        * AC_GENERAL_MODE type, as it may inadvertently override the behaviour of other modules. When the access_type
+        * is AC_GENERAL_MODE, the destination of the mode will be NULL (as it has not yet been determined).
+        */
+
+       virtual int OnAccessCheck(userrec* source,userrec* dest,chanrec* channel,int access_type);
+       /** Called during a netburst to sync user data.
+        * This is called during the netburst on a per-user basis. You should use this call to up any special
+        * user-related things which are implemented by your module, e.g. sending listmodes. You may return
+        * multiple commands in the string_list.
+        */
+       virtual string_list OnUserSync(userrec* user);
+
+       /** Called during a netburst to sync channel data.
+        * This is called during the netburst on a per-channel basis. You should use this call to up any special
+        * channel-related things which are implemented by your module, e.g. sending listmodes. You may return
+        * multiple commands in the string_list.
+        */
+       virtual string_list OnChannelSync(chanrec* chan);
 };
 
 
@@ -336,6 +426,10 @@ class Server : public classbase
         * representing the user's privilages upon the channel you specify.
         */
        virtual std::string ChanMode(userrec* User, chanrec* Chan);
+       /** Checks if a user is on a channel.
+        * This function will return true or false to indicate if user 'User' is on channel 'Chan'.
+        */
+       virtual bool IsOnChannel(userrec* User, chanrec* Chan);
        /** Returns the server name of the server where the module is loaded.
         */
        virtual std::string GetServerName();
@@ -348,7 +442,7 @@ class Server : public classbase
         * server where the module is loaded.
         */
        virtual Admin GetAdmin();
-       /** Adds an extended mode letter which is parsed by a module
+       /** 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.
@@ -368,6 +462,29 @@ class Server : public classbase
         */
        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);
+       
        /** 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
         * module which is is of type handlerfunc:
@@ -486,8 +603,29 @@ class Server : public classbase
         * linked servers.
         */     
        virtual void ChangeGECOS(userrec* user, std::string gecos);
+       
+       /** Returns true if the servername you give is ulined.
+        * ULined servers have extra privilages. They are allowed to change nicknames on remote servers,
+        * change modes of clients which are on remote servers and set modes of channels where there are
+        * no channel operators for that channel on the ulined server, amongst other things. Ulined server
+        * data is also broadcast across the mesh at all times as opposed to selectively messaged in the
+        * case of normal servers, as many ulined server types (such as services) do not support meshed
+        * links and must operate in this manner.
+        */
+       virtual bool IsUlined(std::string server);
+       
+       /** Fetches the userlist of a channel. This function must be here and not a member of userrec or
+        * chanrec due to include constraints.
+        */
+       virtual chanuserlist GetUsers(chanrec* chan);
+
 };
 
+#define CONF_NOT_A_NUMBER      0x000010
+#define CONF_NOT_UNSIGNED      0x000080
+#define CONF_VALUE_NOT_FOUND   0x000100
+#define CONF_FILE_NOT_FOUND    0x000200
+
 /** Allows reading of values from configuration files
  * This class allows a module to read from either the main configuration file (inspircd.conf) or from
  * a module-specified configuration file. It may either be instantiated with one parameter or none.
@@ -505,7 +643,8 @@ class ConfigReader : public classbase
        std::stringstream *cache;
        /** Used to store errors
         */
-       bool error;
+       bool readerror;
+       long error;
        
   public:
        /** Default constructor.
@@ -526,6 +665,26 @@ class ConfigReader : public classbase
         * exist in the config file, index indicates which of the values to retrieve.
         */
        std::string ReadValue(std::string tag, std::string name, int index);
+       /** Retrieves a boolean value from the config file.
+        * This method retrieves a boolean value from the config file. Where multiple copies of the tag
+        * exist in the config file, index indicates which of the values to retrieve. The values "1", "yes"
+        * and "true" in the config file count as true to ReadFlag, and any other value counts as false.
+        */
+       bool ReadFlag(std::string tag, std::string name, int index);
+       /** Retrieves an integer value from the config file.
+        * This method retrieves an integer value from the config file. Where multiple copies of the tag
+        * exist in the config file, index indicates which of the values to retrieve. Any invalid integer
+        * values in the tag will cause the objects error value to be set, and any call to GetError() will
+        * return CONF_INVALID_NUMBER to be returned. needs_unsigned is set if the number must be unsigned.
+        * If a signed number is placed into a tag which is specified unsigned, 0 will be returned and GetError()
+        * will return CONF_NOT_UNSIGNED
+        */
+       long ReadInteger(std::string tag, std::string name, int index, bool needs_unsigned);
+       /** Returns the last error to occur.
+        * Valid errors can be found by looking in modules.h. Any nonzero value indicates an error condition.
+        * A call to GetError() resets the error flag back to 0.
+        */
+       long GetError();
        /** Counts the number of times a given tag appears in the config file.
         * This method counts the number of times a tag appears in a config file, for use where
         * there are several tags of the same kind, e.g. with opers and connect types. It can be