From 0eebbc2543c84802abaf107e04bfb5c71c0b6f8c Mon Sep 17 00:00:00 2001 From: Sadie Powell Date: Mon, 20 Feb 2023 19:49:05 +0000 Subject: Avoid setting -x+x when a reset cloak has not changed. --- src/modules/m_cloak.cpp | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) (limited to 'src/modules/m_cloak.cpp') 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 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); } }; -- cgit v1.3.1-10-gc9f91