Add Who::Request::GetFlagIndex to get field index

Replaces the dirty logic in m_hideoper and m_namesx
This commit is contained in:
linuxdaemon 2019-03-12 09:48:28 -05:00 committed by Peter Powell
parent f87b72b76f
commit dfb1e0da78
4 changed files with 39 additions and 32 deletions

View File

@ -71,6 +71,17 @@ class Who::Request
/** A user specified label for the WHOX response. */
std::string whox_querytype;
/** Get the index in the response parameters for the different data fields
*
* The fields 'r' (realname) and 'd' (hops) will always be missing in a non-WHOX
* query, because WHOX splits them to 2 fields, where old WHO has them as one.
*
* @param flag The field name to look for
* @param out The index will be stored in this value
* @return True if the field is available, false otherwise
*/
virtual bool GetFlagIndex(char flag, size_t& out) const = 0;
protected:
Request()
: fuzzy_match(false)

View File

@ -34,8 +34,19 @@ enum
RPL_WHOSPCRPL = 354
};
static const char whox_field_order[] = "tcuihsnfdlaor";
static const char who_field_order[] = "cuhsnf";
struct WhoData : public Who::Request
{
std::string query_flag_order;
bool GetFlagIndex(char flag, size_t& out) const CXX11_OVERRIDE
{
out = query_flag_order.find(flag);
return out != std::string::npos;
}
WhoData(const CommandBase::Params& parameters)
{
// Find the matchtext and swap the 0 for a * so we can use InspIRCd::Match on it.
@ -74,6 +85,17 @@ struct WhoData : public Who::Request
current_bitset->set(chr);
}
}
if (whox)
{
for (const char *c = whox_field_order; c; c++)
{
if (whox_fields[*c])
query_flag_order.push_back(*c);
}
}
else
query_flag_order = who_field_order;
}
};

View File

@ -123,23 +123,10 @@ class ModuleHideOper
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'])
size_t flag_index;
if (!request.GetFlagIndex('f', flag_index))
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() <= flag_index)

View File

@ -84,23 +84,10 @@ class ModuleNamesX
if (prefixes.length() <= 1)
return MOD_RES_PASSTHRU;
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'])
size_t flag_index;
if (!request.GetFlagIndex('f', flag_index))
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;
}
}
// #chan ident localhost insp22.test nick H@ :0 Attila
if (numeric.GetParams().size() <= flag_index)
return MOD_RES_PASSTHRU;