* +------------------------------------+
*
* InspIRCd: (C) 2002-2009 InspIRCd Development Team
- * See: http://www.inspircd.org/wiki/index.php/Credits
+ * See: http://wiki.inspircd.org/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
} \
} while (0);
+#define FOREACH_RESULT_MAP(y,x,f) \
+do { \
+ EventHandlerIter safei; \
+ for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ) \
+ { \
+ safei = _i; \
+ ++safei; \
+ try \
+ { \
+ int MOD_RESULT = (*_i)->x ; \
+ f; \
+ } \
+ catch (CoreException& modexcept) \
+ { \
+ ServerInstance->Logs->Log("MODULE",DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
+ } \
+ _i = safei; \
+ } \
+} while(0);
+
/** Represents a non-local user.
* (in fact, any FD less than -1 does)
*/
I_OnDecodeMetaData, I_ProtoSendMode, I_ProtoSendMetaData, I_OnWallops, I_OnChangeHost, I_OnChangeName, I_OnAddLine,
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_OnCheckExtBan, I_OnCheckStringExtBan, I_OnStats, I_OnChangeLocalUserHost, I_OnChangeLocalUserGecos,
+ I_OnCheckKey, I_OnCheckLimit, I_OnCheckBan, I_OnCheckExtBan, I_OnCheckStringExtBan, 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_OnUserList,
* @return 1 To prevent the join, 0 to allow it.
*/
virtual int OnUserPreJoin(User* user, Channel* chan, const char* cname, std::string &privs, const std::string &keygiven);
-
+
/** Called whenever a user is about to be kicked.
* Returning a value of 1 from this function stops the process immediately, causing no
* output to be sent to the user by the core. If you do this you must produce your own numerics,
* @param opertype The opers type name
*/
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
* method to output their own credits in /INFO (which is the ircd's version of an about box).
* @param user The user issuing /INFO
*/
virtual void OnInfo(User* user);
-
+
/** Called whenever a /WHOIS is performed on a local user.
* The source parameter contains the details of the user who issued the WHOIS command, and
* the dest parameter contains the information of the user they are whoising.
* @param dest The user who is being WHOISed
*/
virtual void OnWhois(User* source, User* dest);
-
+
/** Called whenever a user is about to invite another user into a channel, before any processing is done.
* Returning 1 from this function stops the process immediately, causing no
* output to be sent to the user by the core. If you do this you must produce your own numerics,
* @return 1 to deny the invite, 0 to check whether or not the user has permission to invite, -1 to explicitly allow the invite
*/
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,
* use OnUserPreInvite instead.
* @param timeout The time the invite will expire (0 == never)
*/
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
* output to be sent to the user by the core. If you do this you must produce your own numerics,
* @param text The original message text causing the exempt list to be built
*/
virtual void OnBuildExemptList(MessageType message_type, Channel* chan, User* sender, char status, CUList &exempt_list, const std::string &text);
-
+
/** Called before any nickchange, local or remote. This can be used to implement Q-lines etc.
* Please note that although you can see remote nickchanges through this function, you should
* NOT make any changes to the User if the user is a remote user as this may cause a desnyc.
* @param dest The target of the modes (User* or Channel*)
* @param target_type The type of target (TYPE_USER or TYPE_CHANNEL)
* @param text The actual modes and their parameters if any
+ * @param translate The translation types of the mode parameters
*/
- virtual void OnMode(User* user, void* dest, int target_type, const std::string &text);
+ virtual void OnMode(User* user, void* dest, int target_type, const std::deque<std::string> &text, const std::deque<TranslateType> &translate);
/** Allows modules to alter or create server descriptions
* Whenever a module requires a server description, for example for display in
* @param target_type The type of item to decode data for, TYPE_USER or TYPE_CHANNEL
* @param target The Channel* or User* that modes should be sent for
* @param modeline The modes and parameters to be sent
+ * @param translate The translation types of the mode parameters
*/
- virtual void ProtoSendMode(void* opaque, TargetTypeFlags target_type, void* target, const std::string &modeline);
+ virtual void ProtoSendMode(void* opaque, TargetTypeFlags target_type, void* target, const std::deque<std::string> &modeline, const std::deque<TranslateType> &translate);
/** Implemented by modules which provide the ability to link servers.
* These modules will implement this method, which allows metadata (extra data added to
* @param extdata Encoded data for this extension name, which will be encoded at the oppsite end by an identical module using OnDecodeMetaData
*/
virtual void ProtoSendMetaData(void* opaque, TargetTypeFlags target_type, void* target, const std::string &extname, const std::string &extdata);
-
+
/** Called after every WALLOPS command.
* @param user The user sending the WALLOPS
* @param text The content of the WALLOPS message
* @param u The user to check
* @param c The channel the user is on
* @param type The type of extended ban to check for.
+ * @returns 1 = exempt, 0 = no match, -1 = banned
*/
virtual int OnCheckExtBan(User *u, Channel *c, char type);
/** Called whenever checking whether or not a string is extbanned. NOTE: one OnCheckExtBan will also trigger a number of
* OnCheckStringExtBan events for seperate host/IP comnbinations.
+ * @returns 1 = exempt, 0 = no match, -1 = banned
*/
virtual int OnCheckStringExtBan(const std::string &s, Channel *c, char type);
* @param newhost The new GECOS
* @return 1 to deny the GECOS change, 0 to allow
*/
- virtual int OnChangeLocalUserGECOS(User* user, const std::string &newhost);
+ virtual int OnChangeLocalUserGECOS(User* user, const std::string &newhost);
/** Called whenever a topic is changed by a local user.
* Return 1 to deny the topic change, 0 to check details on the change, -1 to let it through with no checks
/** Error code
*/
long error;
-
+
public:
/** Default constructor.
* This constructor initialises the ConfigReader class to read the inspircd.conf file
* This function will return false if the file could not be opened.
*/
bool Exists();
-
+
/** Retrieve one line from the file.
* This method retrieves one line from the text file. If an empty non-NULL string is returned,
* the index was out of bounds, or the line had no data on it.
*/
typedef IntModuleList::iterator EventHandlerIter;
-/** Module priority states
- */
-enum PriorityState
-{
- PRIO_DONTCARE,
- PRIO_FIRST,
- PRIO_LAST,
- PRIO_AFTER,
- PRIO_BEFORE
-};
-
/** ModuleManager takes care of all things module-related
* in the core.
*/
/** Holds a string describing the last module error to occur
*/
std::string LastModuleError;
-
+
/** The feature names published by various modules
*/
featurelist Features;
/** The interface names published by various modules
*/
interfacelist Interfaces;
-
+
/** Total number of modules loaded into the ircd
*/
- int ModCount;
-
+ int ModCount;
+
/** Our pointer to the main insp instance
*/
InspIRCd* Instance;
/** Destructor
*/
- ~ModuleManager();
+ ~ModuleManager();
/** Change the priority of one event in a module.
* Each module event has a list of modules which are attached to that event type.
* set it to be the last called, or PRIO_BEFORE and PRIO_AFTER
* to set it to be before or after one or more other modules.
* @param modules If PRIO_BEFORE or PRIO_AFTER is set in parameter 's',
- * then this contains a list of one or more modules your module must be
+ * then this contains a list of one or more modules your module must be
* placed before or after. Your module will be placed before the highest
* priority module in this list for PRIO_BEFORE, or after the lowest
* priority module in this list for PRIO_AFTER.
* Defaults to 1, as most of the time you will only want to prioritize your module
* to be before or after one other module.
*/
- bool SetPriority(Module* mod, Implementation i, PriorityState s, Module** modules = NULL, size_t sz = 1);
+ bool SetPriority(Module* mod, Implementation i, Priority s, Module** modules = NULL, size_t sz = 1);
/** Change the priority of all events in a module.
* @param mod The module to set the priority of
* SetPriority method for this, where you may specify other modules to
* be prioritized against.
*/
- bool SetPriority(Module* mod, PriorityState s);
+ bool SetPriority(Module* mod, Priority s);
/** Attach an event to a module.
* You may later detatch the event with ModuleManager::Detach().
* @param mod Module to detach from
*/
void DetachAll(Module* mod);
-
+
/** Returns text describing the last module error
* @return The last error message to occur
*/
* @return True if the module was unloaded
*/
bool Unload(const char* filename);
-
+
/** Called by the InspIRCd constructor to load all modules from the config file.
*/
void LoadAll();
-
+
/** Get the total number of currently loaded modules
* @return The number of loaded modules
*/
{
return this->ModCount;
}
-
+
/** Find a module by name, and return a Module* to it.
* This is preferred over iterating the module lists yourself.
* @param name The module name to look up
* @return A pointer to the module, or NULL if the module cannot be found
*/
Module* Find(const std::string &name);
-
+
/** Publish a 'feature'.
* There are two ways for a module to find another module it depends on.
* Either by name, using InspIRCd::FindModule, or by feature, using this