]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/modules.h
Move more stuff into userrec
[user/henk/code/inspircd.git] / include / modules.h
index 851fa1b5a514106cee0138093d6b2d1148c53508..b0d249c7c73d8d52060a11cec5f500c338acba0c 100644 (file)
@@ -3,13 +3,13 @@
  *       +------------------------------------+
  *
  *  InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
- *                       E-mail:
- *                <brain@chatspike.net>
- *               <Craig@chatspike.net>
+ *                    E-mail:
+ *             <brain@chatspike.net>
+ *               <Craig@chatspike.net>
  *     
  * Written by Craig Edwards, Craig McLure, and others.
  * This program is free but copyrighted software; see
- *            the file COPYING for details.
+ *         the file COPYING for details.
  *
  * ---------------------------------------------------
  */
 #ifndef __MODULES_H
 #define __MODULES_H
 
-/** log levels
- */
-enum DebugLevels { DEBUG, VERBOSE, DEFAULT, SPARSE, NONE };
-
 /** Used with OnAccessCheck() method of modules
  */
 enum AccessControlType {
@@ -71,6 +67,7 @@ enum TargetTypeFlags {
 #include <typeinfo>
 #include "timer.h"
 #include "mode.h"
+#include "dns.h"
 
 class Server;
 class ServerConfig;
@@ -83,11 +80,6 @@ class Module;
 typedef std::deque<std::string> file_cache;
 typedef file_cache string_list;
 
-/** Holds a list of users in a channel
- */
-typedef std::deque<userrec*> chanuserlist;
-
-
 /** Holds a list of 'published features' for modules.
  */
 typedef std::map<std::string,Module*> featurelist;
@@ -97,9 +89,9 @@ typedef std::map<std::string,Module*> featurelist;
  * loaded modules in a readable simple way, e.g.:
  * 'FOREACH_MOD(I_OnXonnwxr,OnConnect(user));'
  */
-#define FOREACH_MOD(y,x) if (Config->global_implementation[y] > 0) { \
+#define FOREACH_MOD(y,x) if (ServerInstance->Config->global_implementation[y] > 0) { \
        for (int _i = 0; _i <= MODCOUNT; _i++) { \
-       if (Config->implement_lists[_i][y]) \
+       if (ServerInstance->Config->implement_lists[_i][y]) \
                try \
                { \
                        modules[_i]->x ; \
@@ -111,15 +103,28 @@ typedef std::map<std::string,Module*> featurelist;
        } \
   }
 
+#define FOREACH_MOD_I(z,y,x) if (z->Config->global_implementation[y] > 0) { \
+       for (int _i = 0; _i <= MODCOUNT; _i++) { \
+               if (z->Config->implement_lists[_i][y]) \
+               try \
+               { \
+                       modules[_i]->x ; \
+               } \
+               catch (ModuleException& modexcept) \
+               { \
+                       log(DEBUG,"Module exception caught: %s",modexcept.GetReason()); \
+               } \
+       } \
+}
 /**
  *  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,
  * and any modules after are ignored.
  */
-#define FOREACH_RESULT(y,x) { if (Config->global_implementation[y] > 0) { \
+#define FOREACH_RESULT(y,x) { if (ServerInstance->Config->global_implementation[y] > 0) { \
                        MOD_RESULT = 0; \
                        for (int _i = 0; _i <= MODCOUNT; _i++) { \
-                       if (Config->implement_lists[_i][y]) {\
+                       if (ServerInstance->Config->implement_lists[_i][y]) { \
                                try \
                                { \
                                        int res = modules[_i]->x ; \
@@ -137,6 +142,27 @@ typedef std::map<std::string,Module*> featurelist;
        } \
  }
 
+#define FOREACH_RESULT_I(z,y,x) { if (z->Config->global_implementation[y] > 0) { \
+                       MOD_RESULT = 0; \
+                       for (int _i = 0; _i <= MODCOUNT; _i++) { \
+                       if (z->Config->implement_lists[_i][y]) { \
+                               try \
+                               { \
+                                       int res = modules[_i]->x ; \
+                                       if (res != 0) { \
+                                               MOD_RESULT = res; \
+                                               break; \
+                                       } \
+                               } \
+                               catch (ModuleException& modexcept) \
+                               { \
+                                       log(DEBUG,"Module exception cought: %s",modexcept.GetReason()); \
+                               } \
+                       } \
+               } \
+       } \
+}
+
 #define FD_MAGIC_NUMBER -42
 
 // useful macros
@@ -192,6 +218,11 @@ class Request : public ModuleMessage
        /** This member holds a pointer to arbitary data set by the emitter of the message
         */
        char* data;
+       /** This should be a null-terminated string identifying the type of request,
+        * all modules should define this and use it to determine the nature of the
+        * request before they attempt to cast the Request in any way.
+        */
+       const char* id;
        /** This is a pointer to the sender of the message, which can be used to
         * directly trigger events, or to create a reply.
         */
@@ -201,11 +232,28 @@ class Request : public ModuleMessage
        Module* dest;
  public:
        /** Create a new Request
+        * This is for the 'old' way of casting whatever the data is
+        * to char* and hoping you get the right thing at the other end.
+        * This is slowly being depreciated in favor of the 'new' way.
         */
        Request(char* anydata, Module* src, Module* dst);
+       /** Create a new Request
+        * This is for the 'new' way of defining a subclass
+        * of Request and defining it in a common header,
+        * passing an object of your Request subclass through
+        * as a Request* and using the ID string to determine
+        * what to cast it back to and the other end. This is
+        * much safer as there are no casts not confirmed by
+        * the ID string, and all casts are child->parent and
+        * can be checked at runtime with dynamic_cast<>()
+        */
+       Request(Module* src, Module* dst, const char* idstr);
        /** Fetch the Request data
         */
        char* GetData();
+       /** Fetch the ID string
+        */
+       const char* GetId();
        /** Fetch the request source
         */
        Module* GetSource();
@@ -268,7 +316,7 @@ class Event : public ModuleMessage
  * be loaded. If this happens, the error message returned by ModuleException::GetReason will be displayed to the user
  * attempting to load the module, or dumped to the console if the ircd is currently loading for the first time.
  */
-class ModuleException
+class ModuleException : public classbase
 {
  private:
        /** Holds the error message to be displayed
@@ -461,15 +509,15 @@ class Module : public Extensible
        virtual int OnUserPreJoin(userrec* user, chanrec* chan, const char* cname);
        
        /** 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,
-         * notices etc.
+        * 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,
+        * 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 reason The kick reason
         * @return 1 to prevent the kick, 0 to continue normally, -1 to explicitly allow the kick regardless of normal operation
-         */
+        */
        virtual int OnUserPreKick(userrec* source, userrec* user, chanrec* chan, const std::string &reason);
 
        /** Called whenever a user is kicked.
@@ -768,72 +816,72 @@ class Module : public Extensible
 
        /** Called whenever a zline is added by a local user.
         * This method is triggered after the line is added.
-         * @param duration The duration of the line in seconds
-         * @param source The sender of the line
-         * @param reason The reason text to be displayed
-         * @param ipmask The hostmask to add
+        * @param duration The duration of the line in seconds
+        * @param source The sender of the line
+        * @param reason The reason text to be displayed
+        * @param ipmask The hostmask to add
         */
        virtual void OnAddZLine(long duration, userrec* source, const std::string &reason, const std::string &ipmask);
 
        /** Called whenever a kline is added by a local user.
         * This method is triggered after the line is added.
-         * @param duration The duration of the line in seconds
-         * @param source The sender of the line
-         * @param reason The reason text to be displayed
-         * @param hostmask The hostmask to add
+        * @param duration The duration of the line in seconds
+        * @param source The sender of the line
+        * @param reason The reason text to be displayed
+        * @param hostmask The hostmask to add
         */
        virtual void OnAddKLine(long duration, userrec* source, const std::string &reason, const std::string &hostmask);
 
        /** Called whenever a qline is added by a local user.
         * This method is triggered after the line is added.
-         * @param duration The duration of the line in seconds
-         * @param source The sender of the line
-         * @param reason The reason text to be displayed
-         * @param nickmask The hostmask to add
+        * @param duration The duration of the line in seconds
+        * @param source The sender of the line
+        * @param reason The reason text to be displayed
+        * @param nickmask The hostmask to add
         */
        virtual void OnAddQLine(long duration, userrec* source, const std::string &reason, const std::string &nickmask);
 
        /** Called whenever a eline is added by a local user.
         * This method is triggered after the line is added.
-         * @param duration The duration of the line in seconds
-         * @param source The sender of the line
-         * @param reason The reason text to be displayed
-         * @param hostmask The hostmask to add
+        * @param duration The duration of the line in seconds
+        * @param source The sender of the line
+        * @param reason The reason text to be displayed
+        * @param hostmask The hostmask to add
         */
        virtual void OnAddELine(long duration, userrec* source, const std::string &reason, const std::string &hostmask);
 
        /** Called whenever a gline is deleted.
         * This method is triggered after the line is deleted.
-         * @param source The user removing the line
-         * @param hostmask The hostmask to delete
+        * @param source The user removing the line
+        * @param hostmask The hostmask to delete
         */
        virtual void OnDelGLine(userrec* source, const std::string &hostmask);
 
        /** Called whenever a zline is deleted.
         * This method is triggered after the line is deleted.
-         * @param source The user removing the line
-         * @param hostmask The hostmask to delete
+        * @param source The user removing the line
+        * @param hostmask The hostmask to delete
         */
        virtual void OnDelZLine(userrec* source, const std::string &ipmask);
 
        /** Called whenever a kline is deleted.
         * This method is triggered after the line is deleted.
-         * @param source The user removing the line
-         * @param hostmask The hostmask to delete
+        * @param source The user removing the line
+        * @param hostmask The hostmask to delete
         */
        virtual void OnDelKLine(userrec* source, const std::string &hostmask);
        
        /** Called whenever a qline is deleted.
         * This method is triggered after the line is deleted.
-         * @param source The user removing the line
-         * @param hostmask The hostmask to delete
+        * @param source The user removing the line
+        * @param hostmask The hostmask to delete
         */
        virtual void OnDelQLine(userrec* source, const std::string &nickmask);
 
        /** Called whenever a eline is deleted.
         * This method is triggered after the line is deleted.
-         * @param source The user removing the line
-         * @param hostmask The hostmask to delete
+        * @param source The user removing the line
+        * @param hostmask The hostmask to delete
         */
        virtual void OnDelELine(userrec* source, const std::string &hostmask);
 
@@ -850,13 +898,13 @@ class Module : public Extensible
 
        /** Called after any nickchange, local or remote. This can be used to track users after nickchanges
         * have been applied. Please note that although you can see remote nickchanges through this function, you should
-         * NOT make any changes to the userrec if the user is a remote user as this may cause a desnyc.
-         * check user->server before taking any action (including returning nonzero from the method).
+        * NOT make any changes to the userrec if the user is a remote user as this may cause a desnyc.
+        * check user->server before taking any action (including returning nonzero from the method).
         * Because this method is called after the nickchange is taken place, no return values are possible
         * to indicate forbidding of the nick change. Use OnUserPreNick for this.
         * @param user The user changing their nick
         * @param oldnick The old nickname of the user before the nickchange
-         */
+        */
        virtual void OnUserPostNick(userrec* user, const std::string &oldnick);
 
        /** Called before an action which requires a channel privilage check.
@@ -929,17 +977,17 @@ class Module : public Extensible
        virtual void OnLoadModule(Module* mod,const std::string &name);
 
        /** Called whenever a module is unloaded.
-         * mod will contain a pointer to the module, and string will contain its name,
-         * for example m_widgets.so. This function is primary for dependency checking,
-         * your module may decide to enable some extra features if it sees that you have
-         * for example loaded "m_killwidgets.so" with "m_makewidgets.so". It is highly
-         * recommended that modules do *NOT* bail if they cannot satisfy dependencies,
-         * but instead operate under reduced functionality, unless the dependency is
-         * absolutely neccessary (e.g. a module that extends the features of another
-         * module).
+        * mod will contain a pointer to the module, and string will contain its name,
+        * for example m_widgets.so. This function is primary for dependency checking,
+        * your module may decide to enable some extra features if it sees that you have
+        * for example loaded "m_killwidgets.so" with "m_makewidgets.so". It is highly
+        * recommended that modules do *NOT* bail if they cannot satisfy dependencies,
+        * but instead operate under reduced functionality, unless the dependency is
+        * 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,const std::string &name);
 
        /** Called once every five seconds for background processing.
@@ -966,7 +1014,7 @@ class Module : public Extensible
         * @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(const std::string &command, char **parameters, int pcnt, userrec *user, bool validated);
+       virtual int OnPreCommand(const std::string &command, const 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
@@ -1015,43 +1063,44 @@ class Module : public Extensible
        virtual int OnCheckInvite(userrec* user, chanrec* chan);
 
        /** 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
-         * determines the outcome of an if statement around the whole section of key checking code.
+        * This method will always be called for each join, wether or not the channel is actually +k, and
+        * determines the outcome of an if statement around the whole section of key checking code.
         * if the user specified no key, the keygiven string will be a valid but empty value.
-         * return 1 to explicitly allow the join to go ahead or 0 to ignore the event.
+        * 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
-         */
+        */
        virtual int OnCheckKey(userrec* user, chanrec* chan, const std::string &keygiven);
 
        /** Called whenever a user joins a channel, to determine if channel limit checks should go ahead or not.
-         * This method will always be called for each join, wether or not the channel is actually +l, and
-         * determines the outcome of an if statement around the whole section of channel limit checking code.
-         * return 1 to explicitly allow the join to go ahead or 0 to ignore the event.
+        * This method will always be called for each join, wether or not the channel is actually +l, and
+        * determines the outcome of an if statement around the whole section of channel limit checking code.
+        * 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
-         */
+        */
        virtual int OnCheckLimit(userrec* user, chanrec* chan);
 
        /** Called whenever a user joins a channel, to determine if banlist checks should go ahead or not.
-         * This method will always be called for each join, wether or not the user actually matches a channel ban, and
-         * determines the outcome of an if statement around the whole section of ban checking code.
-         * return 1 to explicitly allow the join to go ahead or 0 to ignore the event.
+        * This method will always be called for each join, wether or not the user actually matches a channel ban, and
+        * determines the outcome of an if statement around the whole section of ban checking code.
+        * 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
-         */
+        */
        virtual int OnCheckBan(userrec* user, chanrec* chan);
 
        /** 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
+        * @param user the user issuing the /STATS command
+        * @param results A string_list to append results into
         * @return 1 to block the /STATS from being processed by the core, 0 to allow it
         */
-       virtual int OnStats(char symbol, userrec* user);
+       virtual int OnStats(char symbol, userrec* user, string_list &results);
 
        /** Called whenever a change of a local users displayed host is attempted.
         * Return 1 to deny the host change, or 0 to allow it.
@@ -1168,7 +1217,7 @@ class Module : public Extensible
         * @param Number of characters to write
         * @return Number of characters actually written or 0 if you didn't handle the operation
         */
-       virtual int OnRawSocketWrite(int fd, char* buffer, int count);
+       virtual int OnRawSocketWrite(int fd, const char* buffer, int count);
 
        /** Called immediately before any socket is closed. When this event is called, shutdown()
         * has not yet been called on the socket.
@@ -1210,7 +1259,7 @@ class Module : public Extensible
  * output to users and other servers. All modules should instantiate at least one copy of this class,
  * and use its member functions to perform their tasks.
  */
-class Server : public classbase
+class Server : public Extensible
 {
  public:
        /** Default constructor.
@@ -1303,84 +1352,11 @@ class Server : public classbase
         */
        virtual void Log(int level, const std::string &s);
 
-       /** Sends a line of text down a TCP/IP socket.
-        * This method writes a line of text to an established socket, cutting it to 510 characters
-        * plus a carriage return and linefeed if required.
-        */
-       virtual void Send(int Socket, const std::string &s);
-
-       /** Sends text from the server to a socket.
-        * This method writes a line of text to an established socket, with the servername prepended
-        * as used by numerics (see RFC 1459)
-        */
-       virtual void SendServ(int Socket, const std::string &s);
-
-       /** Writes text to a channel, but from a server, including all.
-        * This can be used to send server notices to a group of users.
-        */
-       virtual void SendChannelServerNotice(const std::string &ServName, chanrec* Channel, const std::string &text);
-
-       /** Sends text from a user to a socket.
-        * This method writes a line of text to an established socket, with the given user's nick/ident
-        * /host combination prepended, as used in PRIVSG etc commands (see RFC 1459)
-        */
-       virtual void SendFrom(int Socket, userrec* User, const std::string &s);
-
-       /** Sends text from a user to another user.
-        * This method writes a line of text to a user, with a user's nick/ident
-        * /host combination prepended, as used in PRIVMSG etc commands (see RFC 1459)
-        * If you specify NULL as the source, then the data will originate from the
-        * local server, e.g. instead of:
-        *
-        * :user!ident@host TEXT
-        *
-        * The format will become:
-        *
-        * :localserver TEXT
-        *
-        * Which is useful for numerics and server notices to single users, etc.
-        */
-       virtual void SendTo(userrec* Source, userrec* Dest, const std::string &s);
-
-       /** Sends text from a user to a channel (mulicast).
-        * This method writes a line of text to a channel, with the given user's nick/ident
-        * /host combination prepended, as used in PRIVMSG etc commands (see RFC 1459). If the
-        * IncludeSender flag is set, then the text is also sent back to the user from which
-        * it originated, as seen in MODE (see RFC 1459).
-        */
-       virtual void SendChannel(userrec* User, chanrec* Channel, const std::string &s, bool IncludeSender);
-
-       /** Returns true if two users share a common channel.
-        * This method is used internally by the NICK and QUIT commands, and the Server::SendCommon
-        * method.
-        */
-       virtual bool CommonChannels(userrec* u1, userrec* u2);
-
-       /** Sends text from a user to one or more channels (mulicast).
-        * This method writes a line of text to all users which share a common channel with a given     
-        * user, with the user's nick/ident/host combination prepended, as used in PRIVMSG etc
-        * commands (see RFC 1459). If the IncludeSender flag is set, then the text is also sent
-        * back to the user from which it originated, as seen in NICK (see RFC 1459). Otherwise, it
-        * is only sent to the other recipients, as seen in QUIT.
-        */
-       virtual void SendCommon(userrec* User, const std::string &text, bool IncludeSender);
-
-       /** Sends a WALLOPS message.
-        * This method writes a WALLOPS message to all users with the +w flag, originating from the
-        * specified user.
-        */
-       virtual void SendWallops(userrec* User, const std::string &text);
-
        /** Returns true if a nick is valid.
         * Nicks for unregistered connections will return false.
         */
        virtual bool IsNick(const std::string &nick);
 
-       /** Returns a count of the number of users on a channel.
-        * This will NEVER be 0, as if the chanrec exists, it will have at least one user in the channel.
-        */
-       virtual int CountUsers(chanrec* c);
-
        /** Adds an InspTimer which will trigger at a future time
         */
        virtual void AddTimer(InspTimer* T);
@@ -1431,6 +1407,8 @@ class Server : public classbase
 
        virtual bool DelModeWatcher(ModeWatcher* mw);
 
+       virtual bool AddResolver(Resolver* r);
+
        /** Adds a command to the command table.
         * This allows modules to add extra commands into the command table. You must place a function within your
         * module which is is of type handlerfunc:
@@ -1471,64 +1449,8 @@ class Server : public classbase
         * your server in an unstable state!
         */
 
-       virtual void SendMode(char **parameters, int pcnt, userrec *user);
-       
-       /** Sends to all users matching a mode mask
-        * You must specify one or more usermodes as the first parameter. These can be RFC specified modes such as +i,
-        * or module provided modes, including ones provided by your own module.
-        * In the second parameter you must place a flag value which indicates wether the modes you have given will be
-        * logically ANDed or OR'ed. You may use one of either WM_AND or WM_OR.
-        * for example, if you were to use:
-        *
-        * Serv->SendToModeMask("xi", WM_OR, "m00");
-        *
-        * Then the text 'm00' will be sent to all users with EITHER mode x or i. Conversely if you used WM_AND, the
-        * user must have both modes set to receive the message.
-        */
-       virtual void SendToModeMask(const std::string &modes, int flags, const std::string &text);
-
-       /** Forces a user to join a channel.
-        * This is similar to svsjoin and can be used to implement redirection, etc.
-        * On success, the return value is a valid pointer to a chanrec* of the channel the user was joined to.
-        * On failure, the result is NULL.
-        */
-       virtual chanrec* JoinUserToChannel(userrec* user, const std::string &cname, const std::string &key);
-       
-       /** Forces a user to part a channel.
-        * This is similar to svspart and can be used to implement redirection, etc.
-        * Although the return value of this function is a pointer to a channel record, the returned data is
-        * undefined and should not be read or written to. This behaviour may be changed in a future version.
-        */
-       virtual chanrec* PartUserFromChannel(userrec* user, const std::string &cname, const std::string &reason);
-       
-       /** Forces a user nickchange.
-        * This command works similarly to SVSNICK, and can be used to implement Q-lines etc.
-        * If you specify an invalid nickname, the nick change will be dropped and the target user will receive
-        * the error numeric for it.
-        */
-       virtual void ChangeUserNick(userrec* user, const std::string &nickname);
-       
-       /** Forces a user to quit with the specified reason.
-        * To the user, it will appear as if they typed /QUIT themselves, except for the fact that this function
-        * may bypass the quit prefix specified in the config file.
-        *
-        * WARNING!
-        *
-        * Once you call this function, userrec* user will immediately become INVALID. You MUST NOT write to, or
-        * read from this pointer after calling the QuitUser method UNDER ANY CIRCUMSTANCES! The best course of
-        * action after calling this method is to immediately bail from your handler.
-        */
-       virtual void QuitUser(userrec* user, const std::string &reason);
+       virtual void SendMode(const char **parameters, int pcnt, userrec *user);
 
-       /** Makes a user kick another user, with the specified reason.
-        * If source is NULL, the server will peform the kick.
-        * @param The person or server (if NULL) performing the KICK
-        * @param target The person being kicked
-        * @param chan The channel to kick from
-        * @param reason The kick reason
-        */
-       virtual void KickUser(userrec* source, userrec* target, chanrec* chan, const std::string &reason);
-       
        /**  Matches text against a glob pattern.
         * Uses the ircd's internal matching function to match string against a globbing pattern, e.g. *!*@*.com
         * Returns true if the literal successfully matches the pattern, false if otherwise.
@@ -1547,7 +1469,7 @@ class Server : public classbase
         * used for privilage checks, etc.
         * @return True if the command exists
         */
-       virtual bool CallCommandHandler(const std::string &commandname, char** parameters, int pcnt, userrec* user);
+       virtual bool CallCommandHandler(const std::string &commandname, const char** parameters, int pcnt, userrec* user);
 
        /** This function returns true if the commandname exists, pcnt is equal to or greater than the number
         * of paramters the command requires, the user specified is allowed to execute the command, AND
@@ -1556,20 +1478,6 @@ class Server : public classbase
         */
        virtual bool IsValidModuleCommand(const std::string &commandname, int pcnt, userrec* user);
        
-       /** Change displayed hostname of a user.
-        * You should always call this method to change a user's host rather than writing directly to the
-        * dhost member of userrec, as any change applied via this method will be propogated to any
-        * linked servers.
-        */     
-       virtual void ChangeHost(userrec* user, const std::string &host);
-       
-       /** Change GECOS (fullname) of a user.
-        * You should always call this method to change a user's GECOS rather than writing directly to the
-        * fullname member of userrec, as any change applied via this method will be propogated to any
-        * linked servers.
-        */     
-       virtual void ChangeGECOS(userrec* user, const std::string &gecos);
-       
        /** Returns true if the servername you give is ulined.
         * ULined servers have extra privilages. They are allowed to change nicknames on remote servers,
         * change modes of clients which are on remote servers and set modes of channels where there are
@@ -1577,27 +1485,6 @@ class Server : public classbase
         */
        virtual bool IsUlined(const std::string &server);
        
-       /** Fetches the userlist of a channel. This function must be here and not a member of userrec or
-        * chanrec due to include constraints.
-        */
-       virtual chanuserlist GetUsers(chanrec* chan);
-
-       /** Remove a user's connection to the irc server, but leave their client in existence in the
-        * user hash. When you call this function, the user's file descriptor will be replaced with the
-        * value of FD_MAGIC_NUMBER and their old file descriptor will be closed. This idle client will
-        * remain until it is restored with a valid file descriptor, or is removed from IRC by an operator
-        * After this call, the pointer to user will be invalid.
-        */
-       virtual bool UserToPseudo(userrec* user, const std::string &message);
-
-       /** This user takes one user, and switches their file descriptor with another user, so that one user
-        * "becomes" the other. The user in 'alive' is booted off the server with the given message. The user
-        * referred to by 'zombie' should have previously been locked with Server::UserToPseudo, otherwise
-        * stale sockets and file descriptor leaks can occur. After this call, the pointer to alive will be
-        * invalid, and the pointer to zombie will be equivalent in effect to the old pointer to alive.
-        */
-       virtual bool PseudoToUser(userrec* alive, userrec* zombie, const std::string &message);
-
        /** Adds a G-line
         * The G-line is propogated to all of the servers in the mesh and enforced as soon as it is added.
         * The duration must be in seconds, however you can use the Server::CalcDuration method to convert
@@ -1824,49 +1711,62 @@ class FileReader : public classbase
        /** The file contents
         */
        file_cache fc;
+
+       unsigned long contentsize;
+
+       void CalcSize();
+
  public:
-        /** Default constructor.
-         * This method does not load any file into memory, you must use the LoadFile method
-         * after constructing the class this way.
-         */
-        FileReader();
-
-        /** Secondary constructor.
-         * This method initialises the class with a file loaded into it ready for GetLine and
-         * and other methods to be called. If the file could not be loaded, FileReader::FileSize
-         * returns 0.
-         */
-        FileReader(const std::string &filename);
-
-        /** Default destructor.
-         * This deletes the memory allocated to the file.
-         */
-        ~FileReader();
-
-        /** Used to load a file.
-         * This method loads a file into the class ready for GetLine and
-         * and other methods to be called. If the file could not be loaded, FileReader::FileSize
-         * returns 0.
-         */
-        void LoadFile(const std::string &filename);
-
-        /** Returns true if the file exists
-         * 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.
-         */
-        std::string GetLine(int x);
-
-        /** Returns the size of the file in lines.
-         * This method returns the number of lines in the read file. If it is 0, no lines have been
-         * read into memory, either because the file is empty or it does not exist, or cannot be
-         * opened due to permission problems.
-         */
-        int FileSize();
+       /** Default constructor.
+        * This method does not load any file into memory, you must use the LoadFile method
+        * after constructing the class this way.
+        */
+       FileReader();
+
+       /** Secondary constructor.
+        * This method initialises the class with a file loaded into it ready for GetLine and
+        * and other methods to be called. If the file could not be loaded, FileReader::FileSize
+        * returns 0.
+        */
+       FileReader(const std::string &filename);
+
+       /** Default destructor.
+        * This deletes the memory allocated to the file.
+        */
+       ~FileReader();
+
+       /** Used to load a file.
+        * This method loads a file into the class ready for GetLine and
+        * and other methods to be called. If the file could not be loaded, FileReader::FileSize
+        * returns 0.
+        */
+       void LoadFile(const std::string &filename);
+
+       /** Returns the whole content of the file as std::string
+        */
+       std::string Contents();
+
+       /** Returns the entire size of the file as std::string
+        */
+       unsigned long ContentSize();
+
+       /** Returns true if the file exists
+        * 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.
+        */
+       std::string GetLine(int x);
+
+       /** Returns the size of the file in lines.
+        * This method returns the number of lines in the read file. If it is 0, no lines have been
+        * read into memory, either because the file is empty or it does not exist, or cannot be
+        * opened due to permission problems.
+        */
+       int FileSize();
 };