From 8db1a252d70f31cc7f2bf6e644f1110ff5dcdf50 Mon Sep 17 00:00:00 2001 From: pllx Date: Mon, 27 Apr 2026 13:54:59 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=96=B0=E4=BA=BA=E6=AC=A2?= =?UTF-8?q?=E8=BF=8E=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/ChatController.php | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/ChatController.php b/app/Http/Controllers/ChatController.php index 191604f..c987fca 100644 --- a/app/Http/Controllers/ChatController.php +++ b/app/Http/Controllers/ChatController.php @@ -123,9 +123,19 @@ class ChatController extends Controller // 广播 UserJoined 事件,通知房间内的其他人 broadcast(new UserJoined($id, $user->username, $userData))->toOthers(); + // 每次进入先清理掉历史中旧的欢迎消息,保证同一个人只保留最后一条 + // 必须在推送新消息之前执行,否则可能误删刚刚创建的欢迎播报 + $this->chatState->removeOldWelcomeMessages($id, $user->username); + // 新人首次进入:赠送 6666 金币、播放满场烟花、发送全场欢迎通告 + // 双重校验:优先以 has_received_new_gift 标记为准,若标记异常则用 created_at 时间兜底 $user->refresh(); - if (! $user->has_received_new_gift) { + $isNewbie = ! $user->has_received_new_gift; + // 兜底:如果用户创建时间在 2 分钟内,即使标记异常也按新人处理 + if (! $isNewbie && $user->created_at && $user->created_at->diffInSeconds(now()) < 120) { + $isNewbie = true; + } + if ($isNewbie) { // 通过统一积分服务发放新人礼包 6666 金币并记录流水 $this->currencyService->change( $user, 'gold', 6666, CurrencySource::NEWBIE_BONUS, '新人首次入场婿赠的 6666 金币大礼包', $id, @@ -147,6 +157,7 @@ class ChatController extends Controller ]; $this->chatState->pushMessage($id, $newbieMsg); broadcast(new MessageSent($id, $newbieMsg)); + SaveMessageJob::dispatch($newbieMsg); // 广播烟花特效给此时已在房间的其他用户 broadcast(new \App\Events\EffectBroadcast($id, 'fireworks', $user->username))->toOthers(); @@ -179,10 +190,6 @@ class ChatController extends Controller SaveMessageJob::dispatch($aiWelcomeMsg); } - // superlevel 管理员进入:触发全房间烟花 + 系统公告,其他人走通用播报 - // 每次进入先清理掉历史中旧的欢迎消息,保证同一个人只保留最后一条 - $this->chatState->removeOldWelcomeMessages($id, $user->username); - // 统一走通用进场播报逻辑,管理员不再发送单独的特殊登录提示。 [$text, $color] = $this->broadcast->buildEntryBroadcast($user); $vipPresencePayload = $this->broadcast->buildVipPresencePayload($user, 'join');