109 lines
2.5 KiB
PHP
109 lines
2.5 KiB
PHP
|
|
<?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=永久)
|
|||
|
|
*/
|
|||
|
|
public function grantVip(User $user, int $vipLevelId, int $days = 30): void
|
|||
|
|
{
|
|||
|
|
$user->vip_level_id = $vipLevelId;
|
|||
|
|
|
|||
|
|
if ($days > 0) {
|
|||
|
|
// 如果用户已有未过期的会员,在现有到期时间上延长
|
|||
|
|
$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);
|
|||
|
|
}
|
|||
|
|
}
|