]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/modules.h
Make loading modules considerably more robust and user friendly.
[user/henk/code/inspircd.git] / include / modules.h
index ae438128d33cf40994256ba813e1695534fb5e5f..5e0c9ab077cd58aca711e95c4cafa888c86623cf 100644 (file)
@@ -1,13 +1,18 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
+ *   Copyright (C) 2019 iwalkalone <iwalkalone69@gmail.com>
+ *   Copyright (C) 2013 Adam <Adam@anope.org>
+ *   Copyright (C) 2012-2016, 2018 Attila Molnar <attilamolnar@hush.com>
+ *   Copyright (C) 2012-2013, 2016-2020 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2012 Robby <robby@chatbelgie.be>
  *   Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
- *   Copyright (C) 2006-2007, 2009 Dennis Friis <peavey@inspircd.org>
- *   Copyright (C) 2003-2008 Craig Edwards <craigedwards@brainbox.cc>
+ *   Copyright (C) 2009 Uli Schlachter <psychon@inspircd.org>
  *   Copyright (C) 2008 Thomas Stagner <aquanight@inspircd.org>
- *   Copyright (C) 2007 Robin Burchell <robin+git@viroteck.net>
- *   Copyright (C) 2006-2007 Oliver Lupton <oliverlupton@gmail.com>
- *   Copyright (C) 2003 randomdan <???@???>
+ *   Copyright (C) 2007-2009 Robin Burchell <robin+git@viroteck.net>
+ *   Copyright (C) 2007-2008, 2010 Craig Edwards <brain@inspircd.org>
+ *   Copyright (C) 2007 Oliver Lupton <om@inspircd.org>
+ *   Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
  *
  * This file is part of InspIRCd.  InspIRCd is free software: you can
  * redistribute it and/or modify it under the terms of the GNU General Public
 
 #pragma once
 
+#include "moduledefs.h"
 #include "dynamic.h"
 #include "base.h"
 #include "ctables.h"
 #include "inspsocket.h"
-#include <string>
-#include <deque>
-#include <sstream>
 #include "timer.h"
 #include "mode.h"
 
@@ -96,19 +99,6 @@ struct ModResult {
        }
 };
 
-/** InspIRCd major version.
- * 1.2 -> 102; 2.1 -> 201; 2.12 -> 212
- */
-#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 3
-
 /**
  * This #define allows us to call a method in all
  * loaded modules in a readable simple way, e.g.:
@@ -121,7 +111,8 @@ struct ModResult {
                _next = _i+1; \
                try \
                { \
-                       (*_i)->y x ; \
+                       if (!(*_i)->dying) \
+                               (*_i)->y x ; \
                } \
                catch (CoreException& modexcept) \
                { \
@@ -144,7 +135,8 @@ do { \
                _next = _i+1; \
                try \
                { \
-                       v = (*_i)->n args;
+                       if (!(*_i)->dying) \
+                               v = (*_i)->n args;
 
 #define WHILE_EACH_HOOK(n) \
                } \
@@ -212,21 +204,21 @@ enum Priority { PRIORITY_FIRST, PRIORITY_LAST, PRIORITY_BEFORE, PRIORITY_AFTER }
  */
 enum Implementation
 {
-       I_OnUserConnect, I_OnUserQuit, I_OnUserDisconnect, I_OnUserJoin, I_OnUserPart,
+       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_OnUserPostMessage, I_OnUserMessageBlocked, I_OnMode, I_OnShutdown,
        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_OnPreChangeHost, I_OnPreTopicChange,
+       I_OnPreChangeHost, I_OnPreTopicChange, I_OnConnectionFail,
        I_OnPostTopicChange, I_OnPostConnect, I_OnPostDeoper,
        I_OnPreChangeRealName, I_OnUserRegister, I_OnChannelPreDelete, I_OnChannelDelete,
-       I_OnPostOper, I_OnPostCommand, I_OnPostJoin,
+       I_OnPostOper, I_OnPostCommand, I_OnCommandBlocked, I_OnPostJoin,
        I_OnBuildNeighborList, I_OnGarbageCollect, I_OnSetConnectClass,
-       I_OnUserMessage, I_OnPassCompare, I_OnNamesListItem, I_OnNumeric,
+       I_OnUserMessage, I_OnPassCompare, I_OnNumeric,
        I_OnPreRehash, I_OnModuleRehash, I_OnChangeIdent, I_OnSetUserIP,
        I_OnServiceAdd, I_OnServiceDel, I_OnUserWrite,
        I_END
@@ -305,6 +297,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
@@ -722,6 +724,13 @@ class CoreExport Module : public classbase, public usecountbase
         */
        virtual void OnPostCommand(Command* command, const CommandBase::Params& parameters, LocalUser* user, CmdResult result, bool loop);
 
+       /** Called when a command was blocked before it could be executed.
+        * @param command The command being executed.
+        * @param parameters The parameters for the command.
+        * @param user The user issuing the command.
+        */
+       virtual void OnCommandBlocked(const std::string& command, const CommandBase::Params& parameters, LocalUser* user);
+
        /** 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
@@ -905,18 +914,6 @@ class CoreExport Module : public classbase, public usecountbase
         */
        virtual ModResult OnSetConnectClass(LocalUser* user, ConnectClass* myclass);
 
-       /** 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 local user's IP is set for the first time, or when a local user's IP changes due to
@@ -942,6 +939,20 @@ class CoreExport Module : public classbase, public usecountbase
         * 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);
+
+       /** Called when a user connection has been unexpectedly disconnected.
+        * @param user The user who has been unexpectedly disconnected.
+        * @param error The type of error which caused this connection failure.
+        * @return MOD_RES_ALLOW to explicitly retain the user as a zombie, MOD_RES_DENY to explicitly
+        * disconnect the user, or MOD_RES_PASSTHRU to let another module handle the event.
+        */
+       virtual ModResult OnConnectionFail(LocalUser* user, BufferedSocketError error);
+
+       /** Called before a server shuts down.
+        * @param reason The reason the server is shutting down.
+        * @param restart Whether the server is restarting.
+        */
+       virtual void OnShutdown(const std::string& reason);
 };
 
 /** ModuleManager takes care of all things module-related
@@ -992,7 +1003,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.
@@ -1164,24 +1175,3 @@ class CoreExport ModuleManager : public fakederef<ModuleManager>
         */
        void DelReferent(ServiceProvider* service);
 };
-
-/** Do not mess with these functions unless you know the C preprocessor
- * well enough to explain why they are needed. The order is important.
- */
-#define MODULE_INIT_STR MODULE_INIT_STR_FN_2(MODULE_INIT_SYM)
-#define MODULE_INIT_STR_FN_2(x) MODULE_INIT_STR_FN_1(x)
-#define MODULE_INIT_STR_FN_1(x) #x
-#define MODULE_INIT_SYM MODULE_INIT_SYM_FN_2(INSPIRCD_VERSION_MAJ, INSPIRCD_VERSION_API)
-#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
-
-/** This definition is used as shorthand for the various classes
- * and functions needed to make a module loadable by the OS.
- * It defines the class factory and external init_module function.
- */
-#define MODULE_INIT(y) \
-       extern "C" DllExport Module * MODULE_INIT_SYM() \
-       { \
-               return new y; \
-       } \
-       extern "C" DllExport const char inspircd_src_version[] = INSPIRCD_VERSION;