X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fmodules.h;h=3f36f23dad90d8ae7402957c54b0c52e281a7ef3;hb=e07a1a5ffab0a54ff04a7ff93b8c25c69992bf81;hp=f6678e93187c010c71345ed0962fad149b7d468f;hpb=248a14477c435ef28b71df42080ec931b1003e3f;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/modules.h b/include/modules.h index f6678e931..3f36f23da 100644 --- a/include/modules.h +++ b/include/modules.h @@ -50,7 +50,8 @@ enum ModuleFlags { 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_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 }; /** Used with SendToMode() @@ -76,6 +77,31 @@ enum MessageType { MSG_NOTICE = 1 }; +/** Used to represent an allow/deny module result. + * Not constructed as an enum because it reverses the value logic of some functions; + * the compiler will inline accesses to have the same efficiency as integer operations. + */ +struct ModResult { + int res; + explicit ModResult(int r) : res(r) {} + bool operator==(const ModResult& r) const + { + return res == r.res; + } + bool operator!=(const ModResult& r) const + { + return res != r.res; + } + bool operator!() const + { + return !res; + } +}; + +#define MOD_RES_ALLOW (ModResult(1)) +#define MOD_RES_PASSTHRU (ModResult(0)) +#define MOD_RES_DENY (ModResult(-1)) + /** If you change the module API, change this value. */ #define API_VERSION 13000 @@ -213,25 +239,42 @@ do { \ } \ } while (0); -#define FOREACH_RESULT_MAP(y,x,f) \ +/** + * Custom module result handling loop. This is a paired macro, and should only + * be used with while_each_hook. + * + * See src/channels.cpp for an example of use. + */ +#define DO_EACH_HOOK(z,n,v,args) \ do { \ - EventHandlerIter safei; \ - for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ) \ + EventHandlerIter iter_ ## n = z->Modules->EventHandlers[I_ ## n].begin(); \ + while (iter_ ## n != z->Modules->EventHandlers[I_ ## n].end()) \ { \ - safei = _i; \ - ++safei; \ + Module* mod_ ## n = *iter_ ## n; \ + iter_ ## n ++; \ try \ { \ - int MOD_RESULT = (*_i)->x ; \ - f; \ + v = (mod_ ## n)->n args; + +#define WHILE_EACH_HOOK(z,n) \ } \ - catch (CoreException& modexcept) \ + catch (CoreException& except_ ## n) \ { \ - ServerInstance->Logs->Log("MODULE",DEFAULT,"Exception caught: %s",modexcept.GetReason()); \ + z->Logs->Log("MODULE",DEFAULT,"Exception caught: %s", (except_ ## n).GetReason()); \ + (void) mod_ ## n; /* catch mismatched pairs */ \ } \ - _i = safei; \ } \ -} while(0); +} while(0) + +#define FIRST_MOD_RESULT(z,n,v,args) do { \ + v = MOD_RES_PASSTHRU; \ + DO_EACH_HOOK(z,n,v,args) \ + { \ + if (v != MOD_RES_PASSTHRU) \ + break; \ + } \ + WHILE_EACH_HOOK(z,n); \ +} while (0) /** Represents a non-local user. * (in fact, any FD less than -1 does) @@ -403,20 +446,23 @@ enum Priority { PRIORITY_FIRST, PRIORITY_DONTCARE, PRIORITY_LAST, PRIORITY_BEFOR enum Implementation { I_BEGIN, - I_OnUserConnect, I_OnUserQuit, I_OnUserDisconnect, I_OnUserJoin, I_OnUserPart, I_OnRehash, 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_OnSyncChannelMetaData, I_OnSyncUserMetaData, - I_OnDecodeMetaData, I_ProtoSendMode, I_ProtoSendMetaData, I_OnWallops, I_OnChangeHost, I_OnChangeName, I_OnAddLine, - 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_OnCheckExtBan, I_OnCheckStringExtBan, I_OnStats, I_OnChangeLocalUserHost, I_OnChangeLocalUserGecos, - I_OnLocalTopicChange, I_OnPostLocalTopicChange, I_OnEvent, I_OnRequest, I_OnGlobalOper, I_OnPostConnect, I_OnAddBan, I_OnDelBan, - I_OnRawSocketAccept, I_OnRawSocketClose, I_OnRawSocketWrite, I_OnRawSocketRead, I_OnChangeLocalUserGECOS, I_OnUserRegister, - I_OnChannelPreDelete, I_OnChannelDelete, I_OnPostOper, I_OnSyncOtherMetaData, I_OnSetAway, I_OnUserList, - I_OnPostCommand, I_OnPostJoin, I_OnWhoisLine, I_OnBuildExemptList, I_OnRawSocketConnect, I_OnGarbageCollect, I_OnBufferFlushed, - I_OnText, I_OnPassCompare, I_OnRunTestSuite, I_OnNamesListItem, I_OnNumeric, I_OnHookUserIO, I_OnHostCycle, - I_OnPreRehash, I_OnModuleRehash, + I_OnUserConnect, I_OnUserQuit, I_OnUserDisconnect, I_OnUserJoin, I_OnUserPart, I_OnRehash, + 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_OnChangeHost, I_OnChangeName, I_OnAddLine, 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_OnCheckExtBan, I_OnCheckStringExtBan, + I_OnStats, I_OnChangeLocalUserHost, I_OnChangeLocalUserGecos, I_OnLocalTopicChange, + I_OnPostLocalTopicChange, I_OnEvent, I_OnRequest, I_OnGlobalOper, I_OnPostConnect, I_OnAddBan, + I_OnDelBan, I_OnRawSocketAccept, I_OnRawSocketClose, I_OnRawSocketWrite, I_OnRawSocketRead, + I_OnChangeLocalUserGECOS, I_OnUserRegister, I_OnChannelPreDelete, I_OnChannelDelete, + I_OnPostOper, I_OnSyncNetwork, I_OnSetAway, I_OnUserList, I_OnPostCommand, I_OnPostJoin, + I_OnWhoisLine, I_OnBuildExemptList, I_OnRawSocketConnect, I_OnGarbageCollect, I_OnBufferFlushed, + I_OnText, I_OnPassCompare, I_OnRunTestSuite, I_OnNamesListItem, I_OnNumeric, I_OnHookUserIO, + I_OnHostCycle, I_OnPreRehash, I_OnModuleRehash, I_END }; @@ -501,8 +547,9 @@ class CoreExport Module : public Extensible * 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. + * @param created This is true if the join created the channel */ - virtual void OnUserJoin(User* user, Channel* channel, bool sync, bool &silent); + virtual void OnUserJoin(User* user, Channel* channel, bool sync, bool &silent, bool created); /** Called after a user joins a channel * Identical to OnUserJoin, but called immediately afterwards, when any linking module has @@ -776,7 +823,7 @@ class CoreExport Module : public Extensible * @param text The actual modes and their parameters if any * @param translate The translation types of the mode parameters */ - virtual void OnMode(User* user, void* dest, int target_type, const std::deque &text, const std::deque &translate); + virtual void OnMode(User* user, void* dest, int target_type, const std::vector &text, const std::vector &translate); /** Allows modules to alter or create server descriptions * Whenever a module requires a server description, for example for display in @@ -807,9 +854,7 @@ class CoreExport Module : public Extensible * the linking protocol. This currently is m_spanningtree.so. A pointer to this module * is given in Module* proto, so that you may call its methods such as ProtoSendMode * (see below). This function will be called for every user visible on your side - * of the burst, allowing you to for example set modes, etc. Do not use this call to - * synchronize data which you have stored using class Extensible -- There is a specialist - * function OnSyncUserMetaData and OnSyncChannelMetaData for this! + * of the burst, allowing you to for example set modes, etc. * * For a good example of how to use this function, please see src/modules/m_chanprotect.cpp * @@ -819,36 +864,6 @@ class CoreExport Module : public Extensible */ virtual void OnSyncChannel(Channel* chan, Module* proto, void* opaque); - /* Allows modules to syncronize metadata related to channels over the network during a netburst. - * Whenever the linking module wants to send out data, but doesnt know what the data - * represents (e.g. it is Extensible metadata, added to a User or Channel by a module) then - * this method is called.You should use the ProtoSendMetaData function after you've - * correctly decided how the data should be represented, to send the metadata on its way if it belongs - * to your module. For a good example of how to use this method, see src/modules/m_swhois.cpp. - * @param chan The channel whos metadata is being syncronized - * @param proto A pointer to the module handling network protocol - * @param opaque An opaque pointer set by the protocol module, should not be modified! - * @param extname The extensions name which is being searched for - * @param displayable If this value is true, the data is going to be displayed to a user, - * and not sent across the network. Use this to determine wether or not to show sensitive data. - */ - virtual void OnSyncChannelMetaData(Channel* chan, Module* proto,void* opaque, const std::string &extname, bool displayable = false); - - /* Allows modules to syncronize metadata related to users over the network during a netburst. - * Whenever the linking module wants to send out data, but doesnt know what the data - * represents (e.g. it is Extensible metadata, added to a User or Channel by a module) then - * this method is called. You should use the ProtoSendMetaData function after you've - * correctly decided how the data should be represented, to send the metadata on its way if - * if it belongs to your module. - * @param user The user whos metadata is being syncronized - * @param proto A pointer to the module handling network protocol - * @param opaque An opaque pointer set by the protocol module, should not be modified! - * @param extname The extensions name which is being searched for - * @param displayable If this value is true, the data is going to be displayed to a user, - * and not sent across the network. Use this to determine wether or not to show sensitive data. - */ - virtual void OnSyncUserMetaData(User* user, Module* proto,void* opaque, const std::string &extname, bool displayable = false); - /* Allows modules to syncronize metadata not related to users or channels, over the network during a netburst. * Whenever the linking module wants to send out data, but doesnt know what the data * represents (e.g. it is Extensible metadata, added to a User or Channel by a module) then @@ -860,7 +875,7 @@ class CoreExport Module : public Extensible * @param displayable If this value is true, the data is going to be displayed to a user, * and not sent across the network. Use this to determine wether or not to show sensitive data. */ - virtual void OnSyncOtherMetaData(Module* proto, void* opaque, bool displayable = false); + virtual void OnSyncNetwork(Module* proto, void* opaque); /** Allows module data, sent via ProtoSendMetaData, to be decoded again by a receiving module. * Please see src/modules/m_swhois.cpp for a working example of how to use this method call. @@ -869,7 +884,7 @@ class CoreExport Module : public Extensible * @param extname The extension name which is being sent * @param extdata The extension data, encoded at the other end by an identical module through OnSyncChannelMetaData or OnSyncUserMetaData */ - virtual void OnDecodeMetaData(int target_type, void* target, const std::string &extname, const std::string &extdata); + virtual void OnDecodeMetaData(Extensible* target, const std::string &extname, const std::string &extdata); /** Implemented by modules which provide the ability to link servers. * These modules will implement this method, which allows transparent sending of servermodes @@ -885,7 +900,7 @@ class CoreExport Module : public Extensible * @param modeline The modes and parameters to be sent * @param translate The translation types of the mode parameters */ - virtual void ProtoSendMode(void* opaque, TargetTypeFlags target_type, void* target, const std::deque &modeline, const std::deque &translate); + virtual void ProtoSendMode(void* opaque, TargetTypeFlags target_type, void* target, const std::vector &modeline, const std::vector &translate); /** Implemented by modules which provide the ability to link servers. * These modules will implement this method, which allows metadata (extra data added to @@ -901,7 +916,14 @@ class CoreExport Module : public Extensible * @param extname The extension name to send metadata for * @param extdata Encoded data for this extension name, which will be encoded at the oppsite end by an identical module using OnDecodeMetaData */ - virtual void ProtoSendMetaData(void* opaque, TargetTypeFlags target_type, void* target, const std::string &extname, const std::string &extdata); + virtual void ProtoSendMetaData(void* opaque, Extensible* target, const std::string &extname, const std::string &extdata); + + /** + * Implemented by all modules that implement ProtoSendMetaData. + * Translates the item into a string format suitable for sending to other servers. + * Currently, this just translates nicks to their UID and channels to their name + */ + virtual std::string ProtoTranslate(Extensible* item); /** Called after every WALLOPS command. * @param user The user sending the WALLOPS