]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/modules.h
Merge pull request #1211 from SaberUK/master+override
[user/henk/code/inspircd.git] / include / modules.h
index d034ebac21596700e3b6e87128125cc297c08754..d9d05a39603c2fa4245b9ebe01332c0fd7e4ad0e 100644 (file)
@@ -39,7 +39,6 @@
  */
 enum ModuleFlags {
        VF_NONE = 0,            // module is not special at all
-       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_COMMON = 4,          // module needs to be common on all servers in a network to link
        VF_OPTCOMMON = 8,       // module should be common on all servers for unsurprising behavior
@@ -202,8 +201,6 @@ class CoreExport Version
 
        /** Complex version information, including linking compatability data */
        Version(const std::string &desc, int flags, const std::string& linkdata);
-
-       virtual ~Version() {}
 };
 
 class CoreExport DataProvider : public ServiceProvider
@@ -221,9 +218,8 @@ enum Priority { PRIORITY_FIRST, PRIORITY_LAST, PRIORITY_BEFORE, PRIORITY_AFTER }
  */
 enum Implementation
 {
-       I_BEGIN,
        I_OnUserConnect, I_OnUserQuit, I_OnUserDisconnect, I_OnUserJoin, I_OnUserPart,
-       I_OnSendSnotice, I_OnUserPreJoin, I_OnUserPreKick, I_OnUserKick, I_OnOper, I_OnInfo, I_OnWhois,
+       I_OnSendSnotice, I_OnUserPreJoin, I_OnUserPreKick, I_OnUserKick, I_OnOper, I_OnInfo,
        I_OnUserPreInvite, I_OnUserInvite, I_OnUserPreMessage, I_OnUserPreNick,
        I_OnUserMessage, I_OnMode, I_OnSyncUser,
        I_OnSyncChannel, I_OnDecodeMetaData, I_OnAcceptConnection, I_OnUserInit,
@@ -235,7 +231,7 @@ enum Implementation
        I_OnPostTopicChange, I_OnPostConnect,
        I_OnChangeLocalUserGECOS, I_OnUserRegister, I_OnChannelPreDelete, I_OnChannelDelete,
        I_OnPostOper, I_OnSyncNetwork, I_OnSetAway, I_OnPostCommand, I_OnPostJoin,
-       I_OnWhoisLine, I_OnBuildNeighborList, I_OnGarbageCollect, I_OnSetConnectClass,
+       I_OnBuildNeighborList, I_OnGarbageCollect, I_OnSetConnectClass,
        I_OnText, I_OnPassCompare, I_OnNamesListItem, I_OnNumeric,
        I_OnPreRehash, I_OnModuleRehash, I_OnSendWhoLine, I_OnChangeIdent, I_OnSetUserIP,
        I_END
@@ -280,7 +276,7 @@ class CoreExport Module : public classbase, public usecountbase
        /** Clean up prior to destruction
         * If you override, you must call this AFTER your module's cleanup
         */
-       virtual CullResult cull();
+       virtual CullResult cull() CXX11_OVERRIDE;
 
        /** Default destructor.
         * destroys a module class
@@ -470,14 +466,6 @@ class CoreExport Module : public classbase, public usecountbase
         */
        virtual void OnInfo(User* user);
 
-       /** Called whenever a /WHOIS is performed on a local user.
-        * The source parameter contains the details of the user who issued the WHOIS command, and
-        * the dest parameter contains the information of the user they are whoising.
-        * @param source The user issuing the WHOIS command
-        * @param dest The user who is being WHOISed
-        */
-       virtual void OnWhois(User* source, User* dest);
-
        /** Called whenever a user is about to invite another user into a channel, before any processing is done.
         * Returning 1 from this function stops the process immediately, causing no
         * output to be sent to the user by the core. If you do this you must produce your own numerics,
@@ -497,8 +485,10 @@ class CoreExport Module : public classbase, public usecountbase
         * @param dest The user being invited
         * @param channel The channel the user is being invited to
         * @param timeout The time the invite will expire (0 == never)
+        * @param notifyrank Rank required to get an invite announcement (if enabled)
+        * @param notifyexcepts List of users to not send the default NOTICE invite announcement to
         */
-       virtual void OnUserInvite(User* source,User* dest,Channel* channel, time_t timeout);
+       virtual void OnUserInvite(User* source, User* dest, Channel* channel, time_t timeout, unsigned int notifyrank, CUList& notifyexcepts);
 
        /** Called whenever a user is about to PRIVMSG A user or a channel, before any processing is done.
         * Returning any nonzero value from this function stops the process immediately, causing no
@@ -881,14 +871,10 @@ class CoreExport Module : public classbase, public usecountbase
 
        /** Called on all /STATS commands
         * This method is triggered for all /STATS use, including stats symbols handled by the core.
-        * @param symbol the symbol provided to /STATS
-        * @param user the user issuing the /STATS command
-        * @param results A string_list to append results into. You should put all your results
-        * into this string_list, rather than displaying them directly, so that your handler will
-        * work when remote STATS queries are received.
+        * @param stats Context of the /STATS request, contains requesting user, list of answer rows etc.
         * @return 1 to block the /STATS from being processed by the core, 0 to allow it
         */
-       virtual ModResult OnStats(char symbol, User* user, string_list &results);
+       virtual ModResult OnStats(Stats::Context& stats);
 
        /** Called whenever a change of a local users displayed host is attempted.
         * Return 1 to deny the host change, or 0 to allow it.
@@ -963,19 +949,6 @@ class CoreExport Module : public classbase, public usecountbase
         */
        virtual ModResult OnSetAway(User* user, const std::string &awaymsg);
 
-       /** Called whenever a line of WHOIS output is sent to a user.
-        * You may change the numeric and the text of the output by changing
-        * the values numeric and text, but you cannot change the user the
-        * numeric is sent to. You may however change the user's User values.
-        * @param user The user the numeric is being sent to
-        * @param dest The user being WHOISed
-        * @param numeric The numeric of the line being sent
-        * @param text The text of the numeric, including any parameters
-        * @return nonzero to drop the line completely so that the user does not
-        * receive it, or zero to allow the line to be sent.
-        */
-       virtual ModResult OnWhoisLine(User* user, User* dest, int &numeric, std::string &text);
-
        /** Called at intervals for modules to garbage-collect any hashes etc.
         * Certain data types such as hash_map 'leak' buckets, which must be
         * tidied up and freed by copying into a new item every so often. This
@@ -1008,16 +981,17 @@ class CoreExport Module : public classbase, public usecountbase
         */
        virtual ModResult OnNamesListItem(User* issuer, Membership* item, std::string& prefixes, std::string& nick);
 
-       virtual ModResult OnNumeric(User* user, unsigned int numeric, const std::string &text);
+       virtual ModResult OnNumeric(User* user, const Numeric::Numeric& numeric);
 
        /** Called whenever a result from /WHO is about to be returned
         * @param source The user running the /WHO query
         * @param params The parameters to the /WHO query
         * @param user The user that this line of the query is about
         * @param memb The member shown in this line, NULL if no channel is in this line
-        * @param line The raw line to send; modifiable, if empty no line will be returned.
+        * @param numeric Numeric to send; modifiable.
+        * @param Return MOD_RES_PASSTHRU to allow the line to be displayed, MOD_RES_DENY to hide it
         */
-       virtual void OnSendWhoLine(User* source, const std::vector<std::string>& params, User* user, Membership* memb, std::string& line);
+       virtual ModResult OnSendWhoLine(User* source, const std::vector<std::string>& params, User* user, Membership* memb, Numeric::Numeric& numeric);
 
        /** Called whenever a local user's IP is set for the first time, or when a local user's IP changes due to
         * a module like m_cgiirc changing it.
@@ -1030,10 +1004,6 @@ class CoreExport Module : public classbase, public usecountbase
  */
 typedef std::vector<Module*> IntModuleList;
 
-/** An event handler iterator
- */
-typedef IntModuleList::iterator EventHandlerIter;
-
 /** ModuleManager takes care of all things module-related
  * in the core.
  */
@@ -1058,9 +1028,6 @@ class CoreExport ModuleManager : public fakederef<ModuleManager>
                PRIO_STATE_LAST
        } prioritizationState;
 
-       /** Internal unload module hook */
-       bool CanUnload(Module*);
-
        /** Loads all core modules (cmd_*)
         */
        void LoadCoreModules(std::map<std::string, ServiceList>& servicemap);
@@ -1070,6 +1037,12 @@ class CoreExport ModuleManager : public fakederef<ModuleManager>
         */
        bool PrioritizeHooks();
 
+       /** Unregister all user modes or all channel modes owned by a module
+        * @param mod Module whose modes to unregister
+        * @param modetype MODETYPE_USER to unregister user modes, MODETYPE_CHANNEL to unregister channel modes
+        */
+       void UnregisterModes(Module* mod, ModeType modetype);
+
  public:
        typedef std::map<std::string, Module*> ModuleMap;
 
@@ -1091,6 +1064,13 @@ class CoreExport ModuleManager : public fakederef<ModuleManager>
         */
        ServiceList* NewServices;
 
+       /** Expands the name of a module by prepending "m_" and appending ".so".
+        * No-op if the name already has the ".so" extension.
+        * @param modname Module name to expand
+        * @return Module name starting with "m_" and ending with ".so"
+        */
+       static std::string ExpandModName(const std::string& modname);
+
        /** Simple, bog-standard, boring constructor.
         */
        ModuleManager();
@@ -1117,12 +1097,6 @@ class CoreExport ModuleManager : public fakederef<ModuleManager>
         */
        bool SetPriority(Module* mod, Implementation i, Priority s, Module* which = NULL);
 
-       /** Backwards compat interface */
-       inline bool SetPriority(Module* mod, Implementation i, Priority s, Module** dptr)
-       {
-               return SetPriority(mod, i, s, *dptr);
-       }
-
        /** Change the priority of all events in a module.
         * @param mod The module to set the priority of
         * @param s The priority of all events in the module.
@@ -1131,7 +1105,7 @@ class CoreExport ModuleManager : public fakederef<ModuleManager>
         * SetPriority method for this, where you may specify other modules to
         * be prioritized against.
         */
-       bool SetPriority(Module* mod, Priority s);
+       void SetPriority(Module* mod, Priority s);
 
        /** Attach an event to a module.
         * You may later detatch the event with ModuleManager::Detach().
@@ -1187,18 +1161,19 @@ class CoreExport ModuleManager : public fakederef<ModuleManager>
         */
        bool Unload(Module* module);
 
-       /** Run an asynchronous reload of the given module. When the reload is
-        * complete, the callback will be run with true if the reload succeeded
-        * and false if it did not.
-        */
-       void Reload(Module* module, HandlerBase1<void, bool>* callback);
-
        /** Called by the InspIRCd constructor to load all modules from the config file.
         */
        void LoadAll();
        void UnloadAll();
        void DoSafeUnload(Module*);
 
+       /** Check if a module can be unloaded and if yes, prepare it for unload
+        * @param mod Module to be unloaded
+        * @return True if the module is unloadable, false otherwise.
+        * If true the module must be unloaded in the current main loop iteration.
+        */
+       bool CanUnload(Module* mod);
+
        /** Find a module by name, and return a Module* to it.
         * This is preferred over iterating the module lists yourself.
         * @param name The module name to look up
@@ -1237,6 +1212,17 @@ class CoreExport ModuleManager : public fakederef<ModuleManager>
         * @return A ModuleMap containing all loaded modules
         */
        const ModuleMap& GetModules() const { return Modules; }
+
+       /** Make a service referenceable by dynamic_references
+        * @param name Name that will be used by dynamic_references to find the object
+        * @param service Service to make referenceable by dynamic_references
+        */
+       void AddReferent(const std::string& name, ServiceProvider* service);
+
+       /** Make a service no longer referenceable by dynamic_references
+        * @param service Service to make no longer referenceable by dynamic_references
+        */
+       void DelReferent(ServiceProvider* service);
 };
 
 /** Do not mess with these functions unless you know the C preprocessor
@@ -1249,7 +1235,7 @@ class CoreExport ModuleManager : public fakederef<ModuleManager>
 #define MODULE_INIT_SYM_FN_2(x,y) MODULE_INIT_SYM_FN_1(x,y)
 #define MODULE_INIT_SYM_FN_1(x,y) inspircd_module_ ## x ## _ ## y
 
-#ifdef PURE_STATIC
+#ifdef INSPIRCD_STATIC
 
 struct AllCommandList {
        typedef Command* (*fn)(Module*);
@@ -1290,7 +1276,8 @@ struct AllModuleList {
                                break; \
                } \
                return TRUE; \
-       }
+       } \
+       extern "C" DllExport const char inspircd_src_version[] = INSPIRCD_VERSION;
 
 #else
 
@@ -1299,7 +1286,7 @@ struct AllModuleList {
        { \
                return new y; \
        } \
-       extern "C" DllExport const char inspircd_src_version[] = INSPIRCD_VERSION " " INSPIRCD_REVISION;
+       extern "C" DllExport const char inspircd_src_version[] = INSPIRCD_VERSION;
 #endif
 
 #define COMMAND_INIT(c) MODULE_INIT(CommandModule<c>)