117 lines
3.9 KiB
PHP
117 lines
3.9 KiB
PHP
<?php
|
||
|
||
/**
|
||
* 文件功能:游戏下注公屏与右下角通知广播服务
|
||
*
|
||
* 统一处理百家乐、赛马、双色球等游戏下注成功后的公屏消息、
|
||
* 右下角 Toast 通知载荷和异步落库,避免各玩法重复拼装广播结构。
|
||
*/
|
||
|
||
namespace App\Services;
|
||
|
||
use App\Events\MessageSent;
|
||
use App\Jobs\SaveMessageJob;
|
||
|
||
/**
|
||
* 类功能:为游戏下注成功事件生成并广播全员可见通知。
|
||
*/
|
||
class GameBetBroadcastService
|
||
{
|
||
public function __construct(
|
||
private readonly ChatStateService $chatState,
|
||
) {}
|
||
|
||
/**
|
||
* 广播百家乐下注成功通知。
|
||
*/
|
||
public function baccarat(int $roomId, string $username, int $amount, string $betLabel): void
|
||
{
|
||
$formattedAmount = number_format($amount);
|
||
|
||
$this->pushBetMessage(
|
||
roomId: $roomId,
|
||
content: "🎲 <b>【百家乐】【{$username}】</b> 押注了 <b>{$formattedAmount}</b> 金币({$betLabel})!✨",
|
||
fontColor: '#d97706',
|
||
toastTitle: '🎲 有人下注百家乐',
|
||
toastMessage: "<b>{$username}</b> 押注 <b>{$formattedAmount}</b> 金币({$betLabel})",
|
||
toastIcon: '🎲',
|
||
toastColor: '#d97706',
|
||
);
|
||
}
|
||
|
||
/**
|
||
* 广播赛马下注成功通知。
|
||
*/
|
||
public function horseRace(int $roomId, string $username, int $amount, string $horseName): void
|
||
{
|
||
$formattedAmount = number_format($amount);
|
||
|
||
$this->pushBetMessage(
|
||
roomId: $roomId,
|
||
content: "🐎 <b>【赛马】【{$username}】</b> 押注了 <b>{$formattedAmount}</b> 金币({$horseName})!✨",
|
||
fontColor: '#d97706',
|
||
toastTitle: '🐎 有人下注赛马',
|
||
toastMessage: "<b>{$username}</b> 押注 <b>{$formattedAmount}</b> 金币({$horseName})",
|
||
toastIcon: '🐎',
|
||
toastColor: '#d97706',
|
||
);
|
||
}
|
||
|
||
/**
|
||
* 广播双色球购票成功通知。
|
||
*/
|
||
public function lottery(int $roomId, string $username, string $issueNo, string $numbersLabel, int $ticketCount): void
|
||
{
|
||
$moreText = $ticketCount > 1 ? "等 {$ticketCount} 注号码" : '';
|
||
|
||
$this->pushBetMessage(
|
||
roomId: $roomId,
|
||
content: "🎟️ 【{$username}】购买 {$issueNo} 期 {$numbersLabel} {$moreText}",
|
||
fontColor: '#dc2626',
|
||
toastTitle: '🎟️ 有人购买双色球',
|
||
toastMessage: "<b>{$username}</b> 购买 {$issueNo} 期 {$numbersLabel} {$moreText}",
|
||
toastIcon: '🎟️',
|
||
toastColor: '#dc2626',
|
||
action: '大声宣告',
|
||
);
|
||
}
|
||
|
||
/**
|
||
* 推送带右下角通知载荷的公屏游戏下注消息。
|
||
*/
|
||
private function pushBetMessage(
|
||
int $roomId,
|
||
string $content,
|
||
string $fontColor,
|
||
string $toastTitle,
|
||
string $toastMessage,
|
||
string $toastIcon,
|
||
string $toastColor,
|
||
string $action = '',
|
||
): void {
|
||
$message = [
|
||
'id' => $this->chatState->nextMessageId($roomId),
|
||
'room_id' => $roomId,
|
||
'from_user' => '系统传音',
|
||
'to_user' => '大家',
|
||
'content' => $content,
|
||
'is_secret' => false,
|
||
'font_color' => $fontColor,
|
||
'action' => $action,
|
||
'sent_at' => now()->toDateTimeString(),
|
||
'toast_notification' => [
|
||
'title' => $toastTitle,
|
||
'message' => $toastMessage,
|
||
'icon' => $toastIcon,
|
||
'color' => $toastColor,
|
||
'duration' => 8000,
|
||
],
|
||
];
|
||
|
||
// 下注通知必须进房间 Presence 频道,确保当前房间所有在线人员都能看到右下角提示。
|
||
$this->chatState->pushMessage($roomId, $message);
|
||
event(new MessageSent($roomId, $message));
|
||
SaveMessageJob::dispatch($message);
|
||
}
|
||
}
|