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); } }