From 522eea72f6bd5de8a0c1e5f74130322e0806aed2 Mon Sep 17 00:00:00 2001 From: pllx Date: Thu, 30 Apr 2026 11:12:50 +0800 Subject: [PATCH] =?UTF-8?q?=E9=81=BF=E5=85=8D=E5=BA=A7=E9=A9=BE=E8=BF=9B?= =?UTF-8?q?=E6=88=BF=E9=87=8D=E5=A4=8D=E6=AC=A2=E8=BF=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/ChatController.php | 63 ++++++++++++------------- tests/Feature/ChatControllerTest.php | 3 ++ 2 files changed, 34 insertions(+), 32 deletions(-) diff --git a/app/Http/Controllers/ChatController.php b/app/Http/Controllers/ChatController.php index 2bf829d..4af1dee 100644 --- a/app/Http/Controllers/ChatController.php +++ b/app/Http/Controllers/ChatController.php @@ -196,44 +196,43 @@ class ChatController extends Controller } // 统一走通用进场播报逻辑,管理员不再发送单独的特殊登录提示。 - [$text, $color] = $this->broadcast->buildEntryBroadcast($user); $ridePresencePayload = $this->rideService->buildPresencePayload($user); - // 座驾优先级高于会员进场主题,避免同一用户进房时同时播放两套全屏特效。 - $vipPresencePayload = $ridePresencePayload - ? [] - : $this->broadcast->buildVipPresencePayload($user, 'join'); + if (! $ridePresencePayload) { + [$text, $color] = $this->broadcast->buildEntryBroadcast($user); + $vipPresencePayload = $this->broadcast->buildVipPresencePayload($user, 'join'); - $generalWelcomeMsg = [ - 'id' => $this->chatState->nextMessageId($id), - 'room_id' => $id, - 'from_user' => '进出播报', - 'to_user' => '大家', - 'content' => "{$text}", - 'is_secret' => false, - 'font_color' => $color, - 'action' => empty($vipPresencePayload) ? 'system_welcome' : 'vip_presence', - 'welcome_user' => $user->username, - 'welcome_kind' => 'entry_broadcast', - 'sent_at' => now()->toDateTimeString(), - ]; + $generalWelcomeMsg = [ + 'id' => $this->chatState->nextMessageId($id), + 'room_id' => $id, + 'from_user' => '进出播报', + 'to_user' => '大家', + 'content' => "{$text}", + 'is_secret' => false, + 'font_color' => $color, + 'action' => empty($vipPresencePayload) ? 'system_welcome' : 'vip_presence', + 'welcome_user' => $user->username, + 'welcome_kind' => 'entry_broadcast', + 'sent_at' => now()->toDateTimeString(), + ]; - // 当会员等级带有专属主题时,把横幅与特效字段并入系统消息,供前端展示豪华进场效果。 - if (! empty($vipPresencePayload)) { - $generalWelcomeMsg = array_merge($generalWelcomeMsg, $vipPresencePayload); - $initialPresenceTheme = $vipPresencePayload; - } + // 当会员等级带有专属主题时,把横幅与特效字段并入系统消息,供前端展示豪华进场效果。 + if (! empty($vipPresencePayload)) { + $generalWelcomeMsg = array_merge($generalWelcomeMsg, $vipPresencePayload); + $initialPresenceTheme = $vipPresencePayload; + } - // 把当前这次进房生成的欢迎消息带回前端,确保用户自己也一定能看到。 - $initialWelcomeMessage = $generalWelcomeMsg; - $initialWelcomeMessages[] = $generalWelcomeMsg; + // 把当前这次进房生成的欢迎消息带回前端,确保用户自己也一定能看到。 + $initialWelcomeMessage = $generalWelcomeMsg; + $initialWelcomeMessages[] = $generalWelcomeMsg; - $this->chatState->pushMessage($id, $generalWelcomeMsg); - // 修复:之前使用了 ->toOthers() 导致自己看不到自己的进场提示 - broadcast(new MessageSent($id, $generalWelcomeMsg)); + $this->chatState->pushMessage($id, $generalWelcomeMsg); + // 修复:之前使用了 ->toOthers() 导致自己看不到自己的进场提示 + broadcast(new MessageSent($id, $generalWelcomeMsg)); - // 会员专属特效需要单独广播给其他在线成员,自己则在页面初始化后本地补播。 - if (! empty($vipPresencePayload['presence_effect'])) { - broadcast(new \App\Events\EffectBroadcast($id, $vipPresencePayload['presence_effect'], $user->username))->toOthers(); + // 会员专属特效需要单独广播给其他在线成员,自己则在页面初始化后本地补播。 + if (! empty($vipPresencePayload['presence_effect'])) { + broadcast(new \App\Events\EffectBroadcast($id, $vipPresencePayload['presence_effect'], $user->username))->toOthers(); + } } if ($ridePresencePayload) { diff --git a/tests/Feature/ChatControllerTest.php b/tests/Feature/ChatControllerTest.php index 0420a2b..f8737ce 100644 --- a/tests/Feature/ChatControllerTest.php +++ b/tests/Feature/ChatControllerTest.php @@ -1128,8 +1128,10 @@ class ChatControllerTest extends TestCase $response->assertOk(); $history = collect($response->viewData('historyMessages')); $rideMessage = $history->first(fn (array $message): bool => ($message['welcome_kind'] ?? '') === 'ride_presence'); + $entryBroadcast = $history->first(fn (array $message): bool => ($message['welcome_kind'] ?? '') === 'entry_broadcast'); $this->assertNotNull($rideMessage); + $this->assertNull($entryBroadcast); $this->assertSame('座驾播报', $rideMessage['from_user']); $this->assertSame('j35', $rideMessage['ride_key']); $this->assertSame("{$user->username} 乘坐【歼-35测试座驾】闪亮登场", $rideMessage['effect_title']); @@ -1217,6 +1219,7 @@ class ChatControllerTest extends TestCase $this->assertStringContainsString($user->username, $rideMessage['content']); $this->assertSame('99a', $response->viewData('initialRideEffect')); $this->assertSame("用户 {$user->username} · 部门 战备部 · 职务 🛡️ 试飞官 · 会员 👑 至尊会员", $response->viewData('initialRideEffectOptions')['effect_user_info']); + $this->assertNull($response->viewData('initialWelcomeMessage')); $this->assertNull($response->viewData('initialPresenceTheme')); }