X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fmodules.h;h=b4f13c6b72e44df665c32e71390071db9782fd74;hb=b30988ee6069a6ebe0805fb79a057d7e05688bc6;hp=082079cd98512213070159f912047932b3f00987;hpb=124c17e14134a4999afc1a5e981ab7c75b3694b9;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/modules.h b/include/modules.h index 082079cd9..b4f13c6b7 100644 --- a/include/modules.h +++ b/include/modules.h @@ -114,8 +114,8 @@ struct ModResult { * 'FOREACH_MOD(OnConnect,(user));' */ #define FOREACH_MOD(y,x) do { \ - const IntModuleList& _handlers = ServerInstance->Modules->EventHandlers[I_ ## y]; \ - for (IntModuleList::const_reverse_iterator _i = _handlers.rbegin(), _next; _i != _handlers.rend(); _i = _next) \ + const Module::List& _handlers = ServerInstance->Modules->EventHandlers[I_ ## y]; \ + for (Module::List::const_reverse_iterator _i = _handlers.rbegin(), _next; _i != _handlers.rend(); _i = _next) \ { \ _next = _i+1; \ try \ @@ -137,8 +137,8 @@ struct ModResult { */ #define DO_EACH_HOOK(n,v,args) \ do { \ - const IntModuleList& _handlers = ServerInstance->Modules->EventHandlers[I_ ## n]; \ - for (IntModuleList::const_reverse_iterator _i = _handlers.rbegin(), _next; _i != _handlers.rend(); _i = _next) \ + const Module::List& _handlers = ServerInstance->Modules->EventHandlers[I_ ## n]; \ + for (Module::List::const_reverse_iterator _i = _handlers.rbegin(), _next; _i != _handlers.rend(); _i = _next) \ { \ _next = _i+1; \ try \ @@ -212,22 +212,22 @@ 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_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_OnChangeHost, I_OnChangeName, I_OnAddLine, I_OnDelLine, I_OnExpireLine, + 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_OnChangeLocalUserGECOS, I_OnUserRegister, I_OnChannelPreDelete, I_OnChannelDelete, - I_OnPostOper, I_OnSetAway, I_OnPostCommand, I_OnPostJoin, + I_OnPreChangeRealName, I_OnUserRegister, I_OnChannelPreDelete, I_OnChannelDelete, + 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_OnPreRehash, I_OnModuleRehash, I_OnChangeIdent, I_OnSetUserIP, + I_OnServiceAdd, I_OnServiceDel, I_OnUserWrite, I_END }; @@ -244,9 +244,13 @@ class CoreExport Module : public classbase, public usecountbase void DetachEvent(Implementation i); public: + /** A list of modules. */ + typedef std::vector List; + /** File that this module was loaded from */ std::string ModuleSourceFile; + /** Reference to the dlopen() value */ DLLManager* ModuleDLLManager; @@ -453,18 +457,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, @@ -557,9 +549,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. @@ -576,12 +567,12 @@ class CoreExport Module : public classbase, public usecountbase */ virtual void OnChangeHost(User* user, const std::string &newhost); - /** Called whenever a user's GECOS (realname) is changed. + /** Called whenever a user's real name is changed. * This event triggers after the name has been set. - * @param user The user who's GECOS is being changed - * @param gecos The new GECOS being set on the user + * @param user The user who's real name is being changed + * @param real The new real name being set on the user */ - virtual void OnChangeName(User* user, const std::string &gecos); + virtual void OnChangeRealName(User* user, const std::string& real); /** Called whenever a user's IDENT is changed. * This event triggers after the name has been set. @@ -713,10 +704,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, std::vector& 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, @@ -727,9 +717,9 @@ 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 std::vector& 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. @@ -835,15 +825,15 @@ 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 GECOS (fullname field) is attempted. - * return 1 to deny the name change, or 0 to allow it. - * @param user The user whos GECOS will be changed - * @param newhost The new GECOS - * @return 1 to deny the GECOS change, 0 to allow + /** 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. + * @param user The user whos real name will be changed + * @param newhost The new real name. + * @return MOD_RES_DENY to deny the real name change, MOD_RES_ALLOW to allow */ - virtual ModResult OnChangeLocalUserGECOS(LocalUser* user, const std::string &newhost); + virtual ModResult OnPreChangeRealName(LocalUser* user, const std::string &newhost); /** Called before a topic is changed. * Return 1 to deny the topic change, 0 to check details on the change, -1 to let it through with no checks @@ -892,16 +882,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 @@ -936,16 +916,6 @@ class CoreExport Module : public classbase, public usecountbase 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& 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 @@ -961,11 +931,9 @@ class CoreExport Module : public classbase, public usecountbase * @param service ServiceProvider being unregistered. */ virtual void OnServiceDel(ServiceProvider& service); -}; -/** A list of modules - */ -typedef std::vector IntModuleList; + virtual ModResult OnUserWrite(LocalUser* user, ClientProtocol::Message& msg); +}; /** ModuleManager takes care of all things module-related * in the core. @@ -1012,7 +980,7 @@ class CoreExport ModuleManager : public fakederef /** Event handler hooks. * This needs to be public to be used by FOREACH_MOD and friends. */ - IntModuleList EventHandlers[I_END]; + Module::List EventHandlers[I_END]; /** List of data services keyed by name */ std::multimap DataProviders; @@ -1198,27 +1166,6 @@ class CoreExport ModuleManager : public fakederef #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 INSPIRCD_STATIC - -struct AllCommandList { - typedef Command* (*fn)(Module*); - AllCommandList(fn cmd); -}; -#define COMMAND_INIT(x) static Command* MK_ ## x(Module* m) { return new x(m); } \ - static const AllCommandList PREP_ ## x(&MK_ ## x); - -struct AllModuleList { - typedef Module* (*fn)(); - fn init; - std::string name; - AllModuleList(fn mod, const std::string& Name); -}; - -#define MODULE_INIT(x) static Module* MK_ ## x() { return new x; } \ - static const AllModuleList PREP_ ## x(&MK_ ## x, MODNAME ".so"); - -#else - /** 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. @@ -1229,7 +1176,3 @@ struct AllModuleList { return new y; \ } \ extern "C" DllExport const char inspircd_src_version[] = INSPIRCD_VERSION; - -#define COMMAND_INIT(c) MODULE_INIT(CommandModule) - -#endif