diff --git a/include/dpp/permissions.h b/include/dpp/permissions.h index 68e5f2d379..1ce84a2284 100644 --- a/include/dpp/permissions.h +++ b/include/dpp/permissions.h @@ -117,19 +117,23 @@ class DPP_EXPORT permission { operator nlohmann::json() const; /** - * @brief Check if it has a permission flag set. It uses the Bitwise AND operator - * @param p The permission flag from dpp::permissions + * @brief Check for permission flags set. It uses the Bitwise AND operator + * @tparam T one or more uint64_t permission bits + * @param values The permissions (from dpp::permissions) to check for * * **Example:** * * ```cpp - * bool is_mod = permission.has(dpp::p_kick_members | dpp::p_ban_members); + * bool is_mod = permission.has(dpp::p_kick_members, dpp::p_ban_members); * // Returns true if the permission bitmask contains p_kick_members and p_ban_members * ``` * - * @return True if it has the permission + * @return bool True if it has all the given permissions */ - bool has(uint64_t p) const; + template + bool has(T... values) const { + return (value & (0 | ... | values)) == (0 | ... | values); + } /** * @brief Add a permission with the Bitwise OR operation diff --git a/src/dpp/permissions.cpp b/src/dpp/permissions.cpp index 355fd118f1..5985e6e224 100644 --- a/src/dpp/permissions.cpp +++ b/src/dpp/permissions.cpp @@ -39,8 +39,4 @@ permission::operator nlohmann::json() const { return std::to_string(value); } -bool permission::has(uint64_t p) const { - return (value & p) == p; -} - } diff --git a/src/test.cpp b/src/test.cpp index bbcf36b3a3..ee6881b102 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -196,11 +196,14 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b j["value"] = p; success = dpp::snowflake_not_null(&j, "value") == 5120 && success; p.set(dpp::p_administrator, dpp::p_ban_members); + success = p.has(dpp::p_administrator) && success; success = p.has(dpp::p_administrator) && p.has(dpp::p_ban_members) && success; + success = p.has(dpp::p_administrator, dpp::p_ban_members) && success; success = p.has(dpp::p_administrator | dpp::p_ban_members) && success; p.set(dpp::p_administrator); - success = ! p.has(dpp::p_administrator | dpp::p_ban_members) && success; // must return false because they're not both set + success = ! p.has(dpp::p_administrator, dpp::p_ban_members) && success; // must return false because they're not both set + success = ! p.has(dpp::p_administrator | dpp::p_ban_members) && success; set_test("PERMISSION_CLASS", success); }