]> 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 6a56384f5ec05ad306b486768b5eec8b5f1fc136..298d963aacc5c68c9ab16e5b3c6d9f2bc9da4d44 100644 (file)
 #ifndef __MODULES_H
 #define __MODULES_H
 
+#include "globals.h"
+#include "dynamic.h"
+#include "base.h"
+#include "ctables.h"
+#include "inspsocket.h"
+#include <string>
+#include <deque>
+#include <sstream>
+#include "timer.h"
+#include "mode.h"
+#include "dns.h"
+
 class XLine;
 
 /** Used with OnAccessCheck() method of modules
@@ -65,18 +77,6 @@ enum MessageType {
        MSG_NOTICE = 1
 };
 
-#include "globals.h"
-#include "dynamic.h"
-#include "base.h"
-#include "ctables.h"
-#include "inspsocket.h"
-#include <string>
-#include <deque>
-#include <sstream>
-#include "timer.h"
-#include "mode.h"
-#include "dns.h"
-
 /** If you change the module API, change this value.
  * If you have enabled ipv6, the sizes of structs is
  * different, and modules will be incompatible with
@@ -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
         */
@@ -458,8 +488,10 @@ class CoreExport Module : public Extensible
         * @param channel The channel being joined
         * @param silent Change this to true if you want to conceal the JOIN command from the other users
         * of the channel (useful for modules such as auditorium)
+        * @param sync This is set to true if the JOIN is the result of a network sync and the remote user is being introduced
+        * to a channel due to the network sync.
         */
-       virtual void OnUserJoin(User* user, Channel* channel, bool &silent);
+       virtual void OnUserJoin(User* user, Channel* channel, bool sync, bool &silent);
 
        /** Called after a user joins a channel
         * Identical to OnUserJoin, but called immediately afterwards, when any linking module has
@@ -562,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
@@ -866,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,
@@ -1058,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.
@@ -1269,7 +1314,9 @@ class CoreExport Module : public Extensible
         * @param userlist The user list for the channel (you may change this pointer.
         * If you want to change the values, take a copy first, and change the copy, then
         * point the pointer at your copy)
-        * @return 1 to prevent the user list being sent to the client, 0 to allow it
+        * @return 1 to prevent the user list being sent to the client, 0 to allow it.
+        * Returning -1 allows the names list, but bypasses any checks which check for
+        * channel membership before sending the names list.
         */
        virtual int OnUserList(User* user, Channel* Ptr, CUList* &userlist);
 
@@ -1521,10 +1568,6 @@ typedef DLLFactory<Module> ircd_module;
  */
 typedef std::vector<Module*> IntModuleList;
 
-/** A list of event handlers
- */
-typedef std::vector<IntModuleList> EventHandlerList;
-
 /** An event handler iterator
  */
 typedef IntModuleList::iterator EventHandlerIter;
@@ -1576,7 +1619,7 @@ class CoreExport ModuleManager : public classbase
        /** Event handler hooks.
         * This needs to be public to be used by FOREACH_MOD and friends.
         */
-       EventHandlerList EventHandlers;
+       IntModuleList EventHandlers[I_END];
 
        /** Simple, bog-standard, boring constructor.
         */