]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/usermanager.h
Use IsCTCP in blockcolor for ignoring CTCPs.
[user/henk/code/inspircd.git] / include / usermanager.h
index a67f90224d628839eda4c05a6f7feac53e08cd11..e73d541ee81b69225895c02c2972f3644a8355de 100644 (file)
@@ -1,6 +1,13 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
+ *   Copyright (C) 2015 Adam <Adam@anope.org>
+ *   Copyright (C) 2012-2016 Attila Molnar <attilamolnar@hush.com>
+ *   Copyright (C) 2012-2013, 2017, 2019-2020 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2012 Robby <robby@chatbelgie.be>
+ *   Copyright (C) 2010 Craig Edwards <brain@inspircd.org>
+ *   Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
+ *   Copyright (C) 2008 Thomas Stagner <aquanight@inspircd.org>
  *   Copyright (C) 2008 Robin Burchell <robin+git@viroteck.net>
  *
  * This file is part of InspIRCd.  InspIRCd is free software: you can
@@ -39,6 +46,9 @@ class CoreExport UserManager : public fakederef<UserManager>
         */
        typedef std::vector<User*> OperList;
 
+       /** A list containing users who are on a U-lined servers. */
+       typedef std::vector<User*> ULineList;
+
        /** A list holding local users
        */
        typedef insp::intrusive_list<LocalUser> LocalList;
@@ -56,6 +66,11 @@ class CoreExport UserManager : public fakederef<UserManager>
         */
        LocalList local_users;
 
+       /** Last used already sent id, used when sending messages to neighbors to help determine whether the message has
+        * been sent to a particular user or not. See User::ForEachNeighbor() for more info.
+        */
+       already_sent_t already_sent_id;
+
  public:
        /** Constructor, initializes variables
         */
@@ -65,12 +80,11 @@ class CoreExport UserManager : public fakederef<UserManager>
         */
        ~UserManager();
 
-       /** Client list, a hash_map containing all clients, local and remote
+       /** Nickname string -> User* map. Contains all users, including unregistered ones.
         */
        user_hash clientlist;
 
-       /** Client list stored by UUID. Contains all clients, and is updated
-        * automatically by the constructor and destructor of User.
+       /** UUID -> User* map. Contains all users, including unregistered ones.
         */
        user_hash uuidlist;
 
@@ -78,43 +92,37 @@ class CoreExport UserManager : public fakederef<UserManager>
         */
        OperList all_opers;
 
+       /** A list of users on U-lined servers. */
+       ULineList all_ulines;
+
        /** Number of unregistered users online right now.
         * (Unregistered means before USER/NICK/dns)
         */
        unsigned int unregistered_count;
 
-       /**
-        * Reset the already_sent IDs so we don't wrap it around and drop a message
-        * Also removes all expired invites
-     */
-       void GarbageCollect();
-
-       /** Perform background user events such as PING checks
+       /** Perform background user events for all local users such as PING checks, registration timeouts,
+        * penalty management and recvq processing for users who have data in their recvq due to throttling.
         */
        void DoBackgroundUserStuff();
 
-       /** Returns true when all modules have done pre-registration checks on a user
-        * @param user The user to verify
-        * @return True if all modules have finished checking this user
-        */
-       bool AllModulesReportReady(LocalUser* user);
-
-       /** Add a client to the system.
-        * This will create a new User, insert it into the user_hash,
-        * initialize it as not yet registered, and add it to the socket engine.
-        * @param socket The socket id (file descriptor) this user is on
-        * @param via The socket that this user connected using
+       /** Handle a client connection.
+        * Creates a new LocalUser object, inserts it into the appropriate containers,
+        * initializes it as not yet registered, and adds it to the socket engine.
+        *
+        * The new user may immediately be quit after being created, for example if the user limit
+        * is reached or if the user is banned.
+        * @param socket File descriptor of the connection
+        * @param via Listener socket that this user connected to
         * @param client The IP address and client port of the user
         * @param server The server IP address and port used by the user
-        * @return This function has no return value, but a call to AddClient may remove the user.
         */
        void AddUser(int socket, ListenSocket* via, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server);
 
-       /** Disconnect a user gracefully
+       /** Disconnect a user gracefully.
+        * When this method returns the user provided will be quit, but the User object will continue to be valid and will be deleted at the end of the current main loop iteration.
         * @param user The user to remove
         * @param quitreason The quit reason to show to normal users
         * @param operreason The quit reason to show to opers, can be NULL if same as quitreason
-        * @return Although this function has no return type, on exit the user provided will no longer exist.
         */
        void QuitUser(User* user, const std::string& quitreason, const std::string* operreason = NULL);
 
@@ -130,7 +138,7 @@ class CoreExport UserManager : public fakederef<UserManager>
         */
        void RemoveCloneCounts(User *user);
 
-       /** Rebuild clone counts
+       /** Rebuild clone counts. Required when \<cidr> settings change.
         */
        void RehashCloneCounts();
 
@@ -142,7 +150,7 @@ class CoreExport UserManager : public fakederef<UserManager>
         */
        const CloneCounts& GetCloneCounts(User* user) const;
 
-       /** Return a map containg IP addresses and their clone counts
+       /** Return a map containing IP addresses and their clone counts
         * @return The clone count map
         */
        const CloneMap& GetCloneMap() const { return clonemap; }
@@ -155,7 +163,7 @@ class CoreExport UserManager : public fakederef<UserManager>
        /** Return a count of fully registered connections on the network
         * @return The number of registered users on the network
         */
-       unsigned int RegisteredUserCount() { return this->clientlist.size() - this->UnregisteredUserCount(); }
+       unsigned int RegisteredUserCount() { return this->clientlist.size() - this->UnregisteredUserCount() - this->ULineCount(); }
 
        /** Return a count of opered (umode +o) users on the network
         * @return The number of opers on the network
@@ -167,6 +175,11 @@ class CoreExport UserManager : public fakederef<UserManager>
         */
        unsigned int UnregisteredUserCount() const { return this->unregistered_count; }
 
+       /** Return a count of users on a u-lined servers.
+        * @return The number of users on u-lined servers.
+        */
+       unsigned int ULineCount() const { return this->all_ulines.size(); }
+
        /** Return a count of local registered users
         * @return The number of registered local users
         */
@@ -187,4 +200,9 @@ class CoreExport UserManager : public fakederef<UserManager>
         * @param ... The format arguments
         */
        void ServerNoticeAll(const char* text, ...) CUSTOM_PRINTF(2, 3);
+
+       /** Retrieves the next already sent id, guaranteed to be not equal to any user's already_sent field
+        * @return Next already_sent id
+        */
+       already_sent_t NextAlreadySentId();
 };