diff options
author | Attila Molnar <attilamolnar@hush.com> | 2016-02-12 17:35:55 +0100 |
---|---|---|
committer | Attila Molnar <attilamolnar@hush.com> | 2016-02-12 17:35:55 +0100 |
commit | 9d81896b74fda1d2cd40723dcec33bf75f843038 (patch) | |
tree | 166a64402a17e889d1d8fb348709a9b9e99aa7d7 /src/modules/m_hideoper.cpp | |
parent | dbb7672c6ae643a997098566f59882d5e4632c88 (diff) | |
parent | 4e70a39299df540d8fece60b33ac75f31624b3ed (diff) |
Merge pull request #1071 from SaberUK/insp20+fix-lusers
[2.0] Fix hidden operators being shown in LUSERS.
Diffstat (limited to 'src/modules/m_hideoper.cpp')
-rw-r--r-- | src/modules/m_hideoper.cpp | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/src/modules/m_hideoper.cpp b/src/modules/m_hideoper.cpp index 88b0c4cdf..9d50bd2e5 100644 --- a/src/modules/m_hideoper.cpp +++ b/src/modules/m_hideoper.cpp @@ -28,25 +28,43 @@ class HideOper : public SimpleUserModeHandler { public: + size_t opercount; + HideOper(Module* Creator) : SimpleUserModeHandler(Creator, "hideoper", 'H') + , opercount(0) { oper = true; } + + ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string& parameter, bool adding) + { + if (SimpleUserModeHandler::OnModeChange(source, dest, channel, parameter, adding) == MODEACTION_DENY) + return MODEACTION_DENY; + + if (adding) + opercount++; + else + opercount--; + + return MODEACTION_ALLOW; + } }; class ModuleHideOper : public Module { HideOper hm; + bool active; public: ModuleHideOper() : hm(this) + , active(false) { } void init() { ServerInstance->Modules->AddService(hm); - Implementation eventlist[] = { I_OnWhoisLine, I_OnSendWhoLine, I_OnStats }; + Implementation eventlist[] = { I_OnWhoisLine, I_OnSendWhoLine, I_OnStats, I_OnNumeric, I_OnUserQuit }; ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation)); } @@ -60,6 +78,28 @@ class ModuleHideOper : public Module return Version("Provides support for hiding oper status with user mode +H", VF_VENDOR); } + void OnUserQuit(User* user, const std::string&, const std::string&) + { + if (user->IsModeSet('H')) + hm.opercount--; + } + + ModResult OnNumeric(User* user, unsigned int numeric, const std::string& text) + { + if (numeric != 252 || active || user->HasPrivPermission("users/auspex")) + return MOD_RES_PASSTHRU; + + // If there are no visible operators then we shouldn't send the numeric. + size_t opercount = ServerInstance->Users->all_opers.size() - hm.opercount; + if (opercount) + { + active = true; + user->WriteNumeric(252, "%s %lu :operator(s) online", user->nick.c_str(), opercount); + active = false; + } + return MOD_RES_DENY; + } + ModResult OnWhoisLine(User* user, User* dest, int &numeric, std::string &text) { /* Dont display numeric 313 (RPL_WHOISOPER) if they have +H set and the |