#include "inspircd.h"
+#include "modules/stats.h"
+#include "modules/who.h"
+#include "modules/whois.h"
/** Handles user mode +H
*/
oper = true;
}
- ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string& parameter, bool adding)
+ ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string& parameter, bool adding) CXX11_OVERRIDE
{
if (SimpleUserModeHandler::OnModeChange(source, dest, channel, parameter, adding) == MODEACTION_DENY)
return MODEACTION_DENY;
}
};
-class ModuleHideOper : public Module, public Whois::LineEventListener
+class ModuleHideOper
+ : public Module
+ , public Stats::EventListener
+ , public Who::EventListener
+ , public Whois::LineEventListener
{
+ private:
HideOper hm;
bool active;
+
public:
ModuleHideOper()
- : Whois::LineEventListener(this)
+ : Stats::EventListener(this)
+ , Who::EventListener(this)
+ , Whois::LineEventListener(this)
, hm(this)
, active(false)
{
ModResult OnNumeric(User* user, const Numeric::Numeric& numeric) CXX11_OVERRIDE
{
- if (numeric.GetNumeric() != 252 || active || user->HasPrivPermission("users/auspex"))
+ if (numeric.GetNumeric() != RPL_LUSEROP || active || user->HasPrivPermission("users/auspex"))
return MOD_RES_PASSTHRU;
// If there are no visible operators then we shouldn't send the numeric.
if (opercount)
{
active = true;
- user->WriteNumeric(252, opercount, "operator(s) online");
+ user->WriteNumeric(RPL_LUSEROP, opercount, "operator(s) online");
active = false;
}
return MOD_RES_DENY;
return MOD_RES_PASSTHRU;
}
- ModResult OnSendWhoLine(User* source, const std::vector<std::string>& params, User* user, Membership* memb, Numeric::Numeric& numeric) CXX11_OVERRIDE
+ ModResult OnWhoLine(const Who::Request& request, LocalUser* source, User* user, Membership* memb, Numeric::Numeric& numeric) CXX11_OVERRIDE
{
if (user->IsModeSet(hm) && !source->HasPrivPermission("users/auspex"))
{
// Hide the line completely if doing a "/who * o" query
- if ((params.size() > 1) && (params[1].find('o') != std::string::npos))
+ if (request.flags['o'])
return MOD_RES_DENY;
+ size_t flag_index = 5;
+ if (request.whox)
+ {
+ // We only need to fiddle with the flags if they are present.
+ if (!request.whox_fields['f'])
+ return MOD_RES_PASSTHRU;
+
+ // WHOX makes this a bit tricky as we need to work out the parameter which the flags are in.
+ flag_index = 0;
+ static const char* flags = "tcuihsn";
+ for (size_t i = 0; i < strlen(flags); ++i)
+ {
+ if (request.whox_fields[flags[i]])
+ flag_index += 1;
+ }
+ }
+
// hide the "*" that marks the user as an oper from the /WHO line
// #chan ident localhost insp22.test nick H@ :0 Attila
- if (numeric.GetParams().size() < 6)
+ if (numeric.GetParams().size() <= flag_index)
return MOD_RES_PASSTHRU;
- std::string& param = numeric.GetParams()[5];
+ std::string& param = numeric.GetParams()[flag_index];
const std::string::size_type pos = param.find('*');
if (pos != std::string::npos)
param.erase(pos, 1);
if (!oper->server->IsULine() && (stats.GetSource()->IsOper() || !oper->IsModeSet(hm)))
{
LocalUser* lu = IS_LOCAL(oper);
- stats.AddRow(249, oper->nick + " (" + oper->ident + "@" + oper->dhost + ") Idle: " +
+ stats.AddRow(249, oper->nick + " (" + oper->ident + "@" + oper->GetDisplayedHost() + ") Idle: " +
(lu ? ConvToStr(ServerInstance->Time() - lu->idle_lastmsg) + " secs" : "unavailable"));
count++;
}