+ /** A list of channels the user has a pending invite to.
+ * Upon INVITE channels are added, and upon JOIN, the
+ * channels are removed from this list.
+ */
+ InvitedList invites;
+
+ public:
+ LocalUser(int fd, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server);
+ CullResult cull();
+
+ /** Stats counter for bytes inbound
+ */
+ int bytes_in;
+
+ /** Stats counter for bytes outbound
+ */
+ int bytes_out;
+
+ /** Stats counter for commands inbound
+ */
+ int cmds_in;
+
+ /** Stats counter for commands outbound
+ */
+ int cmds_out;
+
+ /** Password specified by the user when they registered (if any).
+ * This is stored even if the <connect> block doesnt need a password, so that
+ * modules may check it.
+ */
+ std::string password;
+
+ /** Contains a pointer to the connect class a user is on from
+ */
+ reference<ConnectClass> MyClass;
+
+ ConnectClass* GetClass();
+
+ /** Call this method to find the matching <connect> for a user, and to check them against it.
+ */
+ void CheckClass();
+
+ /** Server address and port that this user is connected to.
+ */
+ irc::sockets::sockaddrs server_sa;
+
+ /**
+ * @return The port number of this user.
+ */
+ int GetServerPort();
+
+ /** Used by PING checking code
+ */
+ time_t nping;
+
+ /** This value contains how far into the penalty threshold the user is. Once its over
+ * the penalty threshold then commands are held and processed on-timer.
+ */
+ int Penalty;
+
+ /** Stored reverse lookup from res_forward. Should not be used after resolution.
+ */
+ std::string stored_host;
+
+ /** Starts a DNS lookup of the user's IP.
+ * This will cause two UserResolver classes to be instantiated.
+ * When complete, these objects set User::dns_done to true.
+ */
+ void StartDNSLookup();
+
+ /** Use this method to fully connect a user.
+ * This will send the message of the day, check G/K/E lines, etc.
+ */
+ void FullConnect();
+
+ /** Set the connect class to which this user belongs to.
+ * @param explicit_name Set this string to tie the user to a specific class name. Otherwise, the class is fitted by checking <connect> tags from the configuration file.
+ * @return A reference to this user's current connect class.
+ */
+ void SetClass(const std::string &explicit_name = "");
+
+ void OnDataReady();
+ void SendText(const std::string& line);
+ void Write(const std::string& text);
+ void Write(const char*, ...) CUSTOM_PRINTF(2, 3);
+
+ /** 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, the user will be removed, and further buffer adds will be dropped.
+ * @param data The data to add to the write buffer
+ */
+ void AddWriteBuf(const std::string &data);
+
+ /** Returns the list of channels this user has been invited to but has not yet joined.
+ * @return A list of channels the user is invited to
+ */
+ InvitedList* GetInviteList();
+
+ /** Returns true if a user is invited to a channel.
+ * @param channel A channel name to look up
+ * @return True if the user is invited to the given channel
+ */
+ bool IsInvited(const irc::string &channel);
+
+ /** Adds a channel to a users invite list (invites them to a channel)
+ * @param channel A channel name to add
+ * @param timeout When the invite should expire (0 == never)
+ */
+ void InviteTo(const irc::string &channel, time_t timeout);
+
+ /** Removes a channel from a users invite list.
+ * This member function is called on successfully joining an invite only channel
+ * to which the user has previously been invited, to clear the invitation.
+ * @param channel The channel to remove the invite to
+ */
+ void RemoveInvite(const irc::string &channel);
+
+ /** Returns true or false for if a user can execute a privilaged oper command.
+ * This is done by looking up their oper type from User::oper, then referencing
+ * this to their oper classes and checking the commands they can execute.
+ * @param command A command (should be all CAPS)
+ * @return True if this user can execute the command
+ */
+ bool HasPermission(const std::string &command);
+
+ /** Returns true if a user has a given permission.
+ * This is used to check whether or not users may perform certain actions which admins may not wish to give to
+ * all operators, yet are not commands. An example might be oper override, mass messaging (/notice $*), etc.
+ *
+ * @param privstr The priv to chec, e.g. "users/override/topic". These are loaded free-form from the config file.
+ * @param noisy If set to true, the user is notified that they do not have the specified permission where applicable. If false, no notification is sent.
+ * @return True if this user has the permission in question.