
discord api在用户对象中提供了一个名为public_flags的字段,它是一个整数值。这个整数实际上是一个位掩码(bitmask),用于紧凑地表示用户所拥有的一系列公共徽章。每个徽章都对应一个唯一的2的幂次方值(例如1, 2, 4, 8, 64等)。当一个用户拥有多个徽章时,public_flags的值就是这些徽章对应数值的总和。例如,如果一个用户拥有hypesquad events(值4)和early supporter(值512)徽章,那么他的public_flags将是 4 + 512 = 516。
为了从这个复合值中提取出单个的徽章信息,我们需要利用位运算。
解码public_flags的核心在于位与(Bitwise AND, &)操作。位与操作会比较两个数的二进制表示,如果两个对应位都是1,则结果位为1;否则为0。
其原理如下:
以下是Discord API中常见的public_flags值及其对应的徽章名称:
| 标志值 | 徽章名称 |
|---|---|
| 1 | Discord_Employee |
| 2 | Partnered_Server_Owner |
| 4 | HypeSquad_Events |
| 8 | Bug_Hunter_Level_1 |
| 64 | House_Bravery |
| 128 | House_Brilliance |
| 256 | House_Balance |
| 512 | Early_Supporter |
| 16384 | Bug_Hunter_Level_2 |
| 131072 | Early_Verified_Bot_Developer |
假设我们从Discord API获取到的public_flags值为 644。根据问题描述,这个值代表用户拥有 HypeSquad Event、Brilliance 和 Early_Supporter 徽章。我们将使用PHP来验证这一点。
<?php
/**
* 定义Discord public_flags的徽章映射表。
* 键是徽章的数值,值是徽章的名称。
*/
$badges = [
1 => 'Discord_Employee',
2 => 'Partnered_Server_Owner',
4 => 'HypeSquad_Events',
8 => 'Bug_Hunter_Level_1',
64 => 'House_Bravery',
128 => 'House_Brilliance',
256 => 'House_Balance',
512 => 'Early_Supporter',
16384 => 'Bug_Hunter_Level_2',
131072 => 'Early_Verified_Bot_Developer',
];
// 示例用户的 public_flags 值
$publicFlags = 644;
/**
* 使用 array_filter 结合位与操作来筛选出用户拥有的徽章。
*
* @param array $badges 所有可能的徽章映射数组。
* @param int $publicFlags 用户当前的 public_flags 值。
* @return array 包含用户所拥有徽章名称的数组。
*/
function decodeDiscordPublicFlags(array $badges, int $publicFlags): array
{
// array_filter 的回调函数会遍历 $badges 数组的每个元素。
// $key 是徽章的数值 (1, 2, 4, ...),$value 是徽章的名称。
// ARRAY_FILTER_USE_BOTH 确保回调函数能同时接收键和值。
return array_filter($badges, function($value, $key) use($publicFlags) {
// 执行位与操作:如果 publicFlags 包含当前徽章的位,结果会大于0。
return ($key & $publicFlags) > 0;
}, ARRAY_FILTER_USE_BOTH);
}
// 调用函数解码 public_flags
$userBadges = decodeDiscordPublicFlags($badges, $publicFlags);
// 输出结果
echo "用户 public_flags: {$publicFlags}\n";
echo "用户拥有的徽章:\n";
print_r($userBadges);
// 预期输出:
// 用户 public_flags: 644
// 用户拥有的徽章:
// Array
// (
// [4] => HypeSquad_Events
// [128] => House_Brilliance
// [512] => Early_Supporter
// )
// 另一个示例:public_flags = 6
// $publicFlags = 6;
// $userBadges = decodeDiscordPublicFlags($badges, $publicFlags);
// echo "\n用户 public_flags: {$publicFlags}\n";
// echo "用户拥有的徽章:\n";
// print_r($userBadges);
// 预期输出:
// 用户 public_flags: 6
// 用户拥有的徽章:
// Array
// (
// [2] => Partnered_Server_Owner
// [4] => HypeSquad_Events
// )
?>通过理解public_flags的位掩码机制和巧妙运用位与操作,我们可以轻松地将Discord API返回的单一整数值转换为用户所拥有的详细徽章列表。这种技术不仅适用于Discord API,也广泛应用于其他需要用一个整数表示多个布尔状态的场景,是开发者工具箱中一个强大而实用的技能。
以上就是Discord API public_flags 位掩码解码教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号