mirror of
https://github.com/inspircd/inspircd.git
synced 2025-03-10 02:59:01 -04:00
Add Who::Request::GetFlagIndex to get field index
Replaces the dirty logic in m_hideoper and m_namesx
This commit is contained in:
parent
f87b72b76f
commit
dfb1e0da78
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user