Files
chatroom/app/Services/VipService.php
2026-04-12 14:17:01 +08:00

116 lines
3.0 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* 文件功能VIP 会员服务层
* 提供倍率计算、会员授予/撤销、模板渲染等核心逻辑
*
* @author ChatRoom Laravel
*
* @version 1.0.0
*/
namespace App\Services;
use App\Models\User;
use App\Models\VipLevel;
class VipService
{
/**
* 获取用户的经验倍率(非 VIP 返回 1.0
*/
public function getExpMultiplier(User $user): float
{
if (! $user->isVip()) {
return 1.0;
}
return $user->vipLevel?->exp_multiplier ?? 1.0;
}
/**
* 获取用户的金币倍率(非 VIP 返回 1.0
*/
public function getJjbMultiplier(User $user): float
{
if (! $user->isVip()) {
return 1.0;
}
return $user->vipLevel?->jjb_multiplier ?? 1.0;
}
/**
* 授予用户 VIP 等级
*
* @param User $user 目标用户
* @param int $vipLevelId VIP 等级 ID
* @param int $days 天数0=永久)
* @param bool $isUpgrade 是否为补差价升级
*/
public function grantVip(User $user, int $vipLevelId, int $days = 30, bool $isUpgrade = false): void
{
$oldVipId = $user->vip_level_id;
$user->vip_level_id = $vipLevelId;
if ($days > 0) {
if ($isUpgrade && $oldVipId && $user->hy_time && $user->hy_time->isFuture()) {
// 如果是升级到期日期保持不变除非新等级是永久days=0
// 此时只需更新等级 ID无需修改 hy_time。
} else {
// 如果是新购或续费,在现有到期时间上延长
$baseTime = ($user->hy_time && $user->hy_time->isFuture())
? $user->hy_time
: now();
$user->hy_time = $baseTime->addDays($days);
}
} else {
// 永久会员
$user->hy_time = null;
}
$user->save();
}
/**
* 撤销用户 VIP 等级
*/
public function revokeVip(User $user): void
{
$user->vip_level_id = null;
$user->hy_time = null;
$user->save();
}
/**
* 获取用户专属进入聊天室的欢迎语(非 VIP 返回 null
*
* @param User $user 用户
* @return string|null 渲染后的欢迎语
*/
public function getJoinMessage(User $user): ?string
{
if (! $user->isVip() || ! $user->vipLevel) {
return null;
}
$templates = $user->vipLevel->join_templates_array;
return VipLevel::renderTemplate($templates, $user->username);
}
/**
* 获取用户专属离开聊天室的提示语(非 VIP 返回 null
*/
public function getLeaveMessage(User $user): ?string
{
if (! $user->isVip() || ! $user->vipLevel) {
return null;
}
$templates = $user->vipLevel->leave_templates_array;
return VipLevel::renderTemplate($templates, $user->username);
}
}