* ipv4 servers, so this value will be ten times as
* high on ipv6 servers.
*/
-#define NATIVE_API_VERSION 11011
+#define NATIVE_API_VERSION 11024
#ifdef IPV6
#define API_VERSION (NATIVE_API_VERSION * 10)
#else
#define FD_MAGIC_NUMBER -42
// useful macros
-
+#ifdef WINDOWS
+#define IS_LOCAL(x) ((x->GetFd() > -1))
+#else
#define IS_LOCAL(x) ((x->GetFd() > -1) && (x->GetFd() <= MAX_DESCRIPTORS))
+#endif
#define IS_REMOTE(x) (x->GetFd() < 0)
#define IS_MODULE_CREATED(x) (x->GetFd() == FD_MAGIC_NUMBER)
+#define IS_OPER(x) (*x->oper)
+#define IS_AWAY(x) (*x->awaymsg)
/** 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.
*/
-class Version : public classbase
+class CoreExport Version : public classbase
{
public:
const int Major, Minor, Revision, Build, Flags, API;
* This class is used to represent a basic data structure which is passed
* between modules for safe inter-module communications.
*/
-class ModuleMessage : public Extensible
+class CoreExport ModuleMessage : public Extensible
{
public:
virtual ~ModuleMessage() {};
* using the Send() method, which will call the given module's OnRequest
* method with this class as its parameter.
*/
-class Request : public ModuleMessage
+class CoreExport Request : public ModuleMessage
{
protected:
/** This member holds a pointer to arbitary data set by the emitter of the message
* using the Send() method, which will trigger the OnEvent method in
* all modules passing the object as its parameter.
*/
-class Event : public ModuleMessage
+class CoreExport Event : public ModuleMessage
{
protected:
/** This member holds a pointer to arbitary data set by the emitter of the message
* be loaded. If this happens, the error message returned by ModuleException::GetReason will be displayed to the user
* attempting to load the module, or dumped to the console if the ircd is currently loading for the first time.
*/
-class CoreException : public std::exception
+class CoreExport CoreException : public std::exception
{
protected:
/** Holds the error message to be displayed
}
};
-class ModuleException : public CoreException
+class CoreExport ModuleException : public CoreException
{
public:
/** Default constructor, just uses the error mesage 'Module threw an exception'.
I_OnPostLocalTopicChange, I_OnEvent, I_OnRequest, I_OnOperCompre, I_OnGlobalOper, I_OnPostConnect, I_OnAddBan, I_OnDelBan,
I_OnRawSocketAccept, I_OnRawSocketClose, I_OnRawSocketWrite, I_OnRawSocketRead, I_OnChangeLocalUserGECOS, I_OnUserRegister,
I_OnOperCompare, I_OnChannelDelete, I_OnPostOper, I_OnSyncOtherMetaData, I_OnSetAway, I_OnCancelAway, I_OnUserList,
- I_OnPostCommand, I_OnPostJoin, I_OnWhoisLine, I_OnBuildExemptList, I_OnRawSocketConnect, I_OnGarbageCollect };
+ I_OnPostCommand, I_OnPostJoin, I_OnWhoisLine, I_OnBuildExemptList, I_OnRawSocketConnect, I_OnGarbageCollect, I_OnBufferFlushed };
/** Base class for all InspIRCd modules
* This class is the base class for InspIRCd modules. All modules must inherit from this class,
* its methods will be called when irc server events occur. class inherited from module must be
* instantiated by the ModuleFactory class (see relevent section) for the module to be initialised.
*/
-class Module : public Extensible
+class CoreExport Module : public Extensible
{
protected:
InspIRCd* ServerInstance;
* This event is only called when the user is fully registered when they quit. To catch
* raw disconnections, use the OnUserDisconnect method.
* @param user The user who is quitting
- * @param message The user's quit message
+ * @param message The user's quit message (as seen by non-opers)
+ * @param oper_message The user's quit message (as seen by opers)
*/
- virtual void OnUserQuit(userrec* user, const std::string &message);
+ virtual void OnUserQuit(userrec* user, const std::string &message, const std::string &oper_message);
/** Called whenever a user's socket is closed.
* The details of the exiting user are available to you in the parameter userrec *user
* and the details of the channel they have joined is available in the variable chanrec *channel
* @param user The user who is joining
* @param channel The channel being joined
+ * @param silent Change this to true if you want to conceal the JOIN command from the other users
+ * of the channel (useful for modules such as auditorium)
*/
- virtual void OnUserJoin(userrec* user, chanrec* channel);
+ virtual void OnUserJoin(userrec* user, chanrec* channel, bool &silent);
/** Called after a user joins a channel
* Identical to OnUserJoin, but called immediately afterwards, when any linking module has
* @param user The user who is parting
* @param channel The channel being parted
* @param partmessage The part message, or an empty string
+ * @param silent Change this to true if you want to conceal the PART command from the other users
+ * of the channel (useful for modules such as auditorium)
*/
- virtual void OnUserPart(userrec* user, chanrec* channel, const std::string &partmessage);
+ virtual void OnUserPart(userrec* user, chanrec* channel, const std::string &partmessage, bool &silent);
/** Called on rehash.
* This method is called prior to a /REHASH or when a SIGHUP is received from the operating
* @param user The user being kicked
* @param chan The channel the user is being kicked from
* @param reason The kick reason
+ * @param silent Change this to true if you want to conceal the PART command from the other users
+ * of the channel (useful for modules such as auditorium)
*/
- virtual void OnUserKick(userrec* source, userrec* user, chanrec* chan, const std::string &reason);
+ virtual void OnUserKick(userrec* source, userrec* user, chanrec* chan, const std::string &reason, bool &silent);
/** Called whenever a user opers locally.
* The userrec will contain the oper mode 'o' as this function is called after any modifications
* @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
+ * @param displayable If this value is true, the data is going to be displayed to a user,
+ * and not sent across the network. Use this to determine wether or not to show sensitive data.
*/
- virtual void OnSyncChannelMetaData(chanrec* chan, Module* proto,void* opaque, const std::string &extname);
+ virtual void OnSyncChannelMetaData(chanrec* chan, Module* proto,void* opaque, const std::string &extname, bool displayable = false);
/* 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
* @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
+ * @param displayable If this value is true, the data is going to be displayed to a user,
+ * and not sent across the network. Use this to determine wether or not to show sensitive data.
*/
- virtual void OnSyncUserMetaData(userrec* user, Module* proto,void* opaque, const std::string &extname);
+ virtual void OnSyncUserMetaData(userrec* user, Module* proto,void* opaque, const std::string &extname, bool displayable = false);
/* 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
* 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!
+ * @param displayable If this value is true, the data is going to be displayed to a user,
+ * and not sent across the network. Use this to determine wether or not to show sensitive data.
*/
- virtual void OnSyncOtherMetaData(Module* proto, void* opaque);
+ virtual void OnSyncOtherMetaData(Module* proto, void* opaque, bool displayable = false);
/** 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.
* and if you do you must return 1. If you do not handle the names list,
* return 0.
*/
- virtual int OnUserList(userrec* user, chanrec* Ptr);
+ virtual int OnUserList(userrec* user, chanrec* 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
* 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(userrec* user);
};
* Constructing the class using one parameter allows you to specify a path to your own configuration
* file, otherwise, inspircd.conf is read.
*/
-class ConfigReader : public classbase
+class CoreExport ConfigReader : public classbase
{
protected:
InspIRCd* ServerInstance;
* Either use the constructor type with one parameter to load a file into memory
* at construction, or use the LoadFile method to load a file.
*/
-class FileReader : public classbase
+class CoreExport FileReader : public classbase
{
InspIRCd* ServerInstance;
/** The file contents
* In most cases, the simple class shown in the example module m_foobar.so will suffice for most
* modules.
*/
-class ModuleFactory : public classbase
+class CoreExport ModuleFactory : public classbase
{
public:
/** The default constructor does nothing.