X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fmodules.h;h=b36326b1b6b5b5874dfef96552852caa07cb9c49;hb=635cb9d65f6d7f6758ae8ed874da00c8d94b6e39;hp=e4e439f7c610df71dfd88dda387a9195562d5efb;hpb=9ebda853f5bc470858501897442610699a5fd5de;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/modules.h b/include/modules.h index e4e439f7c..b36326b1b 100644 --- a/include/modules.h +++ b/include/modules.h @@ -1,18 +1,20 @@ /* * InspIRCd -- Internet Relay Chat Daemon * + * Copyright (C) 2020 Matt Schatz * Copyright (C) 2019 iwalkalone * Copyright (C) 2013 Adam * Copyright (C) 2012-2016, 2018 Attila Molnar - * Copyright (C) 2012-2013, 2016-2020 Sadie Powell + * Copyright (C) 2012-2013, 2017-2020 Sadie Powell * Copyright (C) 2012 Robby * Copyright (C) 2009-2010 Daniel De Graaf * Copyright (C) 2009 Uli Schlachter * Copyright (C) 2008 Thomas Stagner * Copyright (C) 2007-2009 Robin Burchell - * Copyright (C) 2007-2008, 2010 Craig Edwards * Copyright (C) 2007 Oliver Lupton - * Copyright (C) 2007 Dennis Friis + * Copyright (C) 2006-2007 Dennis Friis + * Copyright (C) 2006 John Brooks + * Copyright (C) 2003-2008, 2010 Craig Edwards * * 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 @@ -35,7 +37,6 @@ #include "base.h" #include "ctables.h" #include "inspsocket.h" -#include "timer.h" #include "mode.h" /** Used to specify the behaviour of a module. */ @@ -57,44 +58,72 @@ enum ModuleFlags VF_OPTCOMMON = 8 }; +/** The event was explicitly allowed. */ #define MOD_RES_ALLOW (ModResult(1)) + +/** The event was not explicitly allowed or denied. */ #define MOD_RES_PASSTHRU (ModResult(0)) + +/** The event was explicitly denied. */ #define MOD_RES_DENY (ModResult(-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; - ModResult() : res(0) {} - explicit ModResult(int r) : res(r) {} - inline bool operator==(const ModResult& r) const +/** Represents the result of a module event. */ +class ModResult +{ + private: + /** The underlying result value. */ + char result; + + public: + /** Creates a new instance of the ModResult class which defaults to MOD_RES_PASSTHRU. */ + ModResult() + : result(0) { - return res == r.res; } - inline bool operator!=(const ModResult& r) const + + /** Creates a new instance of the ModResult class with the specified value. */ + explicit ModResult(char res) + : result(res) + { + } + + /** Determines whether this ModResult has.the same value as \p res */ + inline bool operator==(const ModResult& res) const + { + return result == res.result; + } + + /** Determines whether this ModResult has.a different value to \p res */ + inline bool operator!=(const ModResult& res) const { - return res != r.res; + return result != res.result; } + + /** Determines whether a non-MOD_RES_PASSTHRU result has been set. */ inline bool operator!() const { - return !res; + return !result; } + + /** Checks whether the result is an MOD_RES_ALLOW or MOD_RES_PASSTHRU when the default is to allow. */ inline bool check(bool def) const { - return (res == 1 || (res == 0 && def)); + return (result == 1 || (result == 0 && def)); } - /** - * Merges two results, preferring ALLOW to DENY - */ - inline ModResult operator+(const ModResult& r) const + + /* Merges two results preferring MOD_RES_ALLOW to MOD_RES_DENY. */ + inline ModResult operator+(const ModResult& res) const { - if (res == r.res || r.res == 0) + // If the results are identical or the other result is MOD_RES_PASSTHRU + // then return this result. + if (result == res.result || res.result == 0) return *this; - if (res == 0) - return r; - // they are different, and neither is passthru + + // If this result is MOD_RES_PASSTHRU then return the other result. + if (result == 0) + return res; + + // Otherwise, they are different, and neither is MOD_RES_PASSTHRU. return MOD_RES_ALLOW; } }; @@ -185,7 +214,7 @@ class CoreExport Version /** Simple module version */ Version(const std::string &desc, int flags = VF_NONE); - /** Complex version information, including linking compatability data */ + /** Complex version information, including linking compatibility data */ Version(const std::string &desc, int flags, const std::string& linkdata); }; @@ -204,30 +233,85 @@ enum Priority { PRIORITY_FIRST, PRIORITY_LAST, PRIORITY_BEFORE, PRIORITY_AFTER } */ enum Implementation { - 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_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_OnConnectionFail, - I_OnPostTopicChange, I_OnPostConnect, I_OnPostDeoper, - I_OnPreChangeRealName, I_OnUserRegister, I_OnChannelPreDelete, I_OnChannelDelete, - I_OnPostOper, I_OnPostCommand, I_OnCommandBlocked, I_OnPostJoin, - I_OnBuildNeighborList, I_OnGarbageCollect, I_OnSetConnectClass, - I_OnUserMessage, I_OnPassCompare, I_OnNumeric, - I_OnPreRehash, I_OnModuleRehash, I_OnChangeIdent, I_OnSetUserIP, - I_OnServiceAdd, I_OnServiceDel, I_OnUserWrite, + I_On005Numeric, + I_OnAcceptConnection, + I_OnAddLine, + I_OnBackgroundTimer, + I_OnBuildNeighborList, + I_OnChangeHost, + I_OnChangeRealHost, + I_OnChangeIdent, + I_OnChangeRealName, + I_OnChannelDelete, + I_OnChannelPreDelete, + I_OnCheckBan, + I_OnCheckChannelBan, + I_OnCheckInvite, + I_OnCheckKey, + I_OnCheckLimit, + I_OnCheckReady, + I_OnCommandBlocked, + I_OnConnectionFail, + I_OnDecodeMetaData, + I_OnDelLine, + I_OnExpireLine, + I_OnExtBanCheck, + I_OnGarbageCollect, + I_OnKill, + I_OnLoadModule, + I_OnMode, + I_OnModuleRehash, + I_OnNumeric, + I_OnOper, + I_OnPassCompare, + I_OnPostCommand, + I_OnPostConnect, + I_OnPostDeoper, + I_OnPostJoin, + I_OnPostOper, + I_OnPostTopicChange, + I_OnPreChangeHost, + I_OnPreChangeRealName, + I_OnPreCommand, + I_OnPreMode, + I_OnPreRehash, + I_OnPreTopicChange, + I_OnRawMode, + I_OnSendSnotice, + I_OnServiceAdd, + I_OnServiceDel, + I_OnSetConnectClass, + I_OnSetUserIP, + I_OnShutdown, + I_OnUnloadModule, + I_OnUserConnect, + I_OnUserDisconnect, + I_OnUserInit, + I_OnUserInvite, + I_OnUserJoin, + I_OnUserKick, + I_OnUserMessage, + I_OnUserMessageBlocked, + I_OnUserPart, + I_OnUserPostInit, + I_OnUserPostMessage, + I_OnUserPostNick, + I_OnUserPreInvite, + I_OnUserPreJoin, + I_OnUserPreKick, + I_OnUserPreMessage, + I_OnUserPreNick, + I_OnUserPreQuit, + I_OnUserQuit, + I_OnUserRegister, + I_OnUserWrite, I_END }; /** Base class for all InspIRCd modules * This class is the base class for InspIRCd modules. All modules must inherit from this class, * its methods will be called when irc server events occur. class inherited from module must be - * instantiated by the ModuleFactory class (see relevent section) for the module to be initialised. + * instantiated by the ModuleFactory class (see relevant section) for the module to be initialised. */ class CoreExport Module : public classbase, public usecountbase { @@ -262,7 +346,7 @@ class CoreExport Module : public classbase, public usecountbase /** Module setup * \exception ModuleException Throwing this class, or any class derived from ModuleException, causes loading of the module to abort. */ - virtual void init() {} + virtual void init() { } /** Clean up prior to destruction * If you override, you must call this AFTER your module's cleanup @@ -274,9 +358,8 @@ class CoreExport Module : public classbase, public usecountbase */ virtual ~Module(); - virtual void Prioritize() - { - } + /** Called when the hooks provided by a module need to be prioritised. */ + virtual void Prioritize() { } /** This method is called when you should reload module specific configuration: * on boot, on a /REHASH and on module load. @@ -377,7 +460,7 @@ class CoreExport Module : public classbase, public usecountbase /** Called on rehash. * This method is called when a user initiates a module-specific rehash. This can be used to do - * expensive operations (such as reloading SSL certificates) that are not executed on a normal + * expensive operations (such as reloading TLS (SSL) certificates) that are not executed on a normal * rehash for efficiency. A rehash of this type does not reload the core configuration. * * @param user The user performing the rehash. @@ -447,7 +530,7 @@ class CoreExport Module : public classbase, public usecountbase /** Called after a user opers locally. * This is identical to Module::OnOper(), except it is called after OnOper so that other modules - * can be gauranteed to already have processed the oper-up, for example m_spanningtree has sent + * can be guaranteed to already have processed the oper-up, for example m_spanningtree has sent * out the OPERTYPE, etc. * @param user The user who is opering up * @param opername The name of the oper that the user is opering up to. Only valid locally. Empty string otherwise. @@ -473,7 +556,7 @@ class CoreExport Module : public classbase, public usecountbase virtual ModResult OnUserPreInvite(User* source,User* dest,Channel* channel, time_t timeout); /** Called after a user has been successfully invited to a channel. - * You cannot prevent the invite from occuring using this function, to do that, + * You cannot prevent the invite from occurring using this function, to do that, * use OnUserPreInvite instead. * @param source The user who is issuing the INVITE * @param dest The user being invited @@ -570,6 +653,13 @@ class CoreExport Module : public classbase, public usecountbase */ virtual void OnChangeHost(User* user, const std::string &newhost); + /** Called whenever a user's real hostname is changed. + * This event triggers after the host has been set. + * @param user The user whos host is being changed + * @param newhost The new hostname being set + */ + virtual void OnChangeRealHost(User* user, const std::string& newhost); + /** 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 @@ -640,7 +730,7 @@ class CoreExport Module : public classbase, public usecountbase /** Called when a 005 numeric is about to be output. * The module should modify the 005 numeric if needed to indicate its features. - * @param tokens The 005 map to be modified if neccessary. + * @param tokens The 005 map to be modified if necessary. */ virtual void On005Numeric(std::map& tokens); @@ -666,7 +756,7 @@ class CoreExport Module : public classbase, public usecountbase * for example loaded "m_killwidgets.so" with "m_makewidgets.so". It is highly * recommended that modules do *NOT* bail if they cannot satisfy dependencies, * but instead operate under reduced functionality, unless the dependency is - * absolutely neccessary (e.g. a module that extends the features of another + * absolutely necessary (e.g. a module that extends the features of another * module). * @param mod A pointer to the new module */ @@ -679,7 +769,7 @@ class CoreExport Module : public classbase, public usecountbase * for example loaded "m_killwidgets.so" with "m_makewidgets.so". It is highly * recommended that modules do *NOT* bail if they cannot satisfy dependencies, * but instead operate under reduced functionality, unless the dependency is - * absolutely neccessary (e.g. a module that extends the features of another + * absolutely necessary (e.g. a module that extends the features of another * module). * @param mod Pointer to the module being unloaded (still valid) */ @@ -687,18 +777,18 @@ class CoreExport Module : public classbase, public usecountbase /** Called once every five seconds for background processing. * This timer can be used to control timed features. Its period is not accurate - * enough to be used as a clock, but it is gauranteed to be called at least once in + * enough to be used as a clock, but it is guaranteed to be called at least once in * any five second period, directly from the main loop of the server. * @param curtime The current timer derived from time(2) */ virtual void OnBackgroundTimer(time_t curtime); /** Called whenever any command is about to be executed. - * This event occurs for all registered commands, wether they are registered in the core, + * This event occurs for all registered commands, whether they are registered in the core, * or another module, and for invalid commands. Invalid commands may only be sent to this * function when the value of validated is false. By returning 1 from this method you may prevent the * command being executed. If you do this, no output is created by the core, and it is - * down to your module to produce any output neccessary. + * down to your module to produce any output necessary. * Note that unless you return 1, you should not destroy any structures (e.g. by using * InspIRCd::QuitUser) otherwise when the command's handler function executes after your * method returns, it will be passed an invalid pointer to the user object and crash!) @@ -712,7 +802,7 @@ class CoreExport Module : public classbase, public usecountbase 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, + * This event occurs for all registered commands, whether they are registered in the core, * or another module, but it will not occur for invalid commands (e.g. ones which do not * exist within the command table). The result code returned by the command handler is * provided. @@ -769,7 +859,7 @@ class CoreExport Module : public classbase, public usecountbase virtual ModResult OnUserRegister(LocalUser* user); /** Called whenever a user joins a channel, to determine if invite checks should go ahead or not. - * This method will always be called for each join, wether or not the channel is actually +i, and + * This method will always be called for each join, whether or not the channel is actually +i, and * determines the outcome of an if statement around the whole section of invite checking code. * return 1 to explicitly allow the join to go ahead or 0 to ignore the event. * @param user The user joining the channel @@ -792,7 +882,7 @@ class CoreExport Module : public classbase, public usecountbase virtual ModResult OnRawMode(User* user, Channel* chan, ModeHandler* mh, const std::string& param, bool adding); /** Called whenever a user joins a channel, to determine if key checks should go ahead or not. - * This method will always be called for each join, wether or not the channel is actually +k, and + * This method will always be called for each join, whether or not the channel is actually +k, and * determines the outcome of an if statement around the whole section of key checking code. * if the user specified no key, the keygiven string will be a valid but empty value. * return 1 to explicitly allow the join to go ahead or 0 to ignore the event. @@ -804,7 +894,7 @@ class CoreExport Module : public classbase, public usecountbase virtual ModResult OnCheckKey(User* user, Channel* chan, const std::string &keygiven); /** Called whenever a user joins a channel, to determine if channel limit checks should go ahead or not. - * This method will always be called for each join, wether or not the channel is actually +l, and + * This method will always be called for each join, whether or not the channel is actually +l, and * determines the outcome of an if statement around the whole section of channel limit checking code. * return 1 to explicitly allow the join to go ahead or 0 to ignore the event. * @param user The user joining the channel @@ -960,6 +1050,7 @@ class CoreExport Module : public classbase, public usecountbase class CoreExport ModuleManager : public fakederef { public: + typedef std::multimap DataProviderMap; typedef std::vector ServiceList; private: @@ -1002,7 +1093,7 @@ class CoreExport ModuleManager : public fakederef Module::List EventHandlers[I_END]; /** List of data services keyed by name */ - std::multimap DataProviders; + DataProviderMap DataProviders; /** A list of ServiceProviders waiting to be registered. * Non-NULL when constructing a Module, NULL otherwise. @@ -1058,17 +1149,17 @@ class CoreExport ModuleManager : public fakederef void SetPriority(Module* mod, Priority s); /** Attach an event to a module. - * You may later detatch the event with ModuleManager::Detach(). - * If your module is unloaded, all events are automatically detatched. + * You may later detach the event with ModuleManager::Detach(). + * If your module is unloaded, all events are automatically detached. * @param i Event type to attach * @param mod Module to attach event to * @return True if the event was attached */ bool Attach(Implementation i, Module* mod); - /** Detatch an event from a module. + /** Detach an event from a module. * This is not required when your module unloads, as the core will - * automatically detatch your module from all events it is attached to. + * automatically detach your module from all events it is attached to. * @param i Event type to detach * @param mod Module to detach event from * @return True if the event was detached