diff options
author | Attila Molnar <attilamolnar@hush.com> | 2016-02-22 12:52:18 +0100 |
---|---|---|
committer | Attila Molnar <attilamolnar@hush.com> | 2016-02-22 12:52:18 +0100 |
commit | 0b63ccd0b5cb26883d6becb196fb98e4f95d0397 (patch) | |
tree | d9c660b46e106d76c5953579eca45e49c4486cbf /src/modules/m_hideoper.cpp | |
parent | 7b6bd133ca4472f6cb8058d5e34e3c8b2af7e99a (diff) | |
parent | 1624ab03b86542a2cb02eda809303144974755f3 (diff) |
Merge insp20
Diffstat (limited to 'src/modules/m_hideoper.cpp')
-rw-r--r-- | src/modules/m_hideoper.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/modules/m_hideoper.cpp b/src/modules/m_hideoper.cpp index 9f40d702e..03f6745ee 100644 --- a/src/modules/m_hideoper.cpp +++ b/src/modules/m_hideoper.cpp @@ -26,19 +26,37 @@ 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, public Whois::LineEventListener { HideOper hm; + bool active; public: ModuleHideOper() : Whois::LineEventListener(this) , hm(this) + , active(false) { } @@ -47,6 +65,28 @@ class ModuleHideOper : public Module, public Whois::LineEventListener return Version("Provides support for hiding oper status with user mode +H", VF_VENDOR); } + void OnUserQuit(User* user, const std::string&, const std::string&) CXX11_OVERRIDE + { + if (user->IsModeSet(hm)) + hm.opercount--; + } + + ModResult OnNumeric(User* user, unsigned int numeric, const std::string& text) CXX11_OVERRIDE + { + 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, "%lu :operator(s) online", opercount); + active = false; + } + return MOD_RES_DENY; + } + ModResult OnWhoisLine(Whois::Context& whois, unsigned int& numeric, std::string& text) CXX11_OVERRIDE { /* Dont display numeric 313 (RPL_WHOISOPER) if they have +H set and the |