]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/modules.h
Implement <options:prefixpart|suffixpart|fixedpart>
[user/henk/code/inspircd.git] / include / modules.h
index 1e2d1e3c5f9207fbfff72f76166e00004bacf248..298d963aacc5c68c9ab16e5b3c6d9f2bc9da4d44 100644 (file)
@@ -123,18 +123,23 @@ typedef std::map<std::string, std::pair<int, modulelist> > interfacelist;
  * loaded modules in a readable simple way, e.g.:
  * 'FOREACH_MOD(I_OnConnect,OnConnect(user));'
  */
-#define FOREACH_MOD(y,x) \
-for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ++_i) \
-{ \
-       try \
+#define FOREACH_MOD(y,x) do { \
+       EventHandlerIter safei; \
+       for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ) \
        { \
-               (*_i)->x ; \
-       } \
-       catch (CoreException& modexcept) \
-       { \
-               ServerInstance->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
+               safei = _i; \
+               ++safei; \
+               try \
+               { \
+                       (*_i)->x ; \
+               } \
+               catch (CoreException& modexcept) \
+               { \
+                       ServerInstance->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
+               } \
+               _i = safei; \
        } \
-}
+} while (0);
 
 /**
  * This #define allows us to call a method in all
@@ -142,18 +147,23 @@ for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i
  * an instance pointer to the macro. e.g.:
  * 'FOREACH_MOD_I(Instance, OnConnect, OnConnect(user));'
  */
-#define FOREACH_MOD_I(z,y,x) \
-for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Modules->EventHandlers[y].end(); ++_i) \
-{ \
-       try \
+#define FOREACH_MOD_I(z,y,x) do { \
+       EventHandlerIter safei; \
+       for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Modules->EventHandlers[y].end(); ) \
        { \
-               (*_i)->x ; \
-       } \
-       catch (CoreException& modexcept) \
-       { \
-               z->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
+               safei = _i; \
+               ++safei; \
+               try \
+               { \
+                       (*_i)->x ; \
+               } \
+               catch (CoreException& modexcept) \
+               { \
+                       z->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
+               } \
+               _i = safei; \
        } \
-}
+} while (0);
 
 /**
  * This define is similar to the one above but returns a result in MOD_RESULT.
@@ -162,9 +172,12 @@ for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Module
  */
 #define FOREACH_RESULT(y,x) \
 do { \
+       EventHandlerIter safei; \
        MOD_RESULT = 0; \
-       for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ++_i) \
+       for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ) \
        { \
+               safei = _i; \
+               ++safei; \
                try \
                { \
                        int res = (*_i)->x ; \
@@ -177,6 +190,7 @@ do { \
                { \
                        ServerInstance->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
                } \
+               _i = safei; \
        } \
 } while(0);
 
@@ -188,9 +202,12 @@ do { \
  */
 #define FOREACH_RESULT_I(z,y,x) \
 do { \
+       EventHandlerIter safei; \
        MOD_RESULT = 0; \
-       for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Modules->EventHandlers[y].end(); ++_i) \
+       for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Modules->EventHandlers[y].end(); ) \
        { \
+               safei = _i; \
+               ++safei; \
                try \
                { \
                        int res = (*_i)->x ; \
@@ -203,6 +220,7 @@ do { \
                { \
                        z->Log(DEBUG,"Exception caught: %s",modexcept.GetReason()); \
                } \
+               _i = safei; \
        } \
 } while (0);
 
@@ -376,17 +394,19 @@ enum Implementation
        I_OnUserInvite, I_OnUserPreMessage, I_OnUserPreNotice, I_OnUserPreNick, I_OnUserMessage, I_OnUserNotice, I_OnMode,
        I_OnGetServerDescription, I_OnSyncUser, I_OnSyncChannel, I_OnSyncChannelMetaData, I_OnSyncUserMetaData,
        I_OnDecodeMetaData, I_ProtoSendMode, I_ProtoSendMetaData, I_OnWallops, I_OnChangeHost, I_OnChangeName, I_OnAddLine,
-       I_OnDelLine, I_OnCleanup, I_OnUserPostNick, I_OnAccessCheck, I_On005Numeric, I_OnKill, I_OnRemoteKill, I_OnLoadModule, I_OnUnloadModule,
-       I_OnBackgroundTimer, I_OnPreCommand, I_OnCheckReady, I_OnUserRrgister, I_OnCheckInvite,
+       I_OnDelLine, I_OnExpireLine, I_OnCleanup, I_OnUserPostNick, I_OnAccessCheck, 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_OnStats, I_OnChangeLocalUserHost, I_OnChangeLocalUserGecos, I_OnLocalTopicChange,
        I_OnPostLocalTopicChange, I_OnEvent, I_OnRequest, I_OnOperCompre, I_OnGlobalOper, I_OnPostConnect, I_OnAddBan, I_OnDelBan,
        I_OnRawSocketAccept, I_OnRawSocketClose, I_OnRawSocketWrite, I_OnRawSocketRead, I_OnChangeLocalUserGECOS, I_OnUserRegister,
-       I_OnOperCompare, I_OnChannelDelete, I_OnPostOper, I_OnSyncOtherMetaData, I_OnSetAway, I_OnCancelAway, I_OnUserList,
+       I_OnOperCompare, I_OnChannelPreDelete, I_OnChannelDelete, I_OnPostOper, I_OnSyncOtherMetaData, I_OnSetAway, I_OnCancelAway, I_OnUserList,
        I_OnPostCommand, I_OnPostJoin, I_OnWhoisLine, I_OnBuildExemptList, I_OnRawSocketConnect, I_OnGarbageCollect, I_OnBufferFlushed,
-       I_OnText,
+       I_OnText, I_OnReadConfig, I_OnDownloadFile,
        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
@@ -416,6 +436,10 @@ class CoreExport Module : public Extensible
        {
        }
 
+       virtual void OnReadConfig(ServerConfig* config, ConfigReader* coreconf);
+
+       virtual int OnDownloadFile(const std::string &filename, std::istream* &filedata);
+
        /** Returns the version number of a Module.
         * The method should return a Version object with its version information assigned via
         * Version::Version
@@ -446,6 +470,12 @@ class CoreExport Module : public Extensible
         */
        virtual void OnUserDisconnect(User* user);
 
+       /** Called whenever a channel is about to be deleted
+        * @param chan The channel being deleted
+        * @return An integer specifying whether or not the channel may be deleted. 0 for yes, 1 for no.
+        */
+       virtual int OnChannelPreDelete(Channel *chan);
+
        /** Called whenever a channel is deleted, either by QUIT, KICK or PART.
         * @param chan The channel being deleted
         */
@@ -564,9 +594,10 @@ class CoreExport Module : public Extensible
         * can be gauranteed to already have processed the oper-up, for example m_spanningtree has sent
         * out the OPERTYPE, etc.
         * @param user The user who is opering up
+        * @param opername The name of the oper that the user is opering up to. Only valid locally. Empty string otherwise.
         * @param opertype The opers type name
         */
-       virtual void OnPostOper(User* user, const std::string &opertype);
+       virtual void OnPostOper(User* user, const std::string &opername, const std::string &opertype);
        
        /** Called whenever a user types /INFO.
         * The User will contain the information of the user who typed the command. Modules may use this
@@ -868,18 +899,18 @@ class CoreExport Module : public Extensible
         */
        virtual void OnAddLine(User* source, XLine* line);
 
-       /** Called whenever an xline is deleted.
+       /** Called whenever an xline is deleted MANUALLY. See OnExpireLine for expiry.
         * This method is triggered after the line is deleted.
         * @param source The user removing the line or NULL for local server
         * @param line the line being deleted
         */
        virtual void OnDelLine(User* source, XLine* line);
 
-       /** Called whenever a zline is deleted.
+       /** Called whenever an xline expires.
         * This method is triggered after the line is deleted.
-        * @param source The user removing the line
-        * @param hostmask The hostmask to delete
+        * @param line The line being deleted.
         */
+       virtual void OnExpireLine(XLine *line);
 
        /** Called before your module is unloaded to clean up Extensibles.
         * This method is called once for every user and channel on the network,
@@ -1060,6 +1091,18 @@ class CoreExport Module : public Extensible
         */
        virtual int OnCheckInvite(User* user, Channel* chan);
 
+       /** Called whenever a mode character is processed.
+        * Return 1 from this function to block the mode character from being processed entirely.
+        * @param user The user who is sending the mode
+        * @param chan The channel the mode is being sent to (or NULL if a usermode)
+        * @param mode The mode character being set
+        * @param param The parameter for the mode or an empty string
+        * @param adding true of the mode is being added, false if it is being removed
+        * @param pcnt The parameter count for the mode (0 or 1)
+        * @return 1 to deny the mode, 0 to allow
+        */
+       virtual int OnRawMode(User* user, Channel* chan, const char mode, const std::string &param, bool adding, int pcnt);
+
        /** Called whenever a user joins a channel, to determine if key checks should go ahead or not.
         * This method will always be called for each join, wether or not the channel is actually +k, and
         * determines the outcome of an if statement around the whole section of key checking code.