* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
- * InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ * InspIRCd: (C) 2002-2008 InspIRCd Development Team
* See: http://www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software; see
#ifndef __MODULES_H
#define __MODULES_H
+#include "globals.h"
+#include "dynamic.h"
+#include "base.h"
+#include "ctables.h"
+#include "inspsocket.h"
+#include <string>
+#include <deque>
+#include <sstream>
+#include "timer.h"
+#include "mode.h"
+#include "dns.h"
+
class XLine;
/** Used with OnAccessCheck() method of modules
MSG_NOTICE = 1
};
-#include "globals.h"
-#include "dynamic.h"
-#include "base.h"
-#include "ctables.h"
-#include "inspsocket.h"
-#include <string>
-#include <deque>
-#include <sstream>
-#include "timer.h"
-#include "mode.h"
-#include "dns.h"
-
/** If you change the module API, change this value.
* If you have enabled ipv6, the sizes of structs is
* different, and modules will be incompatible with
* loaded modules in a readable simple way, e.g.:
* 'FOREACH_MOD(I_OnConnect,OnConnect(user));'
*/
-#define FOREACH_MOD(y,x) if (!ServerInstance->Modules->EventHandlers[y].empty()) \
-{ \
- for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ++_i) \
+#define FOREACH_MOD(y,x) do { \
+ EventHandlerIter safei; \
+ for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ) \
{ \
+ safei = _i; \
+ ++safei; \
try \
{ \
(*_i)->x ; \
{ \
ServerInstance->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
} \
+ _i = safei; \
} \
-}
+} while (0);
/**
* This #define allows us to call a method in all
* an instance pointer to the macro. e.g.:
* 'FOREACH_MOD_I(Instance, OnConnect, OnConnect(user));'
*/
-#define FOREACH_MOD_I(z,y,x) if (!z->Modules->EventHandlers[y].empty()) \
-{ \
- for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Modules->EventHandlers[y].end(); ++_i) \
+#define FOREACH_MOD_I(z,y,x) do { \
+ EventHandlerIter safei; \
+ for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Modules->EventHandlers[y].end(); ) \
{ \
+ safei = _i; \
+ ++safei; \
try \
{ \
(*_i)->x ; \
{ \
z->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
} \
+ _i = safei; \
} \
-}
+} while (0);
/**
* 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 (!ServerInstance->Modules->EventHandlers[y].empty()) \
-{ \
+#define FOREACH_RESULT(y,x) \
+do { \
+ EventHandlerIter safei; \
MOD_RESULT = 0; \
- for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ++_i) \
+ for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ) \
{ \
+ safei = _i; \
+ ++safei; \
try \
{ \
int res = (*_i)->x ; \
{ \
ServerInstance->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
} \
+ _i = safei; \
} \
-}
+} while(0);
/**
* The first module to return a nonzero result is the value to be accepted,
* and any modules after are ignored.
*/
-#define FOREACH_RESULT_I(z,y,x) if (!z->Modules->EventHandlers[y].empty()) \
-{ \
+#define FOREACH_RESULT_I(z,y,x) \
+do { \
+ EventHandlerIter safei; \
MOD_RESULT = 0; \
- for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Modules->EventHandlers[y].end(); ++_i) \
+ for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Modules->EventHandlers[y].end(); ) \
{ \
+ safei = _i; \
+ ++safei; \
try \
{ \
int res = (*_i)->x ; \
{ \
z->Log(DEBUG,"Exception caught: %s",modexcept.GetReason()); \
} \
+ _i = safei; \
} \
-}
+} while (0);
/** Represents a non-local user.
* (in fact, any FD less than -1 does)
I_OnUserInvite, I_OnUserPreMessage, I_OnUserPreNotice, I_OnUserPreNick, I_OnUserMessage, I_OnUserNotice, I_OnMode,
I_OnGetServerDescription, I_OnSyncUser, I_OnSyncChannel, I_OnSyncChannelMetaData, I_OnSyncUserMetaData,
I_OnDecodeMetaData, I_ProtoSendMode, I_ProtoSendMetaData, I_OnWallops, I_OnChangeHost, I_OnChangeName, I_OnAddLine,
- I_OnDelLine, I_OnCleanup, I_OnUserPostNick, I_OnAccessCheck, I_On005Numeric, I_OnKill, I_OnRemoteKill, I_OnLoadModule, I_OnUnloadModule,
- I_OnBackgroundTimer, I_OnPreCommand, I_OnCheckReady, I_OnUserRrgister, I_OnCheckInvite,
+ I_OnDelLine, I_OnExpireLine, I_OnCleanup, I_OnUserPostNick, I_OnAccessCheck, 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_OnStats, I_OnChangeLocalUserHost, I_OnChangeLocalUserGecos, I_OnLocalTopicChange,
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_OnOperCompare, I_OnChannelPreDelete, 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_OnBufferFlushed,
- I_OnText,
+ I_OnText, I_OnReadConfig, I_OnDownloadFile,
I_END
};
+class ConfigReader;
+
/** 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
{
}
+ virtual void OnReadConfig(ServerConfig* config, ConfigReader* coreconf);
+
+ virtual int OnDownloadFile(const std::string &filename, std::istream* &filedata);
+
/** Returns the version number of a Module.
* The method should return a Version object with its version information assigned via
* Version::Version
*/
virtual void OnUserDisconnect(User* user);
+ /** Called whenever a channel is about to be deleted
+ * @param chan The channel being deleted
+ * @return An integer specifying whether or not the channel may be deleted. 0 for yes, 1 for no.
+ */
+ virtual int OnChannelPreDelete(Channel *chan);
+
/** Called whenever a channel is deleted, either by QUIT, KICK or PART.
* @param chan The channel being deleted
*/
* @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)
+ * @param sync This is set to true if the JOIN is the result of a network sync and the remote user is being introduced
+ * to a channel due to the network sync.
*/
- virtual void OnUserJoin(User* user, Channel* channel, bool &silent);
+ virtual void OnUserJoin(User* user, Channel* channel, bool sync, bool &silent);
/** Called after a user joins a channel
* Identical to OnUserJoin, but called immediately afterwards, when any linking module has
* can be gauranteed to already have processed the oper-up, for example m_spanningtree has sent
* out the OPERTYPE, etc.
* @param user The user who is opering up
+ * @param opername The name of the oper that the user is opering up to. Only valid locally. Empty string otherwise.
* @param opertype The opers type name
*/
- virtual void OnPostOper(User* user, const std::string &opertype);
+ virtual void OnPostOper(User* user, const std::string &opername, const std::string &opertype);
/** Called whenever a user types /INFO.
* The User will contain the information of the user who typed the command. Modules may use this
*/
virtual void OnAddLine(User* source, XLine* line);
- /** Called whenever an xline is deleted.
+ /** Called whenever an xline is deleted MANUALLY. See OnExpireLine for expiry.
* This method is triggered after the line is deleted.
* @param source The user removing the line or NULL for local server
* @param line the line being deleted
*/
virtual void OnDelLine(User* source, XLine* line);
- /** Called whenever a zline is deleted.
+ /** Called whenever an xline expires.
* This method is triggered after the line is deleted.
- * @param source The user removing the line
- * @param hostmask The hostmask to delete
+ * @param line The line being deleted.
*/
+ virtual void OnExpireLine(XLine *line);
/** Called before your module is unloaded to clean up Extensibles.
* This method is called once for every user and channel on the network,
*/
virtual int OnCheckInvite(User* user, Channel* chan);
+ /** Called whenever a mode character is processed.
+ * Return 1 from this function to block the mode character from being processed entirely.
+ * @param user The user who is sending the mode
+ * @param chan The channel the mode is being sent to (or NULL if a usermode)
+ * @param mode The mode character being set
+ * @param param The parameter for the mode or an empty string
+ * @param adding true of the mode is being added, false if it is being removed
+ * @param pcnt The parameter count for the mode (0 or 1)
+ * @return 1 to deny the mode, 0 to allow
+ */
+ virtual int OnRawMode(User* user, Channel* chan, const char mode, const std::string ¶m, bool adding, int pcnt);
+
/** Called whenever a user joins a channel, to determine if key checks should go ahead or not.
* This method will always be called for each join, wether or not the channel is actually +k, and
* determines the outcome of an if statement around the whole section of key checking code.
* @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
+ * @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);
*/
typedef DLLFactory<Module> ircd_module;
-/** A list of loaded module handles (ircd_module)
- */
-typedef std::vector<ircd_module*> ModuleHandleList;
-
/** A list of modules
*/
typedef std::vector<Module*> IntModuleList;
-/** A list of event handlers
- */
-typedef std::vector<IntModuleList> EventHandlerList;
-
/** An event handler iterator
*/
typedef IntModuleList::iterator EventHandlerIter;
private:
/** Holds a string describing the last module error to occur
*/
- char MODERR[MAXBUF];
+ std::string LastModuleError;
/** The feature names published by various modules
*/
*/
interfacelist Interfaces;
- /** Total number of modules loaded into the ircd, minus one
+ /** Total number of modules loaded into the ircd
*/
int ModCount;
/** Event handler hooks.
* This needs to be public to be used by FOREACH_MOD and friends.
*/
- EventHandlerList EventHandlers;
+ IntModuleList EventHandlers[I_END];
/** Simple, bog-standard, boring constructor.
*/
/** Returns text describing the last module error
* @return The last error message to occur
*/
- const char* LastError();
+ std::string& LastError();
/** Load a given module file
* @param filename The file to load