/** InspIRCd major version.
* 1.2 -> 102; 2.1 -> 201; 2.12 -> 212
*/
-#define INSPIRCD_VERSION_MAJ 202
+#define INSPIRCD_VERSION_MAJ 300
+
/** InspIRCd API version.
* If you change any API elements, increment this value. This counter should be
* reset whenever the major version is changed. Modules can use these two values
* and numerical comparisons in preprocessor macros if they wish to support
* multiple versions of InspIRCd in one file.
*/
-#define INSPIRCD_VERSION_API 1
+#define INSPIRCD_VERSION_API 6
/**
* This #define allows us to call a method in all
_next = _i+1; \
try \
{ \
- (*_i)->y x ; \
+ if (!(*_i)->dying) \
+ (*_i)->y x ; \
} \
catch (CoreException& modexcept) \
{ \
_next = _i+1; \
try \
{ \
- v = (*_i)->n args;
+ if (!(*_i)->dying) \
+ v = (*_i)->n args;
#define WHILE_EACH_HOOK(n) \
} \
*/
enum Implementation
{
- I_OnUserConnect, I_OnUserQuit, I_OnUserDisconnect, I_OnUserJoin, I_OnUserPart,
+ I_OnUserConnect, I_OnUserPreQuit, I_OnUserQuit, I_OnUserDisconnect, I_OnUserJoin, I_OnUserPart,
I_OnSendSnotice, I_OnUserPreJoin, I_OnUserPreKick, I_OnUserKick, I_OnOper,
I_OnUserPreInvite, I_OnUserInvite, I_OnUserPreMessage, I_OnUserPreNick,
I_OnUserPostMessage, I_OnUserMessageBlocked, I_OnMode,
- I_OnDecodeMetaData, I_OnAcceptConnection, I_OnUserInit,
+ I_OnDecodeMetaData, I_OnAcceptConnection, I_OnUserInit, I_OnUserPostInit,
I_OnChangeHost, I_OnChangeRealName, I_OnAddLine, I_OnDelLine, I_OnExpireLine,
I_OnUserPostNick, I_OnPreMode, I_On005Numeric, I_OnKill, I_OnLoadModule,
I_OnUnloadModule, I_OnBackgroundTimer, I_OnPreCommand, I_OnCheckReady, I_OnCheckInvite,
I_OnRawMode, I_OnCheckKey, I_OnCheckLimit, I_OnCheckBan, I_OnCheckChannelBan, I_OnExtBanCheck,
- I_OnPreChangeHost, I_OnPreTopicChange,
+ I_OnPreChangeHost, I_OnPreTopicChange, I_OnConnectionFail,
I_OnPostTopicChange, I_OnPostConnect, I_OnPostDeoper,
I_OnPreChangeRealName, I_OnUserRegister, I_OnChannelPreDelete, I_OnChannelDelete,
I_OnPostOper, I_OnPostCommand, I_OnPostJoin,
I_OnBuildNeighborList, I_OnGarbageCollect, I_OnSetConnectClass,
- I_OnUserMessage, I_OnPassCompare, I_OnNamesListItem, I_OnNumeric,
- I_OnPreRehash, I_OnModuleRehash, I_OnSendWhoLine, I_OnChangeIdent, I_OnSetUserIP,
+ I_OnUserMessage, I_OnPassCompare, I_OnNumeric,
+ I_OnPreRehash, I_OnModuleRehash, I_OnChangeIdent, I_OnSetUserIP,
I_OnServiceAdd, I_OnServiceDel, I_OnUserWrite,
I_END
};
*/
virtual void OnUserConnect(LocalUser* user);
+ /** Called when before a user quits.
+ * The details of the exiting user are available to you in the parameter User *user
+ * 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 (as seen by non-opers)
+ * @param oper_message The user's quit message (as seen by opers)
+ */
+ virtual ModResult OnUserPreQuit(LocalUser* user, std::string& message, std::string& oper_message);
+
/** Called when a user quits.
* The details of the exiting user are available to you in the parameter User *user
* This event is only called when the user is fully registered when they quit. To catch
/** Called whenever a user's real name is changed.
* This event triggers after the name has been set.
* @param user The user who's real name is being changed
- * @param name The new real name being set on the user
+ * @param real The new real name being set on the user
*/
virtual void OnChangeRealName(User* user, const std::string& real);
*/
virtual void OnPostCommand(Command* command, const CommandBase::Params& parameters, LocalUser* user, CmdResult result, bool loop);
- /** Called when a user is first connecting, prior to starting DNS lookups, checking initial
- * connect class, or accepting any commands.
+ /** Called after a user object is initialised and added to the user list.
+ * When this is called the user has not had their I/O hooks checked or had their initial
+ * connect class assigned and may not yet have a serialiser. You probably want to use
+ * the OnUserPostInit or OnUserSetIP hooks instead of this one.
+ * @param user The connecting user.
*/
virtual void OnUserInit(LocalUser* user);
+ /** Called after a user object has had their I/O hooks checked, their initial connection
+ * class assigned, and had a serialiser set.
+ * @param user The connecting user.
+ */
+ virtual void OnUserPostInit(LocalUser* user);
+
/** 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
* state until all modules return true. For example a module which implements ident
*/
virtual ModResult OnSetConnectClass(LocalUser* user, ConnectClass* myclass);
-#ifdef INSPIRCD_ENABLE_TESTSUITE
- /** Add test suite hooks here. These are used for testing functionality of a module
- * via the --testsuite debugging parameter.
- */
- virtual void OnRunTestSuite();
-#endif
-
- /** 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.
- * @param issuer The user who is going to receive the NAMES list being built
- * @param item The channel member being considered for inclusion
- * @param prefixes The prefix character(s) to display, initially set to the prefix char of the most powerful
- * prefix mode the member has, can be changed
- * @param nick The nick to display, initially set to the member's nick, can be changed
- * @return Return MOD_RES_PASSTHRU to allow the member to be displayed, MOD_RES_DENY to cause them to be
- * excluded from this NAMES list
- */
- virtual ModResult OnNamesListItem(User* issuer, Membership* item, std::string& prefixes, std::string& nick);
-
virtual ModResult OnNumeric(User* user, const Numeric::Numeric& numeric);
- /** Called whenever a result from /WHO is about to be returned
- * @param source The user running the /WHO query
- * @param params The parameters to the /WHO query
- * @param user The user that this line of the query is about
- * @param memb The member shown in this line, NULL if no channel is in this line
- * @param numeric Numeric to send; modifiable.
- * @return MOD_RES_PASSTHRU to allow the line to be displayed, MOD_RES_DENY to hide it
- */
- virtual ModResult OnSendWhoLine(User* source, const std::vector<std::string>& params, User* user, Membership* memb, Numeric::Numeric& numeric);
-
/** Called whenever a local user's IP is set for the first time, or when a local user's IP changes due to
* a module like m_cgiirc changing it.
* @param user The user whose IP is being set
*/
virtual void OnServiceDel(ServiceProvider& service);
+ /** Called whenever a message is about to be written to a user.
+ * @param user The user who is having a message sent to them.
+ * @param msg The message which is being written to the user.
+ * @return MOD_RES_ALLOW to explicitly allow the message to be sent, MOD_RES_DENY to explicitly
+ * deny the message from being sent, or MOD_RES_PASSTHRU to let another module handle the event.
+ */
virtual ModResult OnUserWrite(LocalUser* user, ClientProtocol::Message& msg);
+
+ /** Called when a user connection has been unexpectedly disconnected.
+ * @param user The user who has been unexpectedly disconnected.
+ * @param error The type of error which caused this connection failure.
+ * @return MOD_RES_ALLOW to explicitly retain the user as a zombie, MOD_RES_DENY to explicitly
+ * disconnect the user, or MOD_RES_PASSTHRU to let another module handle the event.
+ */
+ virtual ModResult OnConnectionFail(LocalUser* user, BufferedSocketError error);
};
/** ModuleManager takes care of all things module-related
Module::List EventHandlers[I_END];
/** List of data services keyed by name */
- std::multimap<std::string, ServiceProvider*> DataProviders;
+ std::multimap<std::string, ServiceProvider*, irc::insensitive_swo> DataProviders;
/** A list of ServiceProviders waiting to be registered.
* Non-NULL when constructing a Module, NULL otherwise.