diff options
-rw-r--r-- | include/usermanager.h | 5 | ||||
-rw-r--r-- | include/users.h | 1 | ||||
-rw-r--r-- | src/usermanager.cpp | 16 | ||||
-rw-r--r-- | src/users.cpp | 2 |
4 files changed, 18 insertions, 6 deletions
diff --git a/include/usermanager.h b/include/usermanager.h index 605b841bb..670e51dd5 100644 --- a/include/usermanager.h +++ b/include/usermanager.h @@ -56,6 +56,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 */ diff --git a/include/users.h b/include/users.h index 03540018b..fa346a329 100644 --- a/include/users.h +++ b/include/users.h @@ -720,7 +720,6 @@ class CoreExport LocalUser : public User, public insp::intrusive_list_node<Local */ unsigned int CommandFloodPenalty; - static already_sent_t already_sent_id; already_sent_t already_sent; /** Check if the user matches a G or K line, and disconnect them if they do. diff --git a/src/usermanager.cpp b/src/usermanager.cpp index c593e149f..d81b83d20 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -49,7 +49,8 @@ namespace } UserManager::UserManager() - : unregistered_count(0) + : already_sent_id(0) + , unregistered_count(0) { } @@ -281,7 +282,6 @@ void UserManager::ServerNoticeAll(const char* text, ...) void UserManager::GarbageCollect() { // Reset the already_sent IDs so we don't wrap it around and drop a message - LocalUser::already_sent_id = 0; for (LocalList::const_iterator i = local_users.begin(); i != local_users.end(); ++i) (**i).already_sent = 0; } @@ -371,5 +371,15 @@ void UserManager::DoBackgroundUserStuff() already_sent_t UserManager::NextAlreadySentId() { - return ++LocalUser::already_sent_id; + if (++already_sent_id == 0) + { + // Wrapped around, reset the already_sent ids of all users + already_sent_id = 1; + for (LocalList::iterator i = local_users.begin(); i != local_users.end(); ++i) + { + LocalUser* user = *i; + user->already_sent = 0; + } + } + return already_sent_id; } diff --git a/src/users.cpp b/src/users.cpp index 258544312..93fd8d065 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -26,8 +26,6 @@ #include "inspircd.h" #include "xline.h" -already_sent_t LocalUser::already_sent_id = 0; - bool User::IsNoticeMaskSet(unsigned char sm) { if (!isalpha(sm)) |