From 92e3dd0cdf7be12843c27d45ce640630792e76ee Mon Sep 17 00:00:00 2001 From: pllx Date: Thu, 30 Apr 2026 15:52:16 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BA=A2=E5=8C=85=E9=A2=86=E5=8F=96=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=85=A8=E5=91=98=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/RedPacketController.php | 20 +++----------- app/Services/GameBetBroadcastService.php | 29 +++++++++++++++++--- tests/Feature/RedPacketControllerTest.php | 18 ++++++++++++ 3 files changed, 47 insertions(+), 20 deletions(-) diff --git a/app/Http/Controllers/RedPacketController.php b/app/Http/Controllers/RedPacketController.php index 861158e..0ef5bee 100644 --- a/app/Http/Controllers/RedPacketController.php +++ b/app/Http/Controllers/RedPacketController.php @@ -26,6 +26,7 @@ use App\Models\RedPacketClaim; use App\Models\RedPacketEnvelope; use App\Models\User; use App\Services\ChatStateService; +use App\Services\GameBetBroadcastService; use App\Services\PositionPermissionService; use App\Services\UserCurrencyService; use App\Support\PositionPermissionRegistry; @@ -58,6 +59,7 @@ class RedPacketController extends Controller private readonly ChatStateService $chatState, private readonly UserCurrencyService $currencyService, private readonly PositionPermissionService $positionPermissionService, + private readonly GameBetBroadcastService $betBroadcastService, ) {} /** @@ -357,23 +359,9 @@ class RedPacketController extends Controller type: $envelopeType, )); - // 在聊天室发送领取播报(所有人可见) + // 在聊天室发送领取播报并附带右下角通知,提醒房间内所有在线人员。 $typeLabel = $envelopeType === 'exp' ? '经验' : '金币'; - $typeIcon = $envelopeType === 'exp' ? '✨' : '💰'; - $claimedMsg = [ - 'id' => $this->chatState->nextMessageId($roomId), - 'room_id' => $roomId, - 'from_user' => '系统传音', - 'to_user' => '', - 'content' => "🧧 {$user->username} 抢到了 {$amount} {$typeLabel}礼包!{$typeIcon}", - 'is_secret' => false, - 'font_color' => $envelopeType === 'exp' ? '#6d28d9' : '#d97706', - 'action' => '', - 'sent_at' => now()->toDateTimeString(), - ]; - $this->chatState->pushMessage($roomId, $claimedMsg); - broadcast(new MessageSent($roomId, $claimedMsg)); - SaveMessageJob::dispatch($claimedMsg); + $this->betBroadcastService->redPacketClaimed($roomId, $user->username, $amount, $envelopeType); $balanceField = $envelopeType === 'exp' ? 'exp_num' : 'jjb'; $balanceNow = $user->fresh()->$balanceField; diff --git a/app/Services/GameBetBroadcastService.php b/app/Services/GameBetBroadcastService.php index a710347..4e23bdd 100644 --- a/app/Services/GameBetBroadcastService.php +++ b/app/Services/GameBetBroadcastService.php @@ -1,9 +1,9 @@ pushBetMessage( + roomId: $roomId, + content: "🧧 {$username} 抢到了 {$formattedAmount} {$typeLabel}礼包!{$typeIcon}", + fontColor: $toastColor, + toastTitle: '🧧 有人领取红包', + toastMessage: "{$username} 抢到 {$formattedAmount} {$typeLabel}礼包", + toastIcon: '🧧', + toastColor: $toastColor, + ); + } + + /** + * 推送带右下角通知载荷的公屏游戏消息。 */ private function pushBetMessage( int $roomId, diff --git a/tests/Feature/RedPacketControllerTest.php b/tests/Feature/RedPacketControllerTest.php index 26bf13f..6952644 100644 --- a/tests/Feature/RedPacketControllerTest.php +++ b/tests/Feature/RedPacketControllerTest.php @@ -1,5 +1,11 @@ remainingCount === 9 && $event->type === 'gold'; }); + + $messages = Redis::lrange('room:1:messages', 0, -1); + $publicMessage = collect($messages) + ->map(fn (string $item) => json_decode($item, true)) + ->first(fn (array $item) => ($item['to_user'] ?? null) === '大家' + && ($item['toast_notification']['title'] ?? null) === '🧧 有人领取红包' + && str_contains((string) ($item['toast_notification']['message'] ?? ''), $user->username)); + + $this->assertNotNull($publicMessage); + $this->assertFalse((bool) ($publicMessage['is_secret'] ?? true)); + $this->assertStringContainsString('金币礼包', (string) ($publicMessage['toast_notification']['message'] ?? '')); + $this->assertSame('🧧', $publicMessage['toast_notification']['icon'] ?? null); } /**