]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_hideoper.cpp
Add SERVICE_CUSTOM for services managed by a module
[user/henk/code/inspircd.git] / src / modules / m_hideoper.cpp
index 5b226f3b8baf733036314a2b814130ca552342b8..9f40d702e98acdae8edd6c35786357c7a4c1f743 100644 (file)
@@ -32,12 +32,13 @@ class HideOper : public SimpleUserModeHandler
        }
 };
 
-class ModuleHideOper : public Module
+class ModuleHideOper : public Module, public Whois::LineEventListener
 {
        HideOper hm;
  public:
        ModuleHideOper()
-               : hm(this)
+               : Whois::LineEventListener(this)
+               , hm(this)
        {
        }
 
@@ -46,7 +47,7 @@ class ModuleHideOper : public Module
                return Version("Provides support for hiding oper status with user mode +H", VF_VENDOR);
        }
 
-       ModResult OnWhoisLine(User* user, User* dest, int &numeric, std::string &text) CXX11_OVERRIDE
+       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
                 * person doing the WHOIS is not an oper
@@ -54,10 +55,10 @@ class ModuleHideOper : public Module
                if (numeric != 313)
                        return MOD_RES_PASSTHRU;
 
-               if (!dest->IsModeSet(hm))
+               if (!whois.GetTarget()->IsModeSet(hm))
                        return MOD_RES_PASSTHRU;
 
-               if (!user->HasPrivPermission("users/auspex"))
+               if (!whois.GetSource()->HasPrivPermission("users/auspex"))
                        return MOD_RES_DENY;
 
                return MOD_RES_PASSTHRU;
@@ -68,7 +69,11 @@ class ModuleHideOper : public Module
                if (user->IsModeSet(hm) && !source->HasPrivPermission("users/auspex"))
                {
                        // hide the "*" that marks the user as an oper from the /WHO line
-                       std::string::size_type pos = line.find("*");
+                       std::string::size_type spcolon = line.find(" :");
+                       if (spcolon == std::string::npos)
+                               return; // Another module hid the user completely
+                       std::string::size_type sp = line.rfind(' ', spcolon-1);
+                       std::string::size_type pos = line.find('*', sp);
                        if (pos != std::string::npos)
                                line.erase(pos, 1);
                        // hide the line completely if doing a "/who * o" query