X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fmodules.h;h=f3d7ab18e4ca27c9f9148e25d6d29595fba9c423;hb=fca345d6b5bc453d3e0b914a1c7a1865991ea220;hp=3b056223c158a533d4ad90d885342acac6645452;hpb=93876363f89ea7a451ba1e18407e08a539854208;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/modules.h b/include/modules.h index 3b056223c..f3d7ab18e 100644 --- a/include/modules.h +++ b/include/modules.h @@ -18,10 +18,6 @@ #ifndef __MODULES_H #define __MODULES_H -/** log levels - */ -enum DebugLevels { DEBUG, VERBOSE, DEFAULT, SPARSE, NONE }; - /** Used with OnAccessCheck() method of modules */ enum AccessControlType { @@ -84,11 +80,6 @@ class Module; typedef std::deque file_cache; typedef file_cache string_list; -/** Holds a list of users in a channel - */ -typedef std::deque chanuserlist; - - /** Holds a list of 'published features' for modules. */ typedef std::map featurelist; @@ -98,9 +89,9 @@ typedef std::map featurelist; * loaded modules in a readable simple way, e.g.: * 'FOREACH_MOD(I_OnXonnwxr,OnConnect(user));' */ -#define FOREACH_MOD(y,x) if (Config->global_implementation[y] > 0) { \ +#define FOREACH_MOD(y,x) if (ServerInstance->Config->global_implementation[y] > 0) { \ for (int _i = 0; _i <= MODCOUNT; _i++) { \ - if (Config->implement_lists[_i][y]) \ + if (ServerInstance->Config->implement_lists[_i][y]) \ try \ { \ modules[_i]->x ; \ @@ -112,15 +103,28 @@ typedef std::map featurelist; } \ } +#define FOREACH_MOD_I(z,y,x) if (z->Config->global_implementation[y] > 0) { \ + for (int _i = 0; _i <= MODCOUNT; _i++) { \ + if (z->Config->implement_lists[_i][y]) \ + try \ + { \ + modules[_i]->x ; \ + } \ + catch (ModuleException& modexcept) \ + { \ + log(DEBUG,"Module exception caught: %s",modexcept.GetReason()); \ + } \ + } \ +} /** * This define is similar to the one above but returns a result in MOD_RESULT. * The first module to return a nonzero result is the value to be accepted, * and any modules after are ignored. */ -#define FOREACH_RESULT(y,x) { if (Config->global_implementation[y] > 0) { \ +#define FOREACH_RESULT(y,x) { if (ServerInstance->Config->global_implementation[y] > 0) { \ MOD_RESULT = 0; \ for (int _i = 0; _i <= MODCOUNT; _i++) { \ - if (Config->implement_lists[_i][y]) {\ + if (ServerInstance->Config->implement_lists[_i][y]) { \ try \ { \ int res = modules[_i]->x ; \ @@ -138,6 +142,27 @@ typedef std::map featurelist; } \ } +#define FOREACH_RESULT_I(z,y,x) { if (z->Config->global_implementation[y] > 0) { \ + MOD_RESULT = 0; \ + for (int _i = 0; _i <= MODCOUNT; _i++) { \ + if (z->Config->implement_lists[_i][y]) { \ + try \ + { \ + int res = modules[_i]->x ; \ + if (res != 0) { \ + MOD_RESULT = res; \ + break; \ + } \ + } \ + catch (ModuleException& modexcept) \ + { \ + log(DEBUG,"Module exception cought: %s",modexcept.GetReason()); \ + } \ + } \ + } \ + } \ +} + #define FD_MAGIC_NUMBER -42 // useful macros @@ -157,18 +182,6 @@ class Version : public classbase Version(int major, int minor, int revision, int build, int flags); }; -/** Holds /ADMIN data - * This class contains the admin details of the local server. It is constructed by class Server, - * and has three read-only values, Name, Email and Nick that contain the specified values for the - * server where the module is running. - */ -class Admin : public classbase -{ - public: - const std::string Name, Email, Nick; - Admin(std::string name, std::string email, std::string nick); -}; - /** 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. @@ -1192,7 +1205,7 @@ class Module : public Extensible * @param Number of characters to write * @return Number of characters actually written or 0 if you didn't handle the operation */ - virtual int OnRawSocketWrite(int fd, char* buffer, int count); + virtual int OnRawSocketWrite(int fd, const char* buffer, int count); /** Called immediately before any socket is closed. When this event is called, shutdown() * has not yet been called on the socket. @@ -1237,22 +1250,6 @@ class Module : public Extensible class Server : public Extensible { public: - /** Default constructor. - * Creates a Server object. - */ - Server(); - - /** Default destructor. - * Destroys a Server object. - */ - virtual ~Server(); - - /** Obtains a pointer to the server's ServerConfig object. - * The ServerConfig object contains most of the configuration data - * of the IRC server, as read from the config file by the core. - */ - ServerConfig* GetConfig(); - /** For use with Module::Prioritize(). * When the return value of this function is returned from * Module::Prioritize(), this specifies that the module wishes @@ -1272,15 +1269,6 @@ class Server : public Extensible * @returns a priority ID which the core uses to relocate the module in the list */ long PriorityAfter(const std::string &modulename); - - /** Sends text to all opers. - * This method sends a server notice to all opers with the usermode +s. - */ - virtual void SendOpers(const std::string &s); - - /** Returns the version string of this server - */ - std::string GetVersion(); /** Publish a 'feature'. * There are two ways for a module to find another module it depends on. @@ -1325,124 +1313,29 @@ class Server : public Extensible * This method writes a line of text to the log. If the level given is lower than the * level given in the configuration, this command has no effect. */ - virtual void Log(int level, const std::string &s); - - /** Sends a line of text down a TCP/IP socket. - * This method writes a line of text to an established socket, cutting it to 510 characters - * plus a carriage return and linefeed if required. - */ - virtual void Send(int Socket, const std::string &s); - - /** Sends text from the server to a socket. - * This method writes a line of text to an established socket, with the servername prepended - * as used by numerics (see RFC 1459) - */ - virtual void SendServ(int Socket, const std::string &s); - - /** Sends text from a user to a socket. - * This method writes a line of text to an established socket, with the given user's nick/ident - * /host combination prepended, as used in PRIVSG etc commands (see RFC 1459) - */ - virtual void SendFrom(int Socket, userrec* User, const std::string &s); - - /** Sends text from a user to another user. - * This method writes a line of text to a user, with a user's nick/ident - * /host combination prepended, as used in PRIVMSG etc commands (see RFC 1459) - * If you specify NULL as the source, then the data will originate from the - * local server, e.g. instead of: - * - * :user!ident@host TEXT - * - * The format will become: - * - * :localserver TEXT - * - * Which is useful for numerics and server notices to single users, etc. - */ - virtual void SendTo(userrec* Source, userrec* Dest, const std::string &s); - - /** Returns true if two users share a common channel. - * This method is used internally by the NICK and QUIT commands, and the Server::SendCommon - * method. - */ - virtual bool CommonChannels(userrec* u1, userrec* u2); - - /** Sends text from a user to one or more channels (mulicast). - * This method writes a line of text to all users which share a common channel with a given - * user, with the user's nick/ident/host combination prepended, as used in PRIVMSG etc - * commands (see RFC 1459). If the IncludeSender flag is set, then the text is also sent - * back to the user from which it originated, as seen in NICK (see RFC 1459). Otherwise, it - * is only sent to the other recipients, as seen in QUIT. - */ - virtual void SendCommon(userrec* User, const std::string &text, bool IncludeSender); - - /** Sends a WALLOPS message. - * This method writes a WALLOPS message to all users with the +w flag, originating from the - * specified user. - */ - virtual void SendWallops(userrec* User, const std::string &text); + void Log(int level, const std::string &s); /** Returns true if a nick is valid. * Nicks for unregistered connections will return false. */ - virtual bool IsNick(const std::string &nick); - - /** Returns a count of the number of users on a channel. - * This will NEVER be 0, as if the chanrec exists, it will have at least one user in the channel. - */ - virtual int CountUsers(chanrec* c); - - /** Adds an InspTimer which will trigger at a future time - */ - virtual void AddTimer(InspTimer* T); - - /** Attempts to look up a nick and return a pointer to it. - * This function will return NULL if the nick does not exist. - */ - virtual userrec* FindNick(const std::string &nick); + bool IsNick(const std::string &nick); /** Attempts to look up a nick using the file descriptor associated with that nick. * This function will return NULL if the file descriptor is not associated with a valid user. */ - virtual userrec* FindDescriptor(int socket); - - /** Attempts to look up a channel and return a pointer to it. - * This function will return NULL if the channel does not exist. - */ - virtual chanrec* FindChannel(const std::string &channel); - - /** Attempts to look up a user's privilages on a channel. - * This function will return a string containing either @, %, +, or an empty string, - * representing the user's privilages upon the channel you specify. - */ - virtual std::string ChanMode(userrec* User, chanrec* Chan); + userrec* FindDescriptor(int socket); /** Returns the server name of the server where the module is loaded. */ - virtual std::string GetServerName(); - - /** Returns the network name, global to all linked servers. - */ - virtual std::string GetNetworkName(); + std::string GetServerName(); - /** Returns the server description string of the local server - */ - virtual std::string GetServerDescription(); + bool AddMode(ModeHandler* mh, const unsigned char modechar); - /** Returns the information of the server as returned by the /ADMIN command. - * See the Admin class for further information of the return value. The members - * Admin::Nick, Admin::Email and Admin::Name contain the information for the - * server where the module is loaded. - */ - virtual Admin GetAdmin(); + bool AddModeWatcher(ModeWatcher* mw); - virtual bool AddMode(ModeHandler* mh, const unsigned char modechar); + bool DelModeWatcher(ModeWatcher* mw); - virtual bool AddModeWatcher(ModeWatcher* mw); - - virtual bool DelModeWatcher(ModeWatcher* mw); - - virtual bool AddResolver(Resolver* r); + bool AddResolver(Resolver* r); /** Adds a command to the command table. * This allows modules to add extra commands into the command table. You must place a function within your @@ -1461,7 +1354,7 @@ class Server : public Extensible * extension) e.g. "m_blarp.so". If you place the wrong identifier here, you can cause crashes if your module * is unloaded. */ - virtual void AddCommand(command_t *f); + void AddCommand(command_t *f); /** Sends a servermode. * you must format the parameters array with the target, modes and parameters for those modes. @@ -1483,35 +1376,13 @@ class Server : public Extensible * You must be sure to get the number of parameters correct in the pcnt parameter otherwise you could leave * your server in an unstable state! */ + void SendMode(const char **parameters, int pcnt, userrec *user); - virtual void SendMode(const char **parameters, int pcnt, userrec *user); - - /** Sends to all users matching a mode mask - * You must specify one or more usermodes as the first parameter. These can be RFC specified modes such as +i, - * or module provided modes, including ones provided by your own module. - * In the second parameter you must place a flag value which indicates wether the modes you have given will be - * logically ANDed or OR'ed. You may use one of either WM_AND or WM_OR. - * for example, if you were to use: - * - * Serv->SendToModeMask("xi", WM_OR, "m00"); - * - * Then the text 'm00' will be sent to all users with EITHER mode x or i. Conversely if you used WM_AND, the - * user must have both modes set to receive the message. - */ - virtual void SendToModeMask(const std::string &modes, int flags, const std::string &text); - - /** Forces a user nickchange. - * This command works similarly to SVSNICK, and can be used to implement Q-lines etc. - * If you specify an invalid nickname, the nick change will be dropped and the target user will receive - * the error numeric for it. - */ - virtual void ChangeUserNick(userrec* user, const std::string &nickname); - /** Matches text against a glob pattern. * Uses the ircd's internal matching function to match string against a globbing pattern, e.g. *!*@*.com * Returns true if the literal successfully matches the pattern, false if otherwise. */ - virtual bool MatchText(const std::string &sliteral, const std::string &spattern); + bool MatchText(const std::string &sliteral, const std::string &spattern); /** Calls the handler for a command, either implemented by the core or by another module. * You can use this function to trigger other commands in the ircd, such as PRIVMSG, JOIN, @@ -1525,57 +1396,22 @@ class Server : public Extensible * used for privilage checks, etc. * @return True if the command exists */ - virtual bool CallCommandHandler(const std::string &commandname, const char** parameters, int pcnt, userrec* user); + bool CallCommandHandler(const std::string &commandname, const char** parameters, int pcnt, userrec* user); /** This function returns true if the commandname exists, pcnt is equal to or greater than the number * of paramters the command requires, the user specified is allowed to execute the command, AND * if the command is implemented by a module (not the core). This has a few specific uses, usually * within network protocols (see src/modules/m_spanningtree.cpp) */ - virtual bool IsValidModuleCommand(const std::string &commandname, int pcnt, userrec* user); - - /** Change displayed hostname of a user. - * You should always call this method to change a user's host rather than writing directly to the - * dhost member of userrec, as any change applied via this method will be propogated to any - * linked servers. - */ - virtual void ChangeHost(userrec* user, const std::string &host); - - /** Change GECOS (fullname) of a user. - * You should always call this method to change a user's GECOS rather than writing directly to the - * fullname member of userrec, as any change applied via this method will be propogated to any - * linked servers. - */ - virtual void ChangeGECOS(userrec* user, const std::string &gecos); + bool IsValidModuleCommand(const std::string &commandname, int pcnt, userrec* user); /** Returns true if the servername you give is ulined. * ULined servers have extra privilages. They are allowed to change nicknames on remote servers, * change modes of clients which are on remote servers and set modes of channels where there are * no channel operators for that channel on the ulined server, amongst other things. */ - virtual bool IsUlined(const std::string &server); + bool IsUlined(const std::string &server); - /** Fetches the userlist of a channel. This function must be here and not a member of userrec or - * chanrec due to include constraints. - */ - virtual chanuserlist GetUsers(chanrec* chan); - - /** Remove a user's connection to the irc server, but leave their client in existence in the - * user hash. When you call this function, the user's file descriptor will be replaced with the - * value of FD_MAGIC_NUMBER and their old file descriptor will be closed. This idle client will - * remain until it is restored with a valid file descriptor, or is removed from IRC by an operator - * After this call, the pointer to user will be invalid. - */ - virtual bool UserToPseudo(userrec* user, const std::string &message); - - /** This user takes one user, and switches their file descriptor with another user, so that one user - * "becomes" the other. The user in 'alive' is booted off the server with the given message. The user - * referred to by 'zombie' should have previously been locked with Server::UserToPseudo, otherwise - * stale sockets and file descriptor leaks can occur. After this call, the pointer to alive will be - * invalid, and the pointer to zombie will be equivalent in effect to the old pointer to alive. - */ - virtual bool PseudoToUser(userrec* alive, userrec* zombie, const std::string &message); - /** Adds a G-line * The G-line is propogated to all of the servers in the mesh and enforced as soon as it is added. * The duration must be in seconds, however you can use the Server::CalcDuration method to convert @@ -1583,7 +1419,7 @@ class Server : public Extensible * to indicate who or what sent the data, usually this is the nickname of a person, or a server * name. */ - virtual void AddGLine(long duration, const std::string &source, const std::string &reason, const std::string &hostmask); + void AddGLine(long duration, const std::string &source, const std::string &reason, const std::string &hostmask); /** Adds a Q-line * The Q-line is propogated to all of the servers in the mesh and enforced as soon as it is added. @@ -1592,7 +1428,7 @@ class Server : public Extensible * to indicate who or what sent the data, usually this is the nickname of a person, or a server * name. */ - virtual void AddQLine(long duration, const std::string &source, const std::string &reason, const std::string &nickname); + void AddQLine(long duration, const std::string &source, const std::string &reason, const std::string &nickname); /** Adds a Z-line * The Z-line is propogated to all of the servers in the mesh and enforced as soon as it is added. @@ -1601,7 +1437,7 @@ class Server : public Extensible * to indicate who or what sent the data, usually this is the nickname of a person, or a server * name. */ - virtual void AddZLine(long duration, const std::string &source, const std::string &reason, const std::string &ipaddr); + void AddZLine(long duration, const std::string &source, const std::string &reason, const std::string &ipaddr); /** Adds a K-line * The K-line is enforced as soon as it is added. @@ -1610,7 +1446,7 @@ class Server : public Extensible * to indicate who or what sent the data, usually this is the nickname of a person, or a server * name. */ - virtual void AddKLine(long duration, const std::string &source, const std::string &reason, const std::string &hostmask); + void AddKLine(long duration, const std::string &source, const std::string &reason, const std::string &hostmask); /** Adds a E-line * The E-line is enforced as soon as it is added. @@ -1619,73 +1455,73 @@ class Server : public Extensible * to indicate who or what sent the data, usually this is the nickname of a person, or a server * name. */ - virtual void AddELine(long duration, const std::string &source, const std::string &reason, const std::string &hostmask); + void AddELine(long duration, const std::string &source, const std::string &reason, const std::string &hostmask); /** Deletes a G-Line from all servers */ - virtual bool DelGLine(const std::string &hostmask); + bool DelGLine(const std::string &hostmask); /** Deletes a Q-Line from all servers */ - virtual bool DelQLine(const std::string &nickname); + bool DelQLine(const std::string &nickname); /** Deletes a Z-Line from all servers */ - virtual bool DelZLine(const std::string &ipaddr); + bool DelZLine(const std::string &ipaddr); /** Deletes a local K-Line */ - virtual bool DelKLine(const std::string &hostmask); + bool DelKLine(const std::string &hostmask); /** Deletes a local E-Line */ - virtual bool DelELine(const std::string &hostmask); + bool DelELine(const std::string &hostmask); /** Calculates a duration * This method will take a string containing a formatted duration (e.g. "1w2d") and return its value * as a total number of seconds. This is the same function used internally by /GLINE etc to set * the ban times. */ - virtual long CalcDuration(const std::string &duration); + long CalcDuration(const std::string &duration); /** Returns true if a nick!ident@host string is correctly formatted, false if otherwise. */ - virtual bool IsValidMask(const std::string &mask); + bool IsValidMask(const std::string &mask); /** This function finds a module by name. * You must provide the filename of the module. If the module cannot be found (is not loaded) * the function will return NULL. */ - virtual Module* FindModule(const std::string &name); + Module* FindModule(const std::string &name); /** Adds a class derived from InspSocket to the server's socket engine. */ - virtual void AddSocket(InspSocket* sock); + void AddSocket(InspSocket* sock); /** Forcibly removes a class derived from InspSocket from the servers socket engine. */ - virtual void RemoveSocket(InspSocket* sock); + void RemoveSocket(InspSocket* sock); /** Deletes a class derived from InspSocket from the server's socket engine. */ - virtual void DelSocket(InspSocket* sock); + void DelSocket(InspSocket* sock); /** Causes the local server to rehash immediately. * WARNING: Do not call this method from within your rehash method, for * obvious reasons! */ - virtual void RehashServer(); + void RehashServer(); /** This method returns the total number of channels on the network. */ - virtual long GetChannelCount(); + long GetChannelCount(); /** This method returns a channel whos index is greater than or equal to 0 and less than the number returned by Server::GetChannelCount(). * This is slower (by factors of dozens) than requesting a channel by name with Server::FindChannel(), however there are times when * you wish to safely iterate the channel list, saving your position, with large amounts of time in between, which is what this function * is useful for. */ - virtual chanrec* GetChannelIndex(long index); + chanrec* GetChannelIndex(long index); /** Dumps text (in a stringstream) to a user. The stringstream should not contain linefeeds, as it will be split * automatically by the function into safe amounts. The line prefix given is prepended onto each line (e.g. a servername