summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mode.h3
-rw-r--r--include/users.h6
-rw-r--r--src/mode.cpp5
-rw-r--r--src/users.cpp15
4 files changed, 28 insertions, 1 deletions
diff --git a/include/mode.h b/include/mode.h
index d28b03529..2875d853e 100644
--- a/include/mode.h
+++ b/include/mode.h
@@ -171,6 +171,9 @@ class ModeHandler : public Extensible
/** Get number of items with this mode set on them
*/
virtual unsigned int GetCount();
+ /** Adjust usage count returned by GetCount
+ */
+ virtual void ChangeCount(int modifier);
/**
* Get the 'value' of this modes prefix.
* determines which to display when there are multiple.
diff --git a/include/users.h b/include/users.h
index 719af2271..6e79cf285 100644
--- a/include/users.h
+++ b/include/users.h
@@ -231,6 +231,12 @@ class userrec : public connection
char* cached_hostip;
char* cached_makehost;
char* cached_fullrealhost;
+
+ /** When we erase the user (in the destructor),
+ * we call this method to subtract one from all
+ * mode characters this user is making use of.
+ */
+ void DecrementModes();
public:
/** Resolvers for looking up this users IP address
* This will occur if and when res_reverse completes.
diff --git a/src/mode.cpp b/src/mode.cpp
index 68d7e0bd0..62dd61f4c 100644
--- a/src/mode.cpp
+++ b/src/mode.cpp
@@ -76,6 +76,11 @@ unsigned int ModeHandler::GetCount()
return 0;
}
+void ModeHandler::ChangeCount(int modifier)
+{
+ count += modifier;
+}
+
ModeType ModeHandler::GetModeType()
{
return m_type;
diff --git a/src/users.cpp b/src/users.cpp
index b4f25a75e..c01c4e4b6 100644
--- a/src/users.cpp
+++ b/src/users.cpp
@@ -289,6 +289,19 @@ const char* userrec::FormatModes()
return data;
}
+void userrec::DecrementModes()
+{
+ for (int n = 0; n < 64; n++)
+ {
+ if (modes[n])
+ {
+ ModeHandler* mh = ServerInstance->Modes->FindMode(n+65, MODETYPE_USER);
+ if (mh)
+ mh->ChangeCount(-1);
+ }
+ }
+}
+
userrec::userrec(InspIRCd* Instance) : ServerInstance(Instance)
{
ServerInstance->Log(DEBUG,"userrec::userrec(): Instance: %08x",ServerInstance);
@@ -317,7 +330,7 @@ userrec::userrec(InspIRCd* Instance) : ServerInstance(Instance)
userrec::~userrec()
{
this->InvalidateCache();
-
+ this->DecrementModes();
if (ip)
{
clonemap::iterator x = ServerInstance->local_clones.find(this->GetIPString());