X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fmodules.h;h=972dabb43042c06964fd262713980825def5a29d;hb=74066e0f563ef630e432d3bbb10544318b70ade3;hp=d4c54973070381b332d733c30a3d842fa4345de7;hpb=6d03943426dcce76ba66567a9b18425a5ebb4c0c;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/modules.h b/include/modules.h index d4c549730..972dabb43 100644 --- a/include/modules.h +++ b/include/modules.h @@ -35,7 +35,8 @@ enum ModuleFlags { VF_VENDOR = 2, // module is a vendor module (came in the original tarball, not 3rd party) VF_SERVICEPROVIDER = 4, // module provides a service to other modules (can be a dependency) VF_COMMON = 8, // module needs to be common on all servers in a network to link - VF_OPTCOMMON = 16 // module should be common on all servers for unsurprising behavior + VF_OPTCOMMON = 16, // module should be common on all servers for unsurprising behavior + VF_CORE = 32 // module is a core command, can be assumed loaded on all servers }; /** Used with SendToMode() @@ -103,8 +104,8 @@ struct ModResult { } }; -/** If you change the module API, change this value. */ -#define API_VERSION 13000 +/** If you change the module API in any way, increment this value. */ +#define API_VERSION 132 class ServerConfig; @@ -216,7 +217,7 @@ do { \ /** Is a remote user */ #define IS_REMOTE(x) (x->GetFd() < 0) /** Is a fake user */ -#define IS_FAKE(x) (x->GetFd() == FD_FAKEUSER_NUMBER) +#define IS_SERVER(x) (x->GetFd() == FD_FAKEUSER_NUMBER) /** Is a module created user */ #define IS_MODULE_CREATED(x) (x->GetFd() == FD_MAGIC_NUMBER) /** Is an oper */ @@ -225,13 +226,14 @@ do { \ #define IS_AWAY(x) (!x->awaymsg.empty()) /** Holds a module's Version information. - * The four members (set by the constructor only) indicate details as to the version number - * of a module. A class of type Version is returned by the GetVersion method of the Module class. - * The flags and API values represent the module flags and API version of the module. - * The API version of a module must match the API version of the core exactly for the module to - * load successfully. + * The members (set by the constructor only) indicate details as to the version number + * of a module. A class of type Version is returned by the GetVersion method of the Module class. + * + * The core provides only one implementation of the template, causing a run-time linking + * error when attempting to load a module compiled against a different API_VERSION. */ -class CoreExport Version : public classbase +template +class CoreExport VersionBase : public classbase { public: /** Module description @@ -241,87 +243,49 @@ class CoreExport Version : public classbase */ const std::string version; - /** Flags and API version + /** Flags */ - const int Flags, API; + const int Flags; /** Initialize version class */ - Version(const std::string &desc, int flags, - int api_ver = API_VERSION, const std::string& src_rev = VERSION " r" REVISION); + VersionBase(const std::string &desc, int flags = VF_NONE, int dummy = 0, const std::string& src_rev = VERSION " r" REVISION); }; -/** The ModuleMessage class is the base class of Request and Event - * This class is used to represent a basic data structure which is passed - * between modules for safe inter-module communications. - */ -class CoreExport ModuleMessage : public Extensible -{ - public: - /** Destructor - */ - virtual ~ModuleMessage() {}; -}; +typedef VersionBase Version; /** The Request class is a unicast message directed at a given module. * When this class is properly instantiated it may be sent to a module * using the Send() method, which will call the given module's OnRequest * method with this class as its parameter. */ -class CoreExport Request : public ModuleMessage +class CoreExport Request : public classbase { - protected: - /** This member holds a pointer to arbitary data set by the emitter of the message - */ - char* data; + public: /** This should be a null-terminated string identifying the type of request, * all modules should define this and use it to determine the nature of the * request before they attempt to cast the Request in any way. */ - const char* id; + const char* const id; /** This is a pointer to the sender of the message, which can be used to * directly trigger events, or to create a reply. */ - Module* source; + Module* const source; /** The single destination of the Request */ - Module* dest; - public: - /** Create a new Request - * This is for the 'old' way of casting whatever the data is - * to char* and hoping you get the right thing at the other end. - * This is slowly being depreciated in favor of the 'new' way. - */ - Request(char* anydata, Module* src, Module* dst); + Module* const dest; + /** Create a new Request * This is for the 'new' way of defining a subclass * of Request and defining it in a common header, * passing an object of your Request subclass through * as a Request* and using the ID string to determine - * what to cast it back to and the other end. This is - * much safer as there are no casts not confirmed by - * the ID string, and all casts are child->parent and - * can be checked at runtime with dynamic_cast<>() + * what to cast it back to and the other end. */ Request(Module* src, Module* dst, const char* idstr); - /** Fetch the Request data - */ - char* GetData(); - /** Fetch the ID string - */ - const char* GetId(); - /** Fetch the request source - */ - Module* GetSource(); - /** Fetch the request destination (should be 'this' in the receiving module) - */ - Module* GetDest(); /** Send the Request. - * Upon returning the result will be arbitary data returned by the module you - * sent the request to. It is up to your module to know what this data is and - * how to deal with it. */ - const char* Send(); + void Send(); }; @@ -330,40 +294,27 @@ class CoreExport Request : public ModuleMessage * using the Send() method, which will trigger the OnEvent method in * all modules passing the object as its parameter. */ -class CoreExport Event : public ModuleMessage +class CoreExport Event : public classbase { - protected: - /** This member holds a pointer to arbitary data set by the emitter of the message - */ - char* data; + public: /** This is a pointer to the sender of the message, which can be used to * directly trigger events, or to create a reply. */ - Module* source; + Module* const source; /** The event identifier. * This is arbitary text which should be used to distinguish * one type of event from another. */ - std::string id; - public: + const std::string id; + /** Create a new Event */ - Event(char* anydata, Module* src, const std::string &eventid); - /** Get the Event data - */ - char* GetData(); - /** Get the event Source - */ - Module* GetSource(); - /** Get the event ID. - * Use this to determine the event type for safe casting of the data - */ - std::string GetEventID(); + Event(Module* src, const std::string &eventid); /** Send the Event. * The return result of an Event::Send() will always be NULL as * no replies are expected. */ - char* Send(); + void Send(); }; /** Priority types which can be returned from Module::Prioritize() @@ -380,17 +331,17 @@ enum Implementation I_OnUserPreInvite, I_OnUserInvite, I_OnUserPreMessage, I_OnUserPreNotice, I_OnUserPreNick, I_OnUserMessage, I_OnUserNotice, I_OnMode, I_OnGetServerDescription, I_OnSyncUser, I_OnSyncChannel, I_OnDecodeMetaData, I_OnWallops, - I_OnChangeHost, I_OnChangeName, I_OnAddLine, I_OnDelLine, I_OnExpireLine, I_OnCleanup, + I_OnChangeHost, I_OnChangeName, I_OnAddLine, I_OnDelLine, I_OnExpireLine, I_OnUserPostNick, I_OnPreMode, I_On005Numeric, I_OnKill, I_OnRemoteKill, 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_OnStats, I_OnChangeLocalUserHost, I_OnChangeLocalUserGecos, I_OnPreTopicChange, - I_OnPostTopicChange, I_OnEvent, I_OnRequest, I_OnGlobalOper, I_OnPostConnect, I_OnAddBan, + I_OnPostTopicChange, I_OnEvent, I_OnGlobalOper, I_OnPostConnect, I_OnAddBan, I_OnDelBan, I_OnChangeLocalUserGECOS, I_OnUserRegister, I_OnChannelPreDelete, I_OnChannelDelete, I_OnPostOper, I_OnSyncNetwork, I_OnSetAway, I_OnUserList, I_OnPostCommand, I_OnPostJoin, - I_OnWhoisLine, I_OnBuildExemptList, I_OnGarbageCollect, I_OnBufferFlushed, + I_OnWhoisLine, I_OnBuildNeighborList, I_OnGarbageCollect, I_OnText, I_OnPassCompare, I_OnRunTestSuite, I_OnNamesListItem, I_OnNumeric, I_OnHookIO, - I_OnHostCycle, I_OnPreRehash, I_OnModuleRehash, I_OnSendWhoLine, I_OnChangeIdent, + I_OnPreRehash, I_OnModuleRehash, I_OnSendWhoLine, I_OnChangeIdent, I_END }; @@ -407,6 +358,9 @@ class CoreExport Module : public Extensible /** File that this module was loaded from */ std::string ModuleSourceFile; + /** Reference to the dlopen() value + */ + DLLFactory* ModuleDLLFactory; /** Default constructor. * Creates a module class. @@ -415,6 +369,11 @@ class CoreExport Module : public Extensible */ Module(); + /** Clean up prior to destruction + * If you override, you must call this AFTER your module's cleanup + */ + virtual bool cull(); + /** Default destructor. * destroys a module class */ @@ -672,16 +631,16 @@ class CoreExport Module : public Extensible */ virtual ModResult OnUserPreNotice(User* user,void* dest,int target_type, std::string &text,char status, CUList &exempt_list); - /** Called whenever the server wants to build the exemption list for a channel, but is not directly doing a PRIVMSG or NOTICE. - * For example, the spanningtree protocol will call this event when passing a privmsg on (but not processing it directly). - * @param message_type The message type, either MSG_PRIVMSG or MSG_NOTICE - * @param chan The channel to build the exempt list of - * @param sender The original sender of the PRIVMSG or NOTICE - * @param status The status char to be used for the channel list - * @param exempt_list The exempt list to be populated - * @param text The original message text causing the exempt list to be built + /** Called when sending a message to all "neighbors" of a given user - + * that is, all users that share a common channel. This is used in + * commands such as NICK, QUIT, etc. + * @param source The source of the message + * @param include_c Channels to scan for users to include + * @param exceptions Map of user->bool that overrides the inclusion decision + * + * Set exceptions[user] = true to include, exceptions[user] = false to exclude */ - virtual void OnBuildExemptList(MessageType message_type, Channel* chan, User* sender, char status, CUList &exempt_list, const std::string &text); + virtual void OnBuildNeighborList(User* source, UserChanList &include_c, std::map &exceptions); /** Called before any nickchange, local or remote. This can be used to implement Q-lines etc. * Please note that although you can see remote nickchanges through this function, you should @@ -1154,22 +1113,17 @@ class CoreExport Module : public Extensible */ virtual void OnPostTopicChange(User* user, Channel* chan, const std::string &topic); - /** Called whenever an Event class is sent to all module by another module. - * Please see the documentation of Event::Send() for further information. The Event sent can - * always be assumed to be non-NULL, you should *always* check the value of Event::GetEventID() - * before doing anything to the event data, and you should *not* change the event data in any way! + /** Called whenever an Event class is sent to all modules by another module. + * You should *always* check the value of Event::id to determine the event type. * @param event The Event class being received */ - virtual void OnEvent(Event* event); + virtual void OnEvent(Event& event); /** Called whenever a Request class is sent to your module by another module. - * Please see the documentation of Request::Send() for further information. The Request sent - * can always be assumed to be non-NULL, you should not change the request object or its data. - * Your method may return arbitary data in the char* result which the requesting module - * may be able to use for pre-determined purposes (e.g. the results of an SQL query, etc). + * The value of Request::id should be used to determine the type of request. * @param request The Request class being received */ - virtual const char* OnRequest(Request* request); + virtual void OnRequest(Request& request); /** Called whenever a password check is to be made. Replaces the old OldOperCompare API. * The password field (from the config file) is in 'password' and is to be compared against @@ -1305,15 +1259,6 @@ class CoreExport Module : public Extensible */ virtual void OnGarbageCollect(); - /** Called whenever a user's write buffer has been completely sent. - * This is called when the user's write buffer is completely empty, and - * there are no more pending bytes to be written and no pending write events - * in the socket engine's queue. This may be used to refill the buffer with - * data which is being spooled in a controlled manner, e.g. LIST lines. - * @param user The user who's buffer is now empty. - */ - virtual void OnBufferFlushed(User* user); - /** Add test suite hooks here. These are used for testing functionality of a module * via the --testsuite debugging parameter. */ @@ -1327,12 +1272,6 @@ class CoreExport Module : public Extensible virtual ModResult OnNumeric(User* user, unsigned int numeric, const std::string &text); - /** Called for every time the user's host or ident changes, to indicate wether or not the 'Changing host' - * message should be sent, if enabled. Certain modules such as auditorium may opt to hide this message - * even if it is enabled. - */ - virtual ModResult OnHostCycle(User* user); - /** Called whenever a result from /WHO is about to be returned * @param source The user running the /WHO query * @param user The user that this line of the query is about @@ -1515,14 +1454,6 @@ class CoreExport FileReader : public classbase int FileSize(); }; -/** A DLLFactory (designed to load shared objects) containing a - * handle to a module's init_module() function. Unfortunately, - * due to the design of shared object systems we must keep this - * hanging around, as if we remove this handle, we remove the - * shared object file from memory (!) - */ -typedef DLLFactory ircd_module; - /** A list of modules */ typedef std::vector IntModuleList; @@ -1556,7 +1487,7 @@ class CoreExport ModuleManager : public classbase /** List of loaded modules and shared object/dll handles * keyed by module name */ - std::map > Modules; + std::map Modules; enum { PRIO_STATE_FIRST,