]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/modules.h
Add VF_OPTCOMMON for optionally common modules
[user/henk/code/inspircd.git] / include / modules.h
index 4f21a6000d45b8549e6168a244ff28cc4015d419..3f36f23dad90d8ae7402957c54b0c52e281a7ef3 100644 (file)
@@ -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
 
@@ -240,6 +266,16 @@ do { \
        } \
 } 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)
  */
@@ -414,7 +450,7 @@ 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_OnSyncChannelMetaData, I_OnSyncUserMetaData, I_OnDecodeMetaData, I_OnWallops,
+       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,
@@ -423,7 +459,7 @@ enum Implementation
        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_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,
@@ -818,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
         *
@@ -830,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
@@ -871,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.
@@ -880,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
@@ -912,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