+ * You may alter the message text as you wish before relinquishing control to the next module
+ * in the chain, and if no other modules block the text this altered form of the text will be sent out
+ * to the user and possibly to other servers.
+ * @param user The user sending the message
+ * @param dest The target of the message (chanrec* or userrec*)
+ * @param target_type The type of target (TYPE_USER or TYPE_CHANNEL)
+ * @param text Changeable text being sent by the user
+ * @param status The status being used, e.g. PRIVMSG @#chan has status== '@', 0 to send to everyone.
+ * @return 1 to deny the NOTICE, 0 to allow it
+ */
+ virtual int OnUserPreNotice(userrec* user,void* dest,int target_type, std::string &text,char status);
+
+ /** 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
+ * NOT make any changes to the userrec if the user is a remote user as this may cause a desnyc.
+ * check user->server before taking any action (including returning nonzero from the method).
+ * If your method returns nonzero, the nickchange is silently forbidden, and it is down to your
+ * module to generate some meaninful output.
+ * @param user The username changing their nick
+ * @param newnick Their new nickname
+ * @return 1 to deny the change, 0 to allow
+ */
+ virtual int OnUserPreNick(userrec* user, std::string newnick);
+
+ /** Called after any PRIVMSG sent from a user.
+ * The dest variable contains a userrec* if target_type is TYPE_USER and a chanrec*
+ * if target_type is TYPE_CHANNEL.
+ * @param user The user sending the message
+ * @param dest The target of the message
+ * @param target_type The type of target (TYPE_USER or TYPE_CHANNEL)
+ * @param text the text being sent by the user
+ * @param status The status being used, e.g. PRIVMSG @#chan has status== '@', 0 to send to everyone.
+ */
+ virtual void OnUserMessage(userrec* user, void* dest, int target_type, std::string text, char status);
+
+ /** Called after any NOTICE sent from a user.
+ * The dest variable contains a userrec* if target_type is TYPE_USER and a chanrec*
+ * if target_type is TYPE_CHANNEL.
+ * @param user The user sending the message
+ * @param dest The target of the message
+ * @param target_type The type of target (TYPE_USER or TYPE_CHANNEL)
+ * @param text the text being sent by the user
+ * @param status The status being used, e.g. NOTICE @#chan has status== '@', 0 to send to everyone.
+ */
+ virtual void OnUserNotice(userrec* user, void* dest, int target_type, std::string text, char status);
+
+ /** Called after every MODE command sent from a user
+ * The dest variable contains a userrec* if target_type is TYPE_USER and a chanrec*
+ * if target_type is TYPE_CHANNEL. The text variable contains the remainder of the
+ * mode string after the target, e.g. "+wsi" or "+ooo nick1 nick2 nick3".
+ * @param user The user sending the MODEs
+ * @param dest The target of the modes (userrec* or chanrec*)
+ * @param target_type The type of target (TYPE_USER or TYPE_CHANNEL)
+ * @param text The actual modes and their parameters if any
+ */
+ virtual void OnMode(userrec* user, void* dest, int target_type, std::string text);
+
+ /** Allows modules to alter or create server descriptions
+ * Whenever a module requires a server description, for example for display in
+ * WHOIS, this function is called in all modules. You may change or define the
+ * description given in std::string &description. If you do, this description
+ * will be shown in the WHOIS fields.
+ * @param servername The servername being searched for
+ * @param description Alterable server description for this server
+ */
+ virtual void OnGetServerDescription(std::string servername,std::string &description);
+
+ /** Allows modules to synchronize data which relates to users during a netburst.
+ * When this function is called, it will be called from the module which implements
+ * the linking protocol. This currently is m_spanningtree.so. A pointer to this module
+ * is given in Module* proto, so that you may call its methods such as ProtoSendMode
+ * (see below). This function will be called for every user visible on your side
+ * of the burst, allowing you to for example set modes, etc. Do not use this call to
+ * synchronize data which you have stored using class Extensible -- There is a specialist
+ * function OnSyncUserMetaData and OnSyncChannelMetaData for this!
+ * @param user The user being syncronized
+ * @param proto A pointer to the module handling network protocol
+ * @param opaque An opaque pointer set by the protocol module, should not be modified!
+ */
+ virtual void OnSyncUser(userrec* user, Module* proto, void* opaque);
+
+ /** Allows modules to synchronize data which relates to channels during a netburst.
+ * When this function is called, it will be called from the module which implements
+ * the linking protocol. This currently is m_spanningtree.so. A pointer to this module
+ * is given in Module* proto, so that you may call its methods such as ProtoSendMode
+ * (see below). This function will be called for every user visible on your side
+ * of the burst, allowing you to for example set modes, etc. Do not use this call to
+ * synchronize data which you have stored using class Extensible -- There is a specialist
+ * function OnSyncUserMetaData and OnSyncChannelMetaData for this!
+ *
+ * For a good example of how to use this function, please see src/modules/m_chanprotect.cpp
+ *
+ * @param chan The channel being syncronized
+ * @param proto A pointer to the module handling network protocol
+ * @param opaque An opaque pointer set by the protocol module, should not be modified!
+ */
+ virtual void OnSyncChannel(chanrec* chan, Module* proto, void* opaque);
+
+ /* Allows modules to syncronize metadata related to channels over the network during a netburst.
+ * Whenever the linking module wants to send out data, but doesnt know what the data
+ * represents (e.g. it is Extensible metadata, added to a userrec or chanrec by a module) then
+ * this method is called.You should use the ProtoSendMetaData function after you've
+ * correctly decided how the data should be represented, to send the metadata on its way if it belongs
+ * to your module. For a good example of how to use this method, see src/modules/m_swhois.cpp.
+ * @param chan The channel whos metadata is being syncronized
+ * @param proto A pointer to the module handling network protocol
+ * @param opaque An opaque pointer set by the protocol module, should not be modified!
+ * @param extname The extensions name which is being searched for
+ */
+ virtual void OnSyncChannelMetaData(chanrec* chan, Module* proto,void* opaque, std::string extname);
+
+ /* Allows modules to syncronize metadata related to users over the network during a netburst.
+ * Whenever the linking module wants to send out data, but doesnt know what the data
+ * represents (e.g. it is Extensible metadata, added to a userrec or chanrec by a module) then
+ * this method is called. You should use the ProtoSendMetaData function after you've
+ * correctly decided how the data should be represented, to send the metadata on its way if
+ * if it belongs to your module.
+ * @param user The user whos metadata is being syncronized
+ * @param proto A pointer to the module handling network protocol
+ * @param opaque An opaque pointer set by the protocol module, should not be modified!
+ * @param extname The extensions name which is being searched for
+ */
+ virtual void OnSyncUserMetaData(userrec* user, Module* proto,void* opaque, std::string extname);
+
+ /* Allows modules to syncronize metadata not related to users or channels, over the network during a netburst.
+ * Whenever the linking module wants to send out data, but doesnt know what the data
+ * represents (e.g. it is Extensible metadata, added to a userrec or chanrec by a module) then
+ * this method is called. You should use the ProtoSendMetaData function after you've
+ * correctly decided how the data should be represented, to send the metadata on its way if
+ * if it belongs to your module.
+ * @param proto A pointer to the module handling network protocol
+ * @param opaque An opaque pointer set by the protocol module, should not be modified!
+ */
+ virtual void OnSyncOtherMetaData(Module* proto, void* opaque);
+
+ /** 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.
+ * @param target_type The type of item to decode data for, TYPE_USER or TYPE_CHANNEL
+ * @param target The chanrec* or userrec* that data should be added to
+ * @param extname The extension name which is being sent
+ * @param extdata The extension data, encoded at the other end by an identical module through OnSyncChannelMetaData or OnSyncUserMetaData
+ */
+ virtual void OnDecodeMetaData(int target_type, void* target, std::string extname, std::string extdata);
+
+ /** Implemented by modules which provide the ability to link servers.
+ * These modules will implement this method, which allows transparent sending of servermodes
+ * down the network link as a broadcast, without a module calling it having to know the format
+ * of the MODE command before the actual mode string.
+ *
+ * More documentation to follow soon. Please see src/modules/m_chanprotect.cpp for examples
+ * of how to use this function.
+ *
+ * @param opaque An opaque pointer set by the protocol module, should not be modified!
+ * @param target_type The type of item to decode data for, TYPE_USER or TYPE_CHANNEL
+ * @param target The chanrec* or userrec* that modes should be sent for
+ * @param modeline The modes and parameters to be sent
+ */
+ virtual void ProtoSendMode(void* opaque, int target_type, void* target, std::string modeline);
+
+ /** Implemented by modules which provide the ability to link servers.
+ * These modules will implement this method, which allows metadata (extra data added to
+ * user and channel records using class Extensible, Extensible::Extend, etc) to be sent
+ * to other servers on a netburst and decoded at the other end by the same module on a
+ * different server.
+ *
+ * More documentation to follow soon. Please see src/modules/m_swhois.cpp for example of
+ * how to use this function.
+ * @param opaque An opaque pointer set by the protocol module, should not be modified!
+ * @param target_type The type of item to decode data for, TYPE_USER or TYPE_CHANNEL
+ * @param target The chanrec* or userrec* that metadata should be sent for
+ * @param extname The extension name to send metadata for
+ * @param extdata Encoded data for this extension name, which will be encoded at the oppsite end by an identical module using OnDecodeMetaData
+ */
+ virtual void ProtoSendMetaData(void* opaque, int target_type, void* target, std::string extname, std::string extdata);
+
+ /** Called after every WALLOPS command.
+ * @param user The user sending the WALLOPS
+ * @param text The content of the WALLOPS message
+ */
+ virtual void OnWallops(userrec* user, std::string text);
+
+ /** Called whenever a user's 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 OnChangeHost(userrec* user, std::string newhost);
+
+ /** Called whenever a user's GECOS (realname) 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
+ */
+ virtual void OnChangeName(userrec* user, std::string gecos);
+
+ /** Called whenever a gline is added by a local user.
+ * This method is triggered after the line is added.
+ * @param duration The duration of the line in seconds
+ * @param source The sender of the line
+ * @param reason The reason text to be displayed
+ * @param hostmask The hostmask to add
+ */
+ virtual void OnAddGLine(long duration, userrec* source, std::string reason, std::string hostmask);
+
+ /** Called whenever a zline is added by a local user.
+ * This method is triggered after the line is added.
+ * @param duration The duration of the line in seconds
+ * @param source The sender of the line
+ * @param reason The reason text to be displayed
+ * @param ipmask The hostmask to add
+ */
+ virtual void OnAddZLine(long duration, userrec* source, std::string reason, std::string ipmask);
+
+ /** Called whenever a kline is added by a local user.
+ * This method is triggered after the line is added.
+ * @param duration The duration of the line in seconds
+ * @param source The sender of the line
+ * @param reason The reason text to be displayed
+ * @param hostmask The hostmask to add
+ */
+ virtual void OnAddKLine(long duration, userrec* source, std::string reason, std::string hostmask);
+
+ /** Called whenever a qline is added by a local user.
+ * This method is triggered after the line is added.
+ * @param duration The duration of the line in seconds
+ * @param source The sender of the line
+ * @param reason The reason text to be displayed
+ * @param nickmask The hostmask to add
+ */
+ virtual void OnAddQLine(long duration, userrec* source, std::string reason, std::string nickmask);
+
+ /** Called whenever a eline is added by a local user.
+ * This method is triggered after the line is added.
+ * @param duration The duration of the line in seconds
+ * @param source The sender of the line
+ * @param reason The reason text to be displayed
+ * @param hostmask The hostmask to add
+ */
+ virtual void OnAddELine(long duration, userrec* source, std::string reason, std::string hostmask);
+
+ /** Called whenever a gline is deleted.
+ * This method is triggered after the line is deleted.
+ * @param source The user removing the line
+ * @param hostmask The hostmask to delete
+ */
+ virtual void OnDelGLine(userrec* source, std::string hostmask);
+
+ /** Called whenever a zline is deleted.
+ * This method is triggered after the line is deleted.
+ * @param source The user removing the line
+ * @param hostmask The hostmask to delete
+ */
+ virtual void OnDelZLine(userrec* source, std::string ipmask);
+
+ /** Called whenever a kline is deleted.
+ * This method is triggered after the line is deleted.
+ * @param source The user removing the line
+ * @param hostmask The hostmask to delete
+ */
+ virtual void OnDelKLine(userrec* source, std::string hostmask);
+
+ /** Called whenever a qline is deleted.
+ * This method is triggered after the line is deleted.
+ * @param source The user removing the line
+ * @param hostmask The hostmask to delete
+ */
+ virtual void OnDelQLine(userrec* source, std::string nickmask);
+
+ /** Called whenever a eline is deleted.
+ * This method is triggered after the line is deleted.
+ * @param source The user removing the line
+ * @param hostmask The hostmask to delete
+ */
+ virtual void OnDelELine(userrec* source, std::string hostmask);
+
+ /** Called before your module is unloaded to clean up Extensibles.
+ * This method is called once for every user and channel on the network,
+ * so that when your module unloads it may clear up any remaining data
+ * in the form of Extensibles added using Extensible::Extend().
+ * If the target_type variable is TYPE_USER, then void* item refers to
+ * a userrec*, otherwise it refers to a chanrec*.
+ * @param target_type The type of item being cleaned
+ * @param item A pointer to the item's class
+ */
+ virtual void OnCleanup(int target_type, void* item);
+
+ /** Called after any nickchange, local or remote. This can be used to track users after nickchanges
+ * have been applied. Please note that although you can see remote nickchanges through this function, you should
+ * NOT make any changes to the userrec if the user is a remote user as this may cause a desnyc.
+ * check user->server before taking any action (including returning nonzero from the method).
+ * Because this method is called after the nickchange is taken place, no return values are possible
+ * to indicate forbidding of the nick change. Use OnUserPreNick for this.
+ * @param user The user changing their nick
+ * @param oldnick The old nickname of the user before the nickchange
+ */
+ virtual void OnUserPostNick(userrec* user, std::string oldnick);
+
+ /** Called before an action which requires a channel privilage check.
+ * This function is called before many functions which check a users status on a channel, for example
+ * before opping a user, deopping a user, kicking a user, etc.
+ * There are several values for access_type which indicate for what reason access is being checked.
+ * These are:<br><br>
+ * AC_KICK (0) - A user is being kicked<br>
+ * AC_DEOP (1) - a user is being deopped<br>
+ * AC_OP (2) - a user is being opped<br>
+ * AC_VOICE (3) - a user is being voiced<br>
+ * AC_DEVOICE (4) - a user is being devoiced<br>
+ * AC_HALFOP (5) - a user is being halfopped<br>
+ * AC_DEHALFOP (6) - a user is being dehalfopped<br>
+ * AC_INVITE (7) - a user is being invited<br>
+ * AC_GENERAL_MODE (8) - a user channel mode is being changed<br><br>
+ * Upon returning from your function you must return either ACR_DEFAULT, to indicate the module wishes
+ * to do nothing, or ACR_DENY where approprate to deny the action, and ACR_ALLOW where appropriate to allow
+ * the action. Please note that in the case of some access checks (such as AC_GENERAL_MODE) access may be
+ * denied 'upstream' causing other checks such as AC_DEOP to not be reached. Be very careful with use of the
+ * AC_GENERAL_MODE type, as it may inadvertently override the behaviour of other modules. When the access_type
+ * is AC_GENERAL_MODE, the destination of the mode will be NULL (as it has not yet been determined).
+ * @param source The source of the access check
+ * @param dest The destination of the access check
+ * @param channel The channel which is being checked
+ * @param access_type See above
+ */
+ virtual int OnAccessCheck(userrec* source,userrec* dest,chanrec* channel,int access_type);
+
+ /** Called when a 005 numeric is about to be output.
+ * The module should modify the 005 numeric if needed to indicate its features.
+ * @param output The 005 string to be modified if neccessary.
+ */
+ virtual void On005Numeric(std::string &output);
+
+ /** Called when a client is disconnected by KILL.
+ * If a client is killed by a server, e.g. a nickname collision or protocol error,
+ * source is NULL.
+ * Return 1 from this function to prevent the kill, and 0 from this function to allow
+ * it as normal. If you prevent the kill no output will be sent to the client, it is
+ * down to your module to generate this information.
+ * NOTE: It is NOT advisable to stop kills which originate from servers or remote users.
+ * If you do so youre risking race conditions, desyncs and worse!
+ * @param source The user sending the KILL
+ * @param dest The user being killed
+ * @param reason The kill reason
+ * @return 1 to prevent the kill, 0 to allow
+ */
+ virtual int OnKill(userrec* source, userrec* dest, std::string reason);
+
+ /** Called when an oper wants to disconnect a remote user via KILL
+ * @param source The user sending the KILL
+ * @param dest The user being killed
+ * @param reason The kill reason