红包领取增加全员通知
This commit is contained in:
@@ -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' => "🧧 <b>{$user->username}</b> 抢到了 <b>{$amount}</b> {$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;
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* 文件功能:游戏下注公屏与右下角通知广播服务
|
||||
* 文件功能:游戏下注与奖励公屏右下角通知广播服务
|
||||
*
|
||||
* 统一处理百家乐、赛马、双色球等游戏下注成功后的公屏消息、
|
||||
* 统一处理百家乐、赛马、双色球等游戏下注或奖励领取成功后的公屏消息、
|
||||
* 右下角 Toast 通知载荷和异步落库,避免各玩法重复拼装广播结构。
|
||||
*/
|
||||
|
||||
@@ -13,7 +13,7 @@ use App\Events\MessageSent;
|
||||
use App\Jobs\SaveMessageJob;
|
||||
|
||||
/**
|
||||
* 类功能:为游戏下注成功事件生成并广播全员可见通知。
|
||||
* 类功能:为游戏下注和奖励领取成功事件生成并广播全员可见通知。
|
||||
*/
|
||||
class GameBetBroadcastService
|
||||
{
|
||||
@@ -77,7 +77,28 @@ class GameBetBroadcastService
|
||||
}
|
||||
|
||||
/**
|
||||
* 推送带右下角通知载荷的公屏游戏下注消息。
|
||||
* 广播红包领取成功通知。
|
||||
*/
|
||||
public function redPacketClaimed(int $roomId, string $username, int $amount, string $type): void
|
||||
{
|
||||
$typeLabel = $type === 'exp' ? '经验' : '金币';
|
||||
$typeIcon = $type === 'exp' ? '✨' : '💰';
|
||||
$toastColor = $type === 'exp' ? '#6d28d9' : '#d97706';
|
||||
$formattedAmount = number_format($amount);
|
||||
|
||||
$this->pushBetMessage(
|
||||
roomId: $roomId,
|
||||
content: "🧧 <b>{$username}</b> 抢到了 <b>{$formattedAmount}</b> {$typeLabel}礼包!{$typeIcon}",
|
||||
fontColor: $toastColor,
|
||||
toastTitle: '🧧 有人领取红包',
|
||||
toastMessage: "<b>{$username}</b> 抢到 <b>{$formattedAmount}</b> {$typeLabel}礼包",
|
||||
toastIcon: '🧧',
|
||||
toastColor: $toastColor,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 推送带右下角通知载荷的公屏游戏消息。
|
||||
*/
|
||||
private function pushBetMessage(
|
||||
int $roomId,
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* 文件功能:礼包红包控制器功能测试
|
||||
*
|
||||
* 覆盖礼包发放权限、领取入账、领取广播、状态查询和重复领取约束。
|
||||
*/
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Events\RedPacketClaimed;
|
||||
@@ -262,6 +268,18 @@ class RedPacketControllerTest extends TestCase
|
||||
&& $event->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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user