]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/modules.h
Move MODENOTICE command to a command module
[user/henk/code/inspircd.git] / include / modules.h
index 96506f5982f48562917e07ffa1e2dbd42e74bbc7..dc59abdd91514be96dcfd3305293641ec3690377 100644 (file)
 #include "mode.h"
 #include "dns.h"
 
-class XLine;
-
 /** Used to define a set of behavior bits for a module
  */
 enum ModuleFlags {
        VF_NONE = 0,            // module is not special at all
        VF_STATIC = 1,          // module is static, cannot be /unloadmodule'd
        VF_VENDOR = 2,          // module is a vendor module (came in the original tarball, not 3rd party)
-       VF_SERVICEPROVIDER = 4, // module provides a service to other modules (can be a dependency)
-       VF_COMMON = 8,          // module needs to be common on all servers in a network to link
-       VF_OPTCOMMON = 16,      // module should be common on all servers for unsurprising behavior
-       VF_CORE = 32            // module is a core command, can be assumed loaded on all servers
-};
-
-/** Used with SendToMode()
- */
-enum WriteModeFlags {
-       WM_AND = 1,
-       WM_OR = 2
+       VF_COMMON = 4,          // module needs to be common on all servers in a network to link
+       VF_OPTCOMMON = 8,       // module should be common on all servers for unsurprising behavior
+       VF_CORE = 16            // module is a core command, can be assumed loaded on all servers
 };
 
 /** Used to represent an event type, for user, channel or server
@@ -74,26 +64,26 @@ struct ModResult {
        int res;
        ModResult() : res(0) {}
        explicit ModResult(int r) : res(r) {}
-       bool operator==(const ModResult& r) const
+       inline bool operator==(const ModResult& r) const
        {
                return res == r.res;
        }
-       bool operator!=(const ModResult& r) const
+       inline bool operator!=(const ModResult& r) const
        {
                return res != r.res;
        }
-       bool operator!() const
+       inline bool operator!() const
        {
                return !res;
        }
-       bool check(bool def) const
+       inline bool check(bool def) const
        {
                return (res == 1 || (res == 0 && def));
        }
        /**
         * Merges two results, preferring ALLOW to DENY
         */
-       ModResult operator+(const ModResult& r) const
+       inline ModResult operator+(const ModResult& r) const
        {
                if (res == r.res || r.res == 0)
                        return *this;
@@ -107,30 +97,7 @@ struct ModResult {
 /** If you change the module API in any way, increment this value.
  * This MUST be a pure integer, with no parenthesis
  */
-#define API_VERSION 134
-
-class ServerConfig;
-
-/* Forward-delacare module for ModuleMessage etc
- */
-class Module;
-class InspIRCd;
-
-/** A set of strings.
- */
-typedef std::vector<std::string> string_list;
-
-/** Holds a list of 'published features' for modules.
- */
-typedef std::map<std::string,Module*> featurelist;
-
-/** Holds a list of modules which implement an interface
- */
-typedef std::deque<Module*> modulelist;
-
-/** Holds a list of all modules which implement interfaces, by interface name
- */
-typedef std::map<std::string, std::pair<int, modulelist> > interfacelist;
+#define API_VERSION 137
 
 /**
  * This #define allows us to call a method in all
@@ -199,29 +166,6 @@ do { \
        WHILE_EACH_HOOK(n); \
 } while (0)
 
-/** Represents a non-local user.
- * (in fact, any FD less than -1 does)
- */
-#define FD_MAGIC_NUMBER -42
-/** Represents a fake user (i.e. a server)
- */
-#define FD_FAKEUSER_NUMBER -7
-
-/* Useful macros */
-
-/** Is a local user */
-#define IS_LOCAL(x) (x->GetFd() > -1)
-/** Is a remote user */
-#define IS_REMOTE(x) (x->GetFd() < 0)
-/** Is a fake user */
-#define IS_SERVER(x) (x->GetFd() == FD_FAKEUSER_NUMBER)
-/** Is a module created user */
-#define IS_MODULE_CREATED(x) (x->GetFd() == FD_MAGIC_NUMBER)
-/** Is an oper */
-#define IS_OPER(x) (!x->oper.empty())
-/** Is away */
-#define IS_AWAY(x) (!x->awaymsg.empty())
-
 /** Holds a module's Version information.
  * The members (set by the constructor only) indicate details as to the version number
  * of a module. A class of type Version is returned by the GetVersion method of the Module class.
@@ -267,10 +211,10 @@ class CoreExport Request : public classbase
        /** This is a pointer to the sender of the message, which can be used to
         * directly trigger events, or to create a reply.
         */
-       Module* const source;
+       ModuleRef source;
        /** The single destination of the Request
         */
-       Module* const dest;
+       ModuleRef dest;
 
        /** Create a new Request
         * This is for the 'new' way of defining a subclass
@@ -297,7 +241,7 @@ class CoreExport Event : public classbase
        /** This is a pointer to the sender of the message, which can be used to
         * directly trigger events, or to create a reply.
         */
-       Module* const source;
+       ModuleRef source;
        /** The event identifier.
         * This is arbitary text which should be used to distinguish
         * one type of event from another.
@@ -314,7 +258,7 @@ class CoreExport Event : public classbase
        void Send();
 };
 
-/** Priority types which can be returned from Module::Prioritize()
+/** Priority types which can be used by Module::Prioritize()
  */
 enum Priority { PRIORITY_FIRST, PRIORITY_DONTCARE, PRIORITY_LAST, PRIORITY_BEFORE, PRIORITY_AFTER };
 
@@ -327,12 +271,12 @@ enum Implementation
        I_OnSendSnotice, I_OnUserPreJoin, I_OnUserPreKick, I_OnUserKick, I_OnOper, I_OnInfo, I_OnWhois,
        I_OnUserPreInvite, I_OnUserInvite, I_OnUserPreMessage, I_OnUserPreNotice, I_OnUserPreNick,
        I_OnUserMessage, I_OnUserNotice, I_OnMode, I_OnGetServerDescription, I_OnSyncUser,
-       I_OnSyncChannel, I_OnDecodeMetaData, I_OnWallops,
+       I_OnSyncChannel, I_OnDecodeMetaData, I_OnWallops, I_OnAcceptConnection,
        I_OnChangeHost, I_OnChangeName, I_OnAddLine, I_OnDelLine, I_OnExpireLine,
        I_OnUserPostNick, I_OnPreMode, I_On005Numeric, I_OnKill, I_OnRemoteKill, I_OnLoadModule,
        I_OnUnloadModule, I_OnBackgroundTimer, I_OnPreCommand, I_OnCheckReady, I_OnCheckInvite,
        I_OnRawMode, I_OnCheckKey, I_OnCheckLimit, I_OnCheckBan, I_OnCheckChannelBan, I_OnExtBanCheck,
-       I_OnStats, I_OnChangeLocalUserHost, I_OnChangeLocalUserGecos, I_OnPreTopicChange,
+       I_OnStats, I_OnChangeLocalUserHost, I_OnPreTopicChange,
        I_OnPostTopicChange, I_OnEvent, I_OnGlobalOper, I_OnPostConnect, I_OnAddBan,
        I_OnDelBan, I_OnChangeLocalUserGECOS, I_OnUserRegister, I_OnChannelPreDelete, I_OnChannelDelete,
        I_OnPostOper, I_OnSyncNetwork, I_OnSetAway, I_OnUserList, I_OnPostCommand, I_OnPostJoin,
@@ -342,14 +286,12 @@ enum Implementation
        I_END
 };
 
-class ConfigReader;
-
 /** Base class for all InspIRCd modules
  *  This class is the base class for InspIRCd modules. All modules must inherit from this class,
  *  its methods will be called when irc server events occur. class inherited from module must be
  *  instantiated by the ModuleFactory class (see relevent section) for the module to be initialised.
  */
-class CoreExport Module : public classbase
+class CoreExport Module : public classbase, public usecountbase
 {
  public:
        /** File that this module was loaded from
@@ -390,7 +332,7 @@ class CoreExport Module : public classbase
         * The details of the connecting user are available to you in the parameter User *user
         * @param user The user who is connecting
         */
-       virtual void OnUserConnect(User* user);
+       virtual void OnUserConnect(LocalUser* user);
 
        /** Called when a user quits.
         * The details of the exiting user are available to you in the parameter User *user
@@ -408,7 +350,7 @@ class CoreExport Module : public classbase
         * which might assign resources to user, such as dns lookups, objects and sockets.
         * @param user The user who is disconnecting
         */
-       virtual void OnUserDisconnect(User* user);
+       virtual void OnUserDisconnect(LocalUser* user);
 
        /** Called whenever a channel is about to be deleted
         * @param chan The channel being deleted
@@ -981,7 +923,7 @@ class CoreExport Module : public classbase
         * @param user The user to check
         * @return true to indicate readiness, false if otherwise
         */
-       virtual ModResult OnCheckReady(User* user);
+       virtual ModResult OnCheckReady(LocalUser* user);
 
        /** Called whenever a user is about to register their connection (e.g. before the user
         * is sent the MOTD etc). Modules can use this method if they are performing a function
@@ -992,7 +934,7 @@ class CoreExport Module : public classbase
         * @param user The user registering
         * @return 1 to indicate user quit, 0 to continue
         */
-       virtual ModResult OnUserRegister(User* user);
+       virtual ModResult OnUserRegister(LocalUser* user);
 
        /** Called whenever a user joins a channel, to determine if invite checks should go ahead or not.
         * This method will always be called for each join, wether or not the channel is actually +i, and
@@ -1081,7 +1023,7 @@ class CoreExport Module : public classbase
         * @param newhost The new hostname
         * @return 1 to deny the host change, 0 to allow
         */
-       virtual ModResult OnChangeLocalUserHost(User* user, const std::string &newhost);
+       virtual ModResult OnChangeLocalUserHost(LocalUser* user, const std::string &newhost);
 
        /** Called whenever a change of a local users GECOS (fullname field) is attempted.
         * return 1 to deny the name change, or 0 to allow it.
@@ -1089,7 +1031,7 @@ class CoreExport Module : public classbase
         * @param newhost The new GECOS
         * @return 1 to deny the GECOS change, 0 to allow
         */
-       virtual ModResult OnChangeLocalUserGECOS(User* user, const std::string &newhost);
+       virtual ModResult OnChangeLocalUserGECOS(LocalUser* user, const std::string &newhost);
 
        /** Called before a topic is changed.
         * Return 1 to deny the topic change, 0 to check details on the change, -1 to let it through with no checks
@@ -1171,7 +1113,16 @@ class CoreExport Module : public classbase
         * @param user The item to possibly install the I/O hook on
         * @param via The port that <user> connected on
         */
-       virtual void OnHookIO(StreamSocket*, ListenSocketBase* via);
+       virtual void OnHookIO(StreamSocket*, ListenSocket* via);
+
+       /** Called when a port accepts a connection
+        * Return MOD_RES_ACCEPT if you have used the file descriptor.
+        * @param fd The file descriptor returned from accept()
+        * @param from The local port the user connected to
+        * @param client The client IP address and port
+        * @param server The server IP address and port
+        */
+       virtual ModResult OnAcceptConnection(int fd, ListenSocket* from, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server);
 
        /** Called immediately after any connection is accepted. This is intended for raw socket
         * processing (e.g. modules which wrap the tcp connection within another library) and provides
@@ -1297,7 +1248,7 @@ class CoreExport Module : public classbase
  * Constructing the class using one parameter allows you to specify a path to your own configuration
  * file, otherwise, inspircd.conf is read.
  */
-class CoreExport ConfigReader : public classbase
+class CoreExport ConfigReader : public interfacebase
 {
   protected:
        /** Error code
@@ -1461,7 +1412,7 @@ typedef IntModuleList::iterator EventHandlerIter;
 /** ModuleManager takes care of all things module-related
  * in the core.
  */
-class CoreExport ModuleManager : public classbase
+class CoreExport ModuleManager
 {
  private:
        /** Holds a string describing the last module error to occur