#include <string>
#include <deque>
#include <sstream>
+#include <typeinfo>
class Server;
class ServerConfig;
// loaded modules in a readable simple way, e.g.:
// 'FOREACH_MOD OnConnect(user);'
-#define FOREACH_MOD for (int _i = 0; _i <= MODCOUNT; _i++) modules[_i]->
+#define FOREACH_MOD(y,x) if (Config->global_implementation[y] > 0) { \
+ for (int _i = 0; _i <= MODCOUNT; _i++) { \
+ if (Config->implement_lists[_i][y]) \
+ modules[_i]->x ; \
+ } \
+ }
// 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,
// *********************************************************************************************
-#define FOREACH_RESULT(x) { MOD_RESULT = 0; \
+#define FOREACH_RESULT(y,x) { if (Config->global_implementation[y] > 0) { \
+ MOD_RESULT = 0; \
for (int _i = 0; _i <= MODCOUNT; _i++) { \
- int res = modules[_i]->x ; \
- if (res != 0) { \
- MOD_RESULT = res; \
- break; \
+ if (Config->implement_lists[_i][y]) {\
+ int res = modules[_i]->x ; \
+ if (res != 0) { \
+ MOD_RESULT = res; \
+ break; \
+ } \
} \
} \
- }
+ } \
+ }
// *********************************************************************************************
#define FD_MAGIC_NUMBER -42
+// useful macros
+
+#define IS_LOCAL(x) (x->fd > -1)
+#define IS_REMOTE(x) (x->fd < 0)
+#define IS_MODULE_CREATED(x) (x->fd == FD_MAGIC_NUMBER)
+
+// flags for use with WriteMode
+
+#define WM_AND 1
+#define WM_OR 2
+
+// flags for use with OnUserPreMessage and OnUserPreNotice
+
+#define TYPE_USER 1
+#define TYPE_CHANNEL 2
+#define TYPE_SERVER 3
+
/*extern void createcommand(char* cmd, handlerfunc f, char flags, int minparams, char* source);
extern void server_mode(char **parameters, int pcnt, userrec *user);*/
};
+enum Priority { PRIORITY_FIRST, PRIORITY_DONTCARE, PRIORITY_LAST };
+
+enum Implementation { I_OnUserConnect, I_OnUserQuit, I_OnUserDisconnect, I_OnUserJoin, I_OnUserPart, I_OnRehash, I_OnServerRaw,
+ I_OnExtendedMode, I_OnUserPreJoin, I_OnUserPreKick, I_OnUserKick, I_OnOper, I_OnInfo, I_OnWhois, I_OnUserPreInvite,
+ 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_OnAddGLine,
+ I_OnAddZLine, I_OnAddQLine, I_OnAddKLine, I_OnAddELine, I_OnDelGLine, I_OnDelZLine, I_OnDelKLine, I_OnDelELine, I_OnDelQLine,
+ I_OnCleanup, I_OnUserPostNick, I_OnAccessCheck, I_On005Numeric, I_OnKill, I_OnRemoteKill, I_OnLoadModule, I_OnUnloadModule,
+ I_OnBackgroundTimer, I_OnSendList, I_OnPreCommand, I_OnCheckReady, I_OnUserRrgister, I_OnRawMode, I_OnCheckInvite,
+ 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_OnGlobalConnect, I_OnAddBan, I_OnDelBan,
+ I_OnRawSocketAccept, I_OnRawSocketClose, I_OnRawSocketWrite, I_OnRawSocketRead, I_OnChangeLocalUserGECOS, I_OnUserRegister,
+ I_OnOperCompare };
+
/** 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 Version GetVersion();
+ virtual void Implements(char* Implements);
+
+ virtual Priority Prioritize();
+
/** Called when a user connects.
* The details of the connecting user are available to you in the parameter userrec *user
* @param user The user who is connecting
* @param parameters An array of array of characters containing the parameters for the command
* @param pcnt The nuimber of parameters passed to the command
* @param user the user issuing the command
+ * @param validated True if the command has passed all checks, e.g. it is recognised, has enough parameters, the user has permission to execute it, etc.
* @return 1 to block the command, 0 to allow
*/
- virtual int OnPreCommand(std::string command, char **parameters, int pcnt, userrec *user);
+ virtual int OnPreCommand(std::string command, char **parameters, int pcnt, userrec *user, bool validated);
/** Called to check if a user who is connecting can now be allowed to register
* If any modules return false for this function, the user is held in the waiting
/** Called on all /STATS commands
* This method is triggered for all /STATS use, including stats symbols handled by the core.
* @param symbol the symbol provided to /STATS
+ * @user the user issuing the /STATS command
+ * @return 1 to block the /STATS from being processed by the core, 0 to allow it
*/
- virtual void OnStats(char symbol);
+ virtual int OnStats(char symbol, userrec* user);
/** Called whenever a change of a local users displayed host is attempted.
* Return 1 to deny the host change, or 0 to allow it.
* 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(char* cmd, handlerfunc f, char flags, int minparams, char* source);
+ virtual void AddCommand(command_t *f);
/** Sends a servermode.
* you must format the parameters array with the target, modes and parameters for those modes.
*/
virtual void AddSocket(InspSocket* sock);
+ /** Forcibly removes a class derived from InspSocket from the servers socket engine.
+ */
+ virtual void RemoveSocket(InspSocket* sock);
+
/** Deletes a class derived from InspSocket from the server's socket engine.
*/
virtual void DelSocket(InspSocket* sock);