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