diff options
| author | 2023-02-20 19:49:05 +0000 | |
|---|---|---|
| committer | 2023-02-20 19:49:05 +0000 | |
| commit | 0eebbc2543c84802abaf107e04bfb5c71c0b6f8c (patch) | |
| tree | 1a13c5f65ebec9ba7cba898da362fdc09dddadb8 /src/modules/m_cloak.cpp | |
| parent | Merge the servprotect module into the services module. (diff) | |
| download | inspircd++-0eebbc2543c84802abaf107e04bfb5c71c0b6f8c.tar.gz inspircd++-0eebbc2543c84802abaf107e04bfb5c71c0b6f8c.tar.bz2 inspircd++-0eebbc2543c84802abaf107e04bfb5c71c0b6f8c.zip | |
Avoid setting -x+x when a reset cloak has not changed.
Diffstat (limited to 'src/modules/m_cloak.cpp')
| -rw-r--r-- | src/modules/m_cloak.cpp | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/src/modules/m_cloak.cpp b/src/modules/m_cloak.cpp index 27c3e7352..b6180419e 100644 --- a/src/modules/m_cloak.cpp +++ b/src/modules/m_cloak.cpp @@ -89,6 +89,12 @@ private: // Holds the list of cloaks for a user. ListExtItem<Cloak::List> ext; + std::string GetFrontCloak(LocalUser* user) + { + auto* cloaks = GetCloaks(user); + return cloaks ? cloaks->front() : ""; + } + public: CloakAPI(Module* Creator, CloakMethodList& cm, ModeHandler* mh) : Cloak::APIBase(Creator) @@ -122,14 +128,21 @@ public: void ResetCloaks(LocalUser* user, bool resetdisplay) override { + const std::string oldcloak = GetFrontCloak(user); ext.Unset(user); - if (resetdisplay && user->IsModeSet(cloakmode)) - { - Modes::ChangeList changelist; - changelist.push_remove(cloakmode); + + if (!resetdisplay || !user->IsModeSet(cloakmode)) + return; // Not resetting the display or not cloaked. + + const std::string newcloak = GetFrontCloak(user); + if (oldcloak == newcloak) + return; // New front cloak is the same. + + Modes::ChangeList changelist; + changelist.push_remove(cloakmode); + if (!newcloak.empty()) changelist.push_add(cloakmode); - ServerInstance->Modes.Process(ServerInstance->FakeClient, nullptr, user, changelist); - } + ServerInstance->Modes.Process(ServerInstance->FakeClient, nullptr, user, changelist); } }; |
