- /** Called whenever a user sets away.
- * This method has no parameter for the away message, as it is available in the
- * user record as userrec::awaymsg.
- */
- virtual void OnSetAway(userrec* user);
-
- /** Called when a user cancels their away state.
- */
- virtual void OnCancelAway(userrec* user);
-};
-
-
-/** Allows server output and query functions
- * This class contains methods which allow a module to query the state of the irc server, and produce
- * output to users and other servers. All modules should instantiate at least one copy of this class,
- * and use its member functions to perform their tasks.
- */
-class Server : public Extensible
-{
- public:
- /** 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.
- */
- userrec* FindDescriptor(int socket);
-
- bool AddMode(ModeHandler* mh, const unsigned char modechar);
-
- bool AddModeWatcher(ModeWatcher* mw);
-
- bool DelModeWatcher(ModeWatcher* mw);
-
- 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
- * module which is is of type handlerfunc:
- *
- * typedef void (handlerfunc) (char**, int, userrec*);
- * ...
- * void handle_kill(char **parameters, int pcnt, userrec *user)
- *
- * When the command is typed, the parameters will be placed into the parameters array (similar to argv) and
- * the parameter count will be placed into pcnt (similar to argv). There will never be any less parameters
- * than the 'minparams' value you specified when creating the command. The *user parameter is the class of
- * the user which caused the command to trigger, who will always have the flag you specified in 'flags' when
- * creating the initial command. For example to create an oper only command create the commands with flags='o'.
- * The source parameter is used for resource tracking, and should contain the name of your module (with file
- * extension) e.g. "m_blarp.so". If you place the wrong identifier here, you can cause crashes if your module
- * is unloaded.
- */
- void AddCommand(command_t *f);
-
- /** Sends a servermode.
- * you must format the parameters array with the target, modes and parameters for those modes.
- *
- * For example:
- *
- * char *modes[3];
- *
- * modes[0] = ChannelName;
- *
- * modes[1] = "+o";
- *
- * modes[2] = user->nick;
- *
- * Srv->SendMode(modes,3,user);
- *
- * The modes will originate from the server where the command was issued, however responses (e.g. numerics)
- * will be sent to the user you provide as the third parameter.
- * 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);
-
- /** 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.
- */
- 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,
- * KICK etc, or even as a method of callback. By defining command names that are untypeable
- * for users on irc (e.g. those which contain a \r or \n) you may use them as callback identifiers.
- * The first parameter to this method is the name of the command handler you wish to call, e.g.
- * PRIVMSG. This will be a command handler previously registered by the core or wih AddCommand().
- * The second parameter is an array of parameters, and the third parameter is a count of parameters
- * in the array. If you do not pass enough parameters to meet the minimum needed by the handler, the
- * functiom will silently ignore it. The final parameter is the user executing the command handler,
- * used for privilage checks, etc.
- * @return True if the command exists
- */
- 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)
- */
- 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.
- */
- bool IsUlined(const std::string &server);
-
- /** 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
- * durations into the 1w2d3h3m6s format used by /GLINE etc. The source is an arbitary string used
- * to indicate who or what sent the data, usually this is the nickname of a person, or a server
- * name.
- */
- 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.
- * The duration must be in seconds, however you can use the Server::CalcDuration method to convert
- * durations into the 1w2d3h3m6s format used by /GLINE etc. The source is an arbitary string used
- * to indicate who or what sent the data, usually this is the nickname of a person, or a server
- * name.
- */
- 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.
- * The duration must be in seconds, however you can use the Server::CalcDuration method to convert
- * durations into the 1w2d3h3m6s format used by /GLINE etc. The source is an arbitary string used
- * to indicate who or what sent the data, usually this is the nickname of a person, or a server
- * name.
- */
- 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.
- * The duration must be in seconds, however you can use the Server::CalcDuration method to convert
- * durations into the 1w2d3h3m6s format used by /GLINE etc. The source is an arbitary string used
- * to indicate who or what sent the data, usually this is the nickname of a person, or a server
- * name.
- */
- 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.
- * The duration must be in seconds, however you can use the Server::CalcDuration method to convert
- * durations into the 1w2d3h3m6s format used by /GLINE etc. The source is an arbitary string used
- * to indicate who or what sent the data, usually this is the nickname of a person, or a server
- * name.
- */
- void AddELine(long duration, const std::string &source, const std::string &reason, const std::string &hostmask);
-
- /** Deletes a G-Line from all servers
- */
- bool DelGLine(const std::string &hostmask);
-
- /** Deletes a Q-Line from all servers
- */
- bool DelQLine(const std::string &nickname);
-
- /** Deletes a Z-Line from all servers
- */
- bool DelZLine(const std::string &ipaddr);
-
- /** Deletes a local K-Line
- */
- bool DelKLine(const std::string &hostmask);
-
- /** Deletes a local E-Line
- */
- 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.
- */
- long CalcDuration(const std::string &duration);
-
- /** Returns true if a nick!ident@host string is correctly formatted, false if otherwise.
- */
- 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.
- */
- Module* FindModule(const std::string &name);
-
- /** Adds a class derived from InspSocket to the server's socket engine.
- */
- void AddSocket(InspSocket* sock);
-
- /** Forcibly removes a class derived from InspSocket from the servers socket engine.
- */
- void RemoveSocket(InspSocket* sock);
-
- /** Deletes a class derived from InspSocket from the server's socket engine.
- */
- 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!
- */
- void RehashServer();
-
- /** This method returns the total number of channels on the network.
- */
- 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.
- */
- 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
- * and a numeric).
- */
- void DumpText(userrec* User, const std::string &LinePrefix, stringstream &TextStream);
+ /** 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 int OnSetAway(User* user, const std::string &awaymsg);
+
+ /** Called whenever a NAMES list is requested.
+ * You can produce the nameslist yourself, overriding the current list,
+ * and if you do you must return 1. If you do not handle the names list,
+ * return 0.
+ * @param The user requesting the NAMES list
+ * @param Ptr The channel the NAMES list is requested for
+ * @param userlist The user list for the channel (you may change this pointer.
+ * If you want to change the values, take a copy first, and change the copy, then
+ * point the pointer at your copy)
+ * @return 1 to prevent the user list being sent to the client, 0 to allow it.
+ * Returning -1 allows the names list, but bypasses any checks which check for
+ * channel membership before sending the names list.
+ */
+ virtual int OnUserList(User* user, Channel* Ptr, CUList* &userlist);
+
+ /** Called whenever a line of WHOIS output is sent to a user.
+ * You may change the numeric and the text of the output by changing
+ * the values numeric and text, but you cannot change the user the
+ * numeric is sent to. You may however change the user's User values.
+ * @param user The user the numeric is being sent to
+ * @param dest The user being WHOISed
+ * @param numeric The numeric of the line being sent
+ * @param text The text of the numeric, including any parameters
+ * @return nonzero to drop the line completely so that the user does not
+ * receive it, or zero to allow the line to be sent.
+ */
+ virtual int OnWhoisLine(User* user, User* dest, int &numeric, std::string &text);
+
+ /** 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
+ * method is called when it is time to do that.
+ */
+ 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.
+ */
+ virtual void OnRunTestSuite();
+
+ /** 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. If the nick is set to an empty string by any
+ * module, then this will cause the nickname not to be displayed at all.
+ */
+ virtual void OnNamesListItem(User* issuer, User* user, Channel* channel, std::string &prefixes, std::string &nick);
+
+ virtual int OnNumeric(User* user, unsigned int numeric, const std::string &text);