feat(pay): enforce VIP free-download daily quota like zibll

This commit is contained in:
kate522 committed 2026-07-14 01:03:03 +08:00
1 parent 7cce3ff275
commit 8b50687e9d
4 files changed
+199 -4

No files matched your search

+154
View File
@@ -149,6 +149,160 @@ function aksrt_get_vip_badge_text(): string {
return sanitize_text_field($vip_settings['badge_text'] ?? 'VIP');
}
/**
* Daily free-download limit for a user (0 = unlimited).
* Aligns with zibll pay_download_limit / pay_download_limit_vip_{n}.
*/
if (!function_exists('aksrt_get_user_free_download_limit')) {
function aksrt_get_user_free_download_limit(int $user_id = 0): int {
if ($user_id <= 0) {
$user_id = get_current_user_id();
}
if ($user_id <= 0 || !class_exists('AKSRT_Settings')) {
return 0;
}
$vip = AKSRT_Settings::get_payment_vip_settings();
$level = function_exists('aksrt_get_user_vip_level') ? aksrt_get_user_vip_level($user_id) : 0;
$levels = is_array($vip['levels'] ?? null) ? $vip['levels'] : [];
$benefit = is_array($vip['benefit'] ?? null) ? $vip['benefit'] : [];
if ($level >= 1 && !empty($levels[$level]['enabled'])) {
return max(0, (int) ($levels[$level]['download_limit'] ?? 0));
}
return max(0, (int) ($benefit['download_limit'] ?? 0));
}
}
/**
* Download speed cap in KB/s for a user (0 = unlimited).
*/
if (!function_exists('aksrt_get_user_download_speed')) {
function aksrt_get_user_download_speed(int $user_id = 0): int {
if ($user_id <= 0) {
$user_id = get_current_user_id();
}
if ($user_id <= 0 || !class_exists('AKSRT_Settings')) {
return 0;
}
$vip = AKSRT_Settings::get_payment_vip_settings();
$level = function_exists('aksrt_get_user_vip_level') ? aksrt_get_user_vip_level($user_id) : 0;
$levels = is_array($vip['levels'] ?? null) ? $vip['levels'] : [];
$benefit = is_array($vip['benefit'] ?? null) ? $vip['benefit'] : [];
if ($level >= 1 && !empty($levels[$level]['enabled'])) {
return max(0, (int) ($levels[$level]['download_speed'] ?? 0));
}
return max(0, (int) ($benefit['download_speed'] ?? 0));
}
}
/**
* Count free downloads used today for a user (zibll pay_down_number).
*/
if (!function_exists('aksrt_get_user_free_downloaded_number')) {
function aksrt_get_user_free_downloaded_number(int $user_id = 0): int {
if ($user_id <= 0) {
$user_id = get_current_user_id();
}
if ($user_id <= 0) {
return 0;
}
$day = current_time('Y-m-d');
$mate = get_user_meta($user_id, 'aksrt_pay_down_number', true);
if (!is_array($mate) || empty($mate[$day]) || !is_array($mate[$day])) {
return 0;
}
return count($mate[$day]);
}
}
/**
* Record a free download for daily quota (zibll pay_down_number).
*/
if (!function_exists('aksrt_record_user_free_download')) {
function aksrt_record_user_free_download(int $user_id, int $post_id): void {
if ($user_id <= 0 || $post_id <= 0) {
return;
}
$day = current_time('Y-m-d');
$mate = get_user_meta($user_id, 'aksrt_pay_down_number', true);
if (!is_array($mate)) {
$mate = [];
}
// Drop old days to keep meta small.
foreach (array_keys($mate) as $k) {
if ($k !== $day) {
unset($mate[$k]);
}
}
if (!isset($mate[$day]) || !is_array($mate[$day])) {
$mate[$day] = [];
}
$mate[$day][(string) $post_id] = 1;
update_user_meta($user_id, 'aksrt_pay_down_number', $mate);
}
}
/**
* Whether a free download is allowed under daily quota.
* Paid downloads (cost > 0) always pass.
*
* @return true|WP_Error
*/
if (!function_exists('aksrt_check_free_download_quota')) {
function aksrt_check_free_download_quota(int $user_id, int $cost = 0) {
if ($cost > 0) {
return true;
}
if ($user_id <= 0) {
return true; // login gate handled elsewhere
}
$limit = aksrt_get_user_free_download_limit($user_id);
if ($limit <= 0) {
return true; // unlimited
}
$used = aksrt_get_user_free_downloaded_number($user_id);
if ($used >= $limit) {
return new WP_Error(
'aksrt_download_limit',
__('您今日下载免费资源个数已超限,请明日再下载。', 'aksrt'),
[
'status' => 429,
'limit' => $limit,
'used' => $used,
]
);
}
return true;
}
}
/**
* Remaining free downloads today (null = unlimited).
*/
if (!function_exists('aksrt_get_free_download_surplus')) {
function aksrt_get_free_download_surplus(int $user_id = 0): ?int {
if ($user_id <= 0) {
$user_id = get_current_user_id();
}
$limit = aksrt_get_user_free_download_limit($user_id);
if ($limit <= 0) {
return null;
}
$used = aksrt_get_user_free_downloaded_number($user_id);
return max(0, $limit - $used);
}
}
/**
* 渲染 VIP 徽标 HTML
*