]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/modules.h
Add OnUserPreQuit event to allow modules to change quit messages (#1629).
[user/henk/code/inspircd.git] / include / modules.h
index 44cda7d195627087e0475e50e0829a24bdce12f7..81664d3640c8ece744979e58e195ae6628a4461a 100644 (file)
@@ -99,14 +99,15 @@ struct ModResult {
 /** InspIRCd major version.
  * 1.2 -> 102; 2.1 -> 201; 2.12 -> 212
  */
-#define INSPIRCD_VERSION_MAJ 202
+#define INSPIRCD_VERSION_MAJ 300
+
 /** InspIRCd API version.
  * If you change any API elements, increment this value. This counter should be
  * reset whenever the major version is changed. Modules can use these two values
  * and numerical comparisons in preprocessor macros if they wish to support
  * multiple versions of InspIRCd in one file.
  */
-#define INSPIRCD_VERSION_API 1
+#define INSPIRCD_VERSION_API 6
 
 /**
  * This #define allows us to call a method in all
@@ -120,7 +121,8 @@ struct ModResult {
                _next = _i+1; \
                try \
                { \
-                       (*_i)->y x ; \
+                       if (!(*_i)->dying) \
+                               (*_i)->y x ; \
                } \
                catch (CoreException& modexcept) \
                { \
@@ -143,7 +145,8 @@ do { \
                _next = _i+1; \
                try \
                { \
-                       v = (*_i)->n args;
+                       if (!(*_i)->dying) \
+                               v = (*_i)->n args;
 
 #define WHILE_EACH_HOOK(n) \
                } \
@@ -211,23 +214,23 @@ enum Priority { PRIORITY_FIRST, PRIORITY_LAST, PRIORITY_BEFORE, PRIORITY_AFTER }
  */
 enum Implementation
 {
-       I_OnUserConnect, I_OnUserQuit, I_OnUserDisconnect, I_OnUserJoin, I_OnUserPart,
-       I_OnSendSnotice, I_OnUserPreJoin, I_OnUserPreKick, I_OnUserKick, I_OnOper, I_OnInfo,
+       I_OnUserConnect, I_OnUserPreQuit, I_OnUserQuit, I_OnUserDisconnect, I_OnUserJoin, I_OnUserPart,
+       I_OnSendSnotice, I_OnUserPreJoin, I_OnUserPreKick, I_OnUserKick, I_OnOper,
        I_OnUserPreInvite, I_OnUserInvite, I_OnUserPreMessage, I_OnUserPreNick,
        I_OnUserPostMessage, I_OnUserMessageBlocked, I_OnMode,
-       I_OnDecodeMetaData, I_OnAcceptConnection, I_OnUserInit,
+       I_OnDecodeMetaData, I_OnAcceptConnection, I_OnUserInit, I_OnUserPostInit,
        I_OnChangeHost, I_OnChangeRealName, I_OnAddLine, I_OnDelLine, I_OnExpireLine,
        I_OnUserPostNick, I_OnPreMode, I_On005Numeric, I_OnKill, I_OnLoadModule,
        I_OnUnloadModule, I_OnBackgroundTimer, I_OnPreCommand, I_OnCheckReady, I_OnCheckInvite,
        I_OnRawMode, I_OnCheckKey, I_OnCheckLimit, I_OnCheckBan, I_OnCheckChannelBan, I_OnExtBanCheck,
-       I_OnChangeLocalUserHost, I_OnPreTopicChange,
+       I_OnPreChangeHost, I_OnPreTopicChange,
        I_OnPostTopicChange, I_OnPostConnect, I_OnPostDeoper,
        I_OnPreChangeRealName, I_OnUserRegister, I_OnChannelPreDelete, I_OnChannelDelete,
-       I_OnPostOper, I_OnSetAway, I_OnPostCommand, I_OnPostJoin,
+       I_OnPostOper, I_OnPostCommand, I_OnPostJoin,
        I_OnBuildNeighborList, I_OnGarbageCollect, I_OnSetConnectClass,
-       I_OnUserMessage, I_OnPassCompare, I_OnNamesListItem, I_OnNumeric,
-       I_OnPreRehash, I_OnModuleRehash, I_OnSendWhoLine, I_OnChangeIdent, I_OnSetUserIP,
-       I_OnServiceAdd, I_OnServiceDel,
+       I_OnUserMessage, I_OnPassCompare, I_OnNumeric,
+       I_OnPreRehash, I_OnModuleRehash, I_OnChangeIdent, I_OnSetUserIP,
+       I_OnServiceAdd, I_OnServiceDel, I_OnUserWrite,
        I_END
 };
 
@@ -304,6 +307,16 @@ class CoreExport Module : public classbase, public usecountbase
         */
        virtual void OnUserConnect(LocalUser* user);
 
+       /** Called when before a user quits.
+        * The details of the exiting user are available to you in the parameter User *user
+        * This event is only called when the user is fully registered when they quit. To catch
+        * raw disconnections, use the OnUserDisconnect method.
+        * @param user The user who is quitting
+        * @param message The user's quit message (as seen by non-opers)
+        * @param oper_message The user's quit message (as seen by opers)
+        */
+       virtual ModResult OnUserPreQuit(LocalUser* user, std::string& message, std::string& oper_message);
+
        /** Called when a user quits.
         * The details of the exiting user are available to you in the parameter User *user
         * This event is only called when the user is fully registered when they quit. To catch
@@ -457,18 +470,6 @@ class CoreExport Module : public classbase, public usecountbase
         */
        virtual void OnPostDeoper(User* user);
 
-       /** Called whenever a user types /INFO.
-        * The User will contain the information of the user who typed the command. Modules may use this
-        * method to output their own credits in /INFO (which is the ircd's version of an about box).
-        * It is purposefully not possible to modify any info that has already been output, or halt the list.
-        * You must write a 371 numeric to the user, containing your info in the following format:
-        *
-        * <nick> :information here
-        *
-        * @param user The user issuing /INFO
-        */
-       virtual void OnInfo(User* user);
-
        /** 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,
@@ -561,9 +562,8 @@ class CoreExport Module : public classbase, public usecountbase
         * @param changelist The changed modes.
         * @param processflags Flags passed to ModeParser::Process(), see ModeParser::ModeProcessFlags
         * for the possible flags.
-        * @param output_mode Changed modes, including '+' and '-' characters, not including any parameters
         */
-       virtual void OnMode(User* user, User* usertarget, Channel* chantarget, const Modes::ChangeList& changelist, ModeParser::ModeProcessFlag processflags, const std::string& output_mode);
+       virtual void OnMode(User* user, User* usertarget, Channel* chantarget, const Modes::ChangeList& changelist, ModeParser::ModeProcessFlag processflags);
 
        /** 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.
@@ -583,7 +583,7 @@ class CoreExport Module : public classbase, public usecountbase
        /** Called whenever a user's real name is changed.
         * This event triggers after the name has been set.
         * @param user The user who's real name is being changed
-        * @param name The new real name being set on the user
+        * @param real The new real name being set on the user
         */
        virtual void OnChangeRealName(User* user, const std::string& real);
 
@@ -717,10 +717,9 @@ class CoreExport Module : public classbase, public usecountbase
         * @param user the user issuing the command
         * @param validated True if the command has passed all checks, e.g. it is recognised, has enough parameters, the user has permission to execute it, etc.
         * You should only change the parameter list and command string if validated == false (e.g. before the command lookup occurs).
-        * @param original_line The entire original line as passed to the parser from the user
         * @return 1 to block the command, 0 to allow
         */
-       virtual ModResult OnPreCommand(std::string& command, CommandBase::Params& parameters, LocalUser* user, bool validated, const std::string& original_line);
+       virtual ModResult OnPreCommand(std::string& command, CommandBase::Params& parameters, LocalUser* user, bool validated);
 
        /** Called after any command has been executed.
         * This event occurs for all registered commands, wether they are registered in the core,
@@ -731,15 +730,24 @@ class CoreExport Module : public classbase, public usecountbase
         * @param parameters An array of array of characters containing the parameters for the command
         * @param user the user issuing the command
         * @param result The return code given by the command handler, one of CMD_SUCCESS or CMD_FAILURE
-        * @param original_line The entire original line as passed to the parser from the user
+        * @param loop Whether the command is being called from LoopCall or directly.
         */
-       virtual void OnPostCommand(Command* command, const CommandBase::Params& parameters, LocalUser* user, CmdResult result, const std::string& original_line);
+       virtual void OnPostCommand(Command* command, const CommandBase::Params& parameters, LocalUser* user, CmdResult result, bool loop);
 
-       /** Called when a user is first connecting, prior to starting DNS lookups, checking initial
-        * connect class, or accepting any commands.
+       /** Called after a user object is initialised and added to the user list.
+        * When this is called the user has not had their I/O hooks checked or had their initial
+        * connect class assigned and may not yet have a serialiser. You probably want to use
+        * the OnUserPostInit or OnUserSetIP hooks instead of this one.
+        * @param user The connecting user.
         */
        virtual void OnUserInit(LocalUser* user);
 
+       /** Called after a user object has had their I/O hooks checked, their initial connection
+        * class assigned, and had a serialiser set.
+        * @param user The connecting user.
+        */
+       virtual void OnUserPostInit(LocalUser* user);
+
        /** Called to check if a user who is connecting can now be allowed to register
         * If any modules return false for this function, the user is held in the waiting
         * state until all modules return true. For example a module which implements ident
@@ -839,7 +847,7 @@ class CoreExport Module : public classbase, public usecountbase
         * @param newhost The new hostname
         * @return 1 to deny the host change, 0 to allow
         */
-       virtual ModResult OnChangeLocalUserHost(LocalUser* user, const std::string &newhost);
+       virtual ModResult OnPreChangeHost(LocalUser* user, const std::string &newhost);
 
        /** Called whenever a change of a local users real name is attempted.
         * return MOD_RES_DENY to deny the name change, or MOD_RES_ALLOW to allow it.
@@ -896,16 +904,6 @@ class CoreExport Module : public classbase, public usecountbase
         */
        virtual ModResult OnAcceptConnection(int fd, ListenSocket* sock, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server);
 
-       /** Called whenever a user sets away or returns from being away.
-        * The away message is available as a parameter, but should not be modified.
-        * At this stage, it has already been copied into the user record.
-        * If awaymsg is empty, the user is returning from away.
-        * @param user The user setting away
-        * @param awaymsg The away message of the user, or empty if returning from away
-        * @return nonzero if the away message should be blocked - should ONLY be nonzero for LOCAL users (IS_LOCAL) (no output is returned by core)
-        */
-       virtual ModResult OnSetAway(User* user, const std::string &awaymsg);
-
        /** 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
@@ -919,37 +917,8 @@ class CoreExport Module : public classbase, public usecountbase
         */
        virtual ModResult OnSetConnectClass(LocalUser* user, ConnectClass* myclass);
 
-#ifdef INSPIRCD_ENABLE_TESTSUITE
-       /** Add test suite hooks here. These are used for testing functionality of a module
-        * via the --testsuite debugging parameter.
-        */
-       virtual void OnRunTestSuite();
-#endif
-
-       /** Called for every item in a NAMES list, so that modules may reformat portions of it as they see fit.
-        * For example NAMESX, channel mode +u and +I, and UHNAMES.
-        * @param issuer The user who is going to receive the NAMES list being built
-        * @param item The channel member being considered for inclusion
-        * @param prefixes The prefix character(s) to display, initially set to the prefix char of the most powerful
-        * prefix mode the member has, can be changed
-        * @param nick The nick to display, initially set to the member's nick, can be changed
-        * @return Return MOD_RES_PASSTHRU to allow the member to be displayed, MOD_RES_DENY to cause them to be
-        * excluded from this NAMES list
-        */
-       virtual ModResult OnNamesListItem(User* issuer, Membership* item, std::string& prefixes, std::string& nick);
-
        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 numeric Numeric to send; modifiable.
-        * @return MOD_RES_PASSTHRU to allow the line to be displayed, MOD_RES_DENY to hide it
-        */
-       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.
         * @param user The user whose IP is being set
@@ -965,6 +934,14 @@ class CoreExport Module : public classbase, public usecountbase
         * @param service ServiceProvider being unregistered.
         */
        virtual void OnServiceDel(ServiceProvider& service);
+
+       /** Called whenever a message is about to be written to a user.
+        * @param user The user who is having a message sent to them.
+        * @param msg The message which is being written to the user.
+        * @return MOD_RES_ALLOW to explicitly allow the message to be sent, MOD_RES_DENY to explicitly
+        * deny the message from being sent, or MOD_RES_PASSTHRU to let another module handle the event.
+        */
+       virtual ModResult OnUserWrite(LocalUser* user, ClientProtocol::Message& msg);
 };
 
 /** ModuleManager takes care of all things module-related
@@ -1015,7 +992,7 @@ class CoreExport ModuleManager : public fakederef<ModuleManager>
        Module::List EventHandlers[I_END];
 
        /** List of data services keyed by name */
-       std::multimap<std::string, ServiceProvider*> DataProviders;
+       std::multimap<std::string, ServiceProvider*, irc::insensitive_swo> DataProviders;
 
        /** A list of ServiceProviders waiting to be registered.
         * Non-NULL when constructing a Module, NULL otherwise.
@@ -1208,5 +1185,3 @@ class CoreExport ModuleManager : public fakederef<ModuleManager>
                return new y; \
        } \
        extern "C" DllExport const char inspircd_src_version[] = INSPIRCD_VERSION;
-
-#define COMMAND_INIT(c) MODULE_INIT(CommandModule<c>)