X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fmodules.h;h=298d963aacc5c68c9ab16e5b3c6d9f2bc9da4d44;hb=84083a73e80734e39892f44411549d2381654c95;hp=1e2d1e3c5f9207fbfff72f76166e00004bacf248;hpb=abc959a04d7c6de7f192992693e69cd5e798c8b9;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/modules.h b/include/modules.h index 1e2d1e3c5..298d963aa 100644 --- a/include/modules.h +++ b/include/modules.h @@ -123,18 +123,23 @@ typedef std::map > 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 ¶m, 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.