+ /** Returns true or false for if a user can execute a privilaged oper command.
+ * This is done by looking up their oper type from userrec::oper, then referencing
+ * this to their oper classes and checking the commands they can execute.
+ */
+ bool HasPermission(const std::string &command);
+
+ /** Calls read() to read some data for this user using their fd.
+ */
+ int ReadData(void* buffer, size_t size);
+
+ /** This method adds data to the buffer of the user.
+ * The buffer can grow to any size within limits of the available memory,
+ * managed by the size of a std::string, however if any individual line in
+ * the buffer grows over 600 bytes in length (which is 88 chars over the
+ * RFC-specified limit per line) then the method will return false and the
+ * text will not be inserted.
+ */
+ bool AddBuffer(const std::string &a);
+
+ /** This method returns true if the buffer contains at least one carriage return
+ * character (e.g. one complete line may be read)
+ */
+ bool BufferIsReady();
+
+ /** This function clears the entire buffer by setting it to an empty string.
+ */
+ void ClearBuffer();
+
+ /** This method returns the first available string at the tail end of the buffer
+ * and advances the tail end of the buffer past the string. This means it is
+ * a one way operation in a similar way to strtok(), and multiple calls return
+ * multiple lines if they are available. The results of this function if there
+ * are no lines to be read are unknown, always use BufferIsReady() to check if
+ * it is ok to read the buffer before calling GetBuffer().
+ */
+ std::string GetBuffer();
+
+ /** Sets the write error for a connection. This is done because the actual disconnect
+ * of a client may occur at an inopportune time such as half way through /LIST output.
+ * The WriteErrors of clients are checked at a more ideal time (in the mainloop) and
+ * errored clients purged.
+ */
+ void SetWriteError(const std::string &error);
+
+ /** Returns the write error which last occured on this connection or an empty string
+ * if none occured.
+ */
+ const char* GetWriteError();
+
+ /** Adds to the user's write buffer.
+ * You may add any amount of text up to this users sendq value, if you exceed the
+ * sendq value, SetWriteError() will be called to set the users error string to
+ * "SendQ exceeded", and further buffer adds will be dropped.
+ */
+ void AddWriteBuf(const std::string &data);
+
+ /** Flushes as much of the user's buffer to the file descriptor as possible.
+ * This function may not always flush the entire buffer, rather instead as much of it
+ * as it possibly can. If the send() call fails to send the entire buffer, the buffer
+ * position is advanced forwards and the rest of the data sent at the next call to
+ * this method.
+ */
+ void FlushWriteBuf();
+
+ /** Returns the list of channels this user has been invited to but has not yet joined.
+ */
+ InvitedList* GetInviteList();
+
+ /** Creates a wildcard host.
+ * Takes a buffer to use and fills the given buffer with the host in the format *!*@hostname
+ */
+ char* MakeWildHost();
+
+ /** Creates a host.
+ * Takes a buffer to use and fills the given buffer with the host in the format nick!user@host
+ */
+ void MakeHost(char* nhost);
+
+ /** Shuts down and closes the user's socket
+ */
+ void CloseSocket();
+
+ /** Default destructor
+ */
+ virtual ~userrec();
+
+#ifdef THREADED_DNS
+ /** Thread used for threaded lookups
+ */
+ pthread_t dnsthread;
+#endif
+};
+
+/** Used to hold WHOWAS information
+ */
+class WhoWasGroup
+{
+ public:
+ char* host;
+ char* dhost;
+ char* ident;
+ const char* server;
+ char* gecos;
+ time_t signon;
+
+ WhoWasGroup(userrec* user);
+ ~WhoWasGroup();