-/* +------------------------------------+
- * | Inspire Internet Relay Chat Daemon |
- * +------------------------------------+
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
*
- * InspIRCd: (C) 2002-2010 InspIRCd Development Team
- * See: http://wiki.inspircd.org/Credits
+ * Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
+ * Copyright (C) 2006-2007, 2009 Dennis Friis <peavey@inspircd.org>
+ * Copyright (C) 2003-2008 Craig Edwards <craigedwards@brainbox.cc>
+ * Copyright (C) 2008 Thomas Stagner <aquanight@inspircd.org>
+ * Copyright (C) 2007 Robin Burchell <robin+git@viroteck.net>
+ * Copyright (C) 2006-2007 Oliver Lupton <oliverlupton@gmail.com>
+ * Copyright (C) 2003 randomdan <???@???>
*
- * This program is free but copyrighted software; see
- * the file COPYING for details.
+ * This file is part of InspIRCd. InspIRCd is free software: you can
+ * redistribute it and/or modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation, version 2.
*
- * ---------------------------------------------------
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef __MODULES_H
-#define __MODULES_H
+
+#ifndef MODULES_H
+#define MODULES_H
#include "dynamic.h"
#include "base.h"
}
};
-/** If you change the module API in any way, increment this value.
- * This MUST be a pure integer, with no parenthesis
+/** InspIRCd major version.
+ * 1.2 -> 102; 2.1 -> 201; 2.12 -> 212
+ */
+#define INSPIRCD_VERSION_MAJ 200
+/** 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 API_VERSION 141
+#define INSPIRCD_VERSION_API 4
/**
* This #define allows us to call a method in all
/** Holds a module's Version information.
* The members (set by the constructor only) indicate details as to the version number
* of a module. A class of type Version is returned by the GetVersion method of the Module class.
- *
- * The core provides only one implementation of the template, causing a run-time linking
- * error when attempting to load a module compiled against a different API_VERSION.
*/
-template<int api>
-class CoreExport VersionBase
+class CoreExport Version
{
public:
/** Module description
const std::string link_data;
/** Simple module version */
- VersionBase(const std::string &desc, int flags = VF_NONE);
+ Version(const std::string &desc, int flags = VF_NONE);
/** Complex version information, including linking compatability data */
- VersionBase(const std::string &desc, int flags, const std::string& linkdata);
-
- virtual ~VersionBase() {}
+ Version(const std::string &desc, int flags, const std::string& linkdata);
- /** Return true if the module can link (default is identity comparison) */
- virtual bool CanLink(const std::string& other_data);
+ virtual ~Version() {}
};
-typedef VersionBase<API_VERSION> Version;
-
/** The Request class is a unicast message directed at a given module.
* When this class is properly instantiated it may be sent to a module
* using the Send() method, which will call the given module's OnRequest
I_OnPostOper, I_OnSyncNetwork, I_OnSetAway, I_OnPostCommand, I_OnPostJoin,
I_OnWhoisLine, I_OnBuildNeighborList, I_OnGarbageCollect, I_OnSetConnectClass,
I_OnText, I_OnPassCompare, I_OnRunTestSuite, I_OnNamesListItem, I_OnNumeric, I_OnHookIO,
- I_OnPreRehash, I_OnModuleRehash, I_OnSendWhoLine, I_OnChangeIdent,
+ I_OnPreRehash, I_OnModuleRehash, I_OnSendWhoLine, I_OnChangeIdent, I_OnSetUserIP,
I_END
};
* @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.
* @param created This is true if the join created the channel
+ * @param except_list A list of users not to send to.
*/
virtual void OnUserJoin(Membership* memb, bool sync, bool created, CUList& except_list);
* seen the join.
* @param memb The channel membership created
*/
- virtual void OnPostJoin(Membership*);
+ virtual void OnPostJoin(Membership* memb);
/** Called when a user parts a channel.
* The details of the leaving user are available to you in the parameter User *user,
* and the details of the channel they have left is available in the variable Channel *channel
* @param memb The channel membership being destroyed
* @param partmessage The part message, or an empty string (may be modified)
+ * @param except_list A list of users to not send to.
*/
virtual void OnUserPart(Membership* memb, std::string &partmessage, CUList& except_list);
* output to be sent to the user by the core. If you do this you must produce your own numerics,
* notices etc.
* @param source The user issuing the kick
- * @param user The user being kicked
- * @param chan The channel the user is being kicked from
+ * @param memb The channel membership of the user who is being kicked.
* @param reason The kick reason
* @return 1 to prevent the kick, 0 to continue normally, -1 to explicitly allow the kick regardless of normal operation
*/
* If this method is called, the kick is already underway and cannot be prevented, so
* to prevent a kick, please use Module::OnUserPreKick instead of this method.
* @param source The user issuing the kick
- * @param user The user being kicked
- * @param chan The channel the user is being kicked from
+ * @param memb The channel membership of the user who was kicked.
* @param reason The kick reason
+ * @param except_list A list of users to not send to.
*/
virtual void OnUserKick(User* source, Membership* memb, const std::string &reason, CUList& except_list);
* @param target_type The type of target (TYPE_USER or TYPE_CHANNEL)
* @param text the text being sent by the user
* @param status The status being used, e.g. PRIVMSG @#chan has status== '@', 0 to send to everyone.
+ * @param exempt_list A list of users to not send to.
*/
virtual void OnUserMessage(User* user, void* dest, int target_type, const std::string &text, char status, const CUList &exempt_list);
* @param target_type The type of target (TYPE_USER or TYPE_CHANNEL)
* @param text the text being sent by the user
* @param status The status being used, e.g. NOTICE @#chan has status== '@', 0 to send to everyone.
+ * @param exempt_list A list of users to not send to.
*/
virtual void OnUserNotice(User* user, void* dest, int target_type, const std::string &text, char status, const CUList &exempt_list);
* @param target_type The type of target (TYPE_USER or TYPE_CHANNEL)
* @param text the text being sent by the user
* @param status The status being used, e.g. NOTICE @#chan has status== '@', 0 to send to everyone.
+ * @param exempt_list A list of users not to send to. For channel messages, this will usually contain just the sender.
*/
virtual void OnText(User* user, void* dest, int target_type, const std::string &text, char status, CUList &exempt_list);
/** Allows module data, sent via ProtoSendMetaData, to be decoded again by a receiving module.
* Please see src/modules/m_swhois.cpp for a working example of how to use this method call.
- * @param target_type The type of item to decode data for, TYPE_USER or TYPE_CHANNEL
* @param target The Channel* or User* that data should be added to
* @param extname The extension name which is being sent
* @param extdata The extension data, encoded at the other end by an identical module through OnSyncChannelMetaData or OnSyncUserMetaData
* More documentation to follow soon. Please see src/modules/m_swhois.cpp for example of
* how to use this function.
* @param opaque An opaque pointer set by the protocol module, should not be modified!
- * @param target_type The type of item to decode data for, TYPE_USER or TYPE_CHANNEL
* @param target The Channel* or User* that metadata should be sent for
* @param extname The extension name to send metadata for
* @param extdata Encoded data for this extension name, which will be encoded at the oppsite end by an identical module using OnDecodeMetaData
/** Called whenever a user's IDENT is changed.
* This event triggers after the name has been set.
* @param user The user who's IDENT is being changed
- * @param gecos The new IDENT being set on the user
+ * @param ident The new IDENT being set on the user
*/
virtual void OnChangeIdent(User* user, const std::string &ident);
* @param source The user sending the KILL
* @param dest The user being killed
* @param reason The kill reason
+ * @param operreason The oper kill reason
*/
virtual void OnRemoteKill(User* source, User* dest, const std::string &reason, const std::string &operreason);
* absolutely neccessary (e.g. a module that extends the features of another
* module).
* @param mod Pointer to the module being unloaded (still valid)
- * @param name The filename of the module being unloaded
*/
virtual void OnUnloadModule(Module* mod);
* method returns, it will be passed an invalid pointer to the user object and crash!)
* @param command The command being executed
* @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.
* You should only change the parameter list and command string if validated == false (e.g. before the command lookup occurs).
* provided.
* @param command The command being executed
* @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 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
* 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
+ * @param keygiven The key given on joining the channel.
* @return 1 to explicitly allow the join, 0 to proceed as normal
*/
virtual ModResult OnCheckKey(User* user, Channel* chan, const std::string &keygiven);
* @param user The user changing the topic
* @param chan The channels who's topic is being changed
* @param topic The actual topic text
- * @param 1 to block the topic change, 0 to allow
+ * @return 1 to block the topic change, 0 to allow
*/
virtual ModResult OnPreTopicChange(User* user, Channel* chan, const std::string &topic);
* The password field (from the config file) is in 'password' and is to be compared against
* 'input'. This method allows for encryption of passwords (oper, connect:allow, die/restart, etc).
* You should return a nonzero value to override the normal comparison, or zero to pass it on.
- * @param ex The object that's causing the authentication (User* for <oper> <connect:allow> etc, Server* for <link>).
+ * @param ex The object that's causing the authentication (User* for \<oper> \<connect:allow> etc, Server* for \<link>).
* @param password The password from the configuration file (the password="" value).
* @param input The password entered by the user or whoever.
* @param hashtype The hash value from the config
virtual ModResult OnDelBan(User* source, Channel* channel,const std::string &banmask);
/** Called to install an I/O hook on an event handler
- * @param user The item to possibly install the I/O hook on
- * @param via The port that <user> connected on
+ * @param user The socket to possibly install the I/O hook on
+ * @param via The port that the user connected on
*/
- virtual void OnHookIO(StreamSocket*, ListenSocket* via);
+ virtual void OnHookIO(StreamSocket* user, ListenSocket* via);
/** Called when a port accepts a connection
* Return MOD_RES_ACCEPT if you have used the file descriptor.
* @param fd The file descriptor returned from accept()
- * @param from The local port the user connected to
+ * @param sock The socket connection for the new user
* @param client The client IP address and port
* @param server The server IP address and port
*/
- virtual ModResult OnAcceptConnection(int fd, ListenSocket* from, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server);
+ virtual ModResult OnAcceptConnection(int fd, ListenSocket* sock, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server);
/** 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.
* There are no return values from this call as all modules get an opportunity if required to
* process the connection.
- * @param fd The file descriptor returned from accept()
+ * @param sock The socket in question
* @param client The client IP address and port
* @param server The server IP address and port
- * @param localport The local port number the user connected to
*/
- virtual void OnStreamSocketAccept(StreamSocket*, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server);
+ virtual void OnStreamSocketAccept(StreamSocket* sock, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server);
/**
* Called when a hooked stream has data to write, or when the socket
* engine returns it as writable
- * @param socket The socket in question
+ * @param sock The socket in question
* @param sendq Data to send to the socket
* @return 1 if the sendq has been completely emptied, 0 if there is
* still data to send, and -1 if there was an error
*/
- virtual int OnStreamSocketWrite(StreamSocket*, std::string& sendq);
+ virtual int OnStreamSocketWrite(StreamSocket* sock, std::string& sendq);
/** Called immediately before any socket is closed. When this event is called, shutdown()
* has not yet been called on the socket.
- * @param fd The file descriptor of the socket prior to close()
+ * @param sock The socket in question
*/
- virtual void OnStreamSocketClose(StreamSocket*);
+ virtual void OnStreamSocketClose(StreamSocket* sock);
/** Called immediately upon connection of an outbound BufferedSocket which has been hooked
* by a module.
- * @param fd The file descriptor of the socket immediately after connect()
+ * @param sock The socket in question
*/
- virtual void OnStreamSocketConnect(StreamSocket*);
+ virtual void OnStreamSocketConnect(StreamSocket* sock);
/**
* Called when the stream socket has data to read
- * @param socket The socket that is ready
+ * @param sock The socket that is ready
* @param recvq The receive queue that new data should be appended to
* @return 1 if new data has been read, 0 if no new data is ready (but the
* socket is still connected), -1 if there was an error or close
*/
- virtual int OnStreamSocketRead(StreamSocket*, std::string& recvq);
+ virtual int OnStreamSocketRead(StreamSocket* sock, std::string& recvq);
/** Called whenever a user sets away or returns from being away.
* The away message is available as a parameter, but should not be modified.
* @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 channel The channel being queried (or NULL if not a channel query)
* @param line The raw line to send; modifiable, if empty no line will be returned.
*/
- virtual void OnSendWhoLine(User* source, const std::vector<std::string>& params, User* user, Channel* channel, std::string& line);
+ virtual void OnSendWhoLine(User* source, const std::vector<std::string>& params, User* user, std::string& line);
+
+ /** 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 OnSetUserIP(LocalUser* user);
};
* automatically detatch your module from all events it is attached to.
* @param i Event type to detach
* @param mod Module to detach event from
- * @param Detach true if the event was detached
+ * @return True if the event was detached
*/
bool Detach(Implementation i, Module* mod);
/** Attach an array of events to a module
* @param i Event types (array) to attach
* @param mod Module to attach events to
+ * @param sz The size of the implementation array
*/
void Attach(Implementation* i, Module* mod, size_t sz);
#define MODULE_INIT_STR MODULE_INIT_STR_FN_2(MODULE_INIT_SYM)
#define MODULE_INIT_STR_FN_2(x) MODULE_INIT_STR_FN_1(x)
#define MODULE_INIT_STR_FN_1(x) #x
-#define MODULE_INIT_SYM MODULE_INIT_SYM_FN_2(API_VERSION)
-#define MODULE_INIT_SYM_FN_2(x) MODULE_INIT_SYM_FN_1(x)
-#define MODULE_INIT_SYM_FN_1(x) inspircd_module_ ## x
+#define MODULE_INIT_SYM MODULE_INIT_SYM_FN_2(INSPIRCD_VERSION_MAJ, INSPIRCD_VERSION_API)
+#define MODULE_INIT_SYM_FN_2(x,y) MODULE_INIT_SYM_FN_1(x,y)
+#define MODULE_INIT_SYM_FN_1(x,y) inspircd_module_ ## x ## _ ## y
#ifdef PURE_STATIC
* and functions needed to make a module loadable by the OS.
* It defines the class factory and external init_module function.
*/
-#ifdef WINDOWS
+#ifdef _WIN32
#define MODULE_INIT(y) \
extern "C" DllExport Module * MODULE_INIT_SYM() \