} \
catch (CoreException& modexcept) \
{ \
- ServerInstance->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
+ ServerInstance->Logs->Log("MODULE",DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
} \
_i = safei; \
} \
} \
catch (CoreException& modexcept) \
{ \
- z->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
+ z->Logs->Log("MODULE",DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
} \
_i = safei; \
} \
} \
catch (CoreException& modexcept) \
{ \
- ServerInstance->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
+ ServerInstance->Logs->Log("MODULE",DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
} \
_i = safei; \
} \
} \
catch (CoreException& modexcept) \
{ \
- z->Log(DEBUG,"Exception caught: %s",modexcept.GetReason()); \
+ z->Logs->Log("MODULE",DEBUG,"Exception caught: %s",modexcept.GetReason()); \
} \
_i = safei; \
} \
#define FD_MAGIC_NUMBER -42
/* Useful macros */
-#ifdef WINDOWS
+
/** Is a local user */
#define IS_LOCAL(x) ((x->GetFd() > -1))
-#else
-/** Is a local user */
-#define IS_LOCAL(x) ((x->GetFd() > -1) && (x->GetFd() <= MAX_DESCRIPTORS))
-#endif
/** Is a remote user */
#define IS_REMOTE(x) (x->GetFd() < 0)
/** Is a module created user */
* sent the request to. It is up to your module to know what this data is and
* how to deal with it.
*/
- char* Send();
+ const char* Send();
};
I_OnCheckKey, I_OnCheckLimit, I_OnCheckBan, I_OnStats, I_OnChangeLocalUserHost, I_OnChangeLocalUserGecos, I_OnLocalTopicChange,
I_OnPostLocalTopicChange, I_OnEvent, I_OnRequest, I_OnGlobalOper, I_OnPostConnect, I_OnAddBan, I_OnDelBan,
I_OnRawSocketAccept, I_OnRawSocketClose, I_OnRawSocketWrite, I_OnRawSocketRead, I_OnChangeLocalUserGECOS, I_OnUserRegister,
- I_OnChannelPreDelete, I_OnChannelDelete, I_OnPostOper, I_OnSyncOtherMetaData, I_OnSetAway, I_OnCancelAway, I_OnUserList,
+ I_OnChannelPreDelete, I_OnChannelDelete, I_OnPostOper, I_OnSyncOtherMetaData, I_OnSetAway, I_OnUserList,
I_OnPostCommand, I_OnPostJoin, I_OnWhoisLine, I_OnBuildExemptList, I_OnRawSocketConnect, I_OnGarbageCollect, I_OnBufferFlushed,
- I_OnText, I_OnReadConfig, I_OnDownloadFile, I_OnPassCompare,
+ I_OnText, I_OnPassCompare, I_OnRunTestSuite, I_OnNamesListItem, I_OnNumeric, I_OnHookUserIO,
I_END
};
{
}
- 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
* @param source The user who is issuing the INVITE
* @param dest The user being invited
* @param channel The channel the user is being invited to
+ * @param timeout The time the invite will expire (0 == never)
* @return 1 to deny the invite, 0 to allow
*/
- virtual int OnUserPreInvite(User* source,User* dest,Channel* channel);
+ virtual int OnUserPreInvite(User* source,User* dest,Channel* channel, time_t timeout);
/** Called after a user has been successfully invited to a channel.
* You cannot prevent the invite from occuring using this function, to do that,
* @param source The user who is issuing the INVITE
* @param dest The user being invited
* @param channel The channel the user is being invited to
+ * @param timeout The time the invite will expire (0 == never)
*/
- virtual void OnUserInvite(User* source,User* dest,Channel* channel);
+ virtual void OnUserInvite(User* source,User* dest,Channel* channel, time_t timeout);
/** Called whenever a user is about to PRIVMSG A user or a channel, before any processing is done.
* Returning any nonzero value from this function stops the process immediately, causing no
* @param original_line The entire original line as passed to the parser from the user
* @return 1 to block the command, 0 to allow
*/
- virtual int OnPreCommand(const std::string &command, const char** parameters, int pcnt, User *user, bool validated, const std::string &original_line);
+ virtual int OnPreCommand(const std::string &command, const char* const* parameters, int pcnt, User *user, bool validated, const std::string &original_line);
/** Called after any command has been executed.
* This event occurs for all registered commands, wether they are registered in the core,
* @param result The return code given by the command handler, one of CMD_SUCCESS or CMD_FAILURE
* @param original_line The entire original line as passed to the parser from the user
*/
- virtual void OnPostCommand(const std::string &command, const char** parameters, int pcnt, User *user, CmdResult result, const std::string &original_line);
+ virtual void OnPostCommand(const std::string &command, const char* const* parameters, int pcnt, User *user, CmdResult result, const std::string &original_line);
/** 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
* @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
+ * @return ACR_DENY to deny the mode, ACR_DEFAULT to do standard mode checking, and ACR_ALLOW
+ * to skip all permission checking. Please note that for remote mode changes, your return value
+ * will be ignored!
*/
- virtual int OnRawMode(User* user, Channel* chan, const char mode, const std::string ¶m, bool adding, int pcnt);
+ virtual int OnRawMode(User* user, Channel* chan, const char mode, const std::string ¶m, bool adding, int pcnt, bool servermode = true);
/** 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
* return 1 to explicitly allow the join to go ahead or 0 to ignore the event.
* @param user The user joining the channel
* @param chan The channel being joined
- * @return 1 to explicitly allow the join, 0 to proceed as normal
+ * @return 1 to explicitly allow the join, 0 to proceed as normal. Return -1 to explicitly deny the
+ * join to the channel.
*/
virtual int OnCheckBan(User* user, Channel* chan);
* may be able to use for pre-determined purposes (e.g. the results of an SQL query, etc).
* @param request The Request class being received
*/
- virtual char* OnRequest(Request* request);
+ virtual const char* OnRequest(Request* request);
/** Called whenever a password check is to be made. Replaces the old OldOperCompare API.
* The password field (from the config file) is in 'password' and is to be compared against
*/
virtual int OnDelBan(User* source, Channel* channel,const std::string &banmask);
+ virtual void OnHookUserIO(User* user, const std::string &targetip);
+
/** Called immediately after any connection is accepted. This is intended for raw socket
* processing (e.g. modules which wrap the tcp connection within another library) and provides
* no information relating to a user record as the connection has not been assigned yet.
*/
virtual int OnRawSocketRead(int fd, char* buffer, unsigned int count, int &readresult);
- /** Called whenever a user sets away.
- * This method has no parameter for the away message, as it is available in the
- * user record as User::awaymsg.
+ /** 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 void OnSetAway(User* user);
-
- /** Called when a user cancels their away state.
- * @param user The user returning from away
- */
- virtual void OnCancelAway(User* user);
+ 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,
* @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);
};
*/
modulelist* FindInterface(const std::string &InterfaceName);
+ /** Determine if a module has published the named interface.
+ * This could be used in, for example, OnLoadModule to pick up other modules that can be used.
+ * @param mod The module to check.
+ * @param InterfaceName the interface you want to check for
+ * @return True if the module provides the interface, false otherwise.
+ */
+ bool ModuleHasInterface(Module* mod, const std::string& InterfaceName);
+
/** Given a pointer to a Module, return its filename
* @param m The module pointer to identify
* @return The module name or an empty string