summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/modules/who.h11
-rw-r--r--src/coremods/core_who.cpp22
-rw-r--r--src/modules/m_hideoper.cpp19
-rw-r--r--src/modules/m_namesx.cpp19
4 files changed, 39 insertions, 32 deletions
diff --git a/include/modules/who.h b/include/modules/who.h
index 4fcbe5f91..8fd2dab08 100644
--- a/include/modules/who.h
+++ b/include/modules/who.h
@@ -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)
diff --git a/src/coremods/core_who.cpp b/src/coremods/core_who.cpp
index bf00b741f..f32ef77b3 100644
--- a/src/coremods/core_who.cpp
+++ b/src/coremods/core_who.cpp
@@ -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;
}
};
diff --git a/src/modules/m_hideoper.cpp b/src/modules/m_hideoper.cpp
index f04d88809..8feb1a852 100644
--- a/src/modules/m_hideoper.cpp
+++ b/src/modules/m_hideoper.cpp
@@ -123,22 +123,9 @@ 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'])
- 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;
- }
- }
+ size_t flag_index;
+ if (!request.GetFlagIndex('f', flag_index))
+ return MOD_RES_PASSTHRU;
// hide the "*" that marks the user as an oper from the /WHO line
// #chan ident localhost insp22.test nick H@ :0 Attila
diff --git a/src/modules/m_namesx.cpp b/src/modules/m_namesx.cpp
index defb66b78..1e051e75c 100644
--- a/src/modules/m_namesx.cpp
+++ b/src/modules/m_namesx.cpp
@@ -84,22 +84,9 @@ 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'])
- 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;
- }
- }
+ size_t flag_index;
+ if (!request.GetFlagIndex('f', flag_index))
+ return MOD_RES_PASSTHRU;
// #chan ident localhost insp22.test nick H@ :0 Attila
if (numeric.GetParams().size() <= flag_index)