Files
chatroom/app/Jobs/OpenBaccaratRoundJob.php

88 lines
2.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* 文件功能:百家乐开局队列任务
*
* 由调度器每 N 分钟触发一次N 来自 game_configs.params.interval_minutes
* 游戏开启时创建新局次,广播开局事件,并在押注截止时间到期后自动调度结算任务。
*
* @author ChatRoom Laravel
*
* @version 1.0.0
*/
namespace App\Jobs;
use App\Events\BaccaratRoundOpened;
use App\Events\MessageSent;
use App\Models\BaccaratRound;
use App\Models\GameConfig;
use App\Services\ChatStateService;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;
class OpenBaccaratRoundJob implements ShouldQueue
{
use Queueable;
/**
* 最大重试次数。
*/
public int $tries = 1;
/**
* 执行开局逻辑。
*/
public function handle(ChatStateService $chatState): void
{
// 检查游戏是否开启
if (! GameConfig::isEnabled('baccarat')) {
return;
}
$config = GameConfig::forGame('baccarat')?->params ?? [];
$betSeconds = (int) ($config['bet_window_seconds'] ?? 60);
// 防止重复开局(如果上一局还在押注中则跳过)
if (BaccaratRound::currentRound()) {
return;
}
$now = now();
$closesAt = $now->copy()->addSeconds($betSeconds);
// 创建新局次
$round = BaccaratRound::create([
'status' => 'betting',
'bet_opens_at' => $now,
'bet_closes_at' => $closesAt,
]);
// 广播开局事件
broadcast(new BaccaratRoundOpened($round));
// 公屏系统公告
$minBet = number_format($config['min_bet'] ?? 100);
$maxBet = number_format($config['max_bet'] ?? 50000);
$content = "🎲 【百家乐】第 #{$round->id} 局开始!下注时间 {$betSeconds} 秒,可押「大/小/豹子」,押注范围 {$minBet}~{$maxBet} 金币。";
$msg = [
'id' => $chatState->nextMessageId(1),
'room_id' => 1,
'from_user' => '系统传音',
'to_user' => '大家',
'content' => $content,
'is_secret' => false,
'font_color' => '#8b5cf6',
'action' => '大声宣告',
'sent_at' => $now->toDateTimeString(),
];
$chatState->pushMessage(1, $msg);
broadcast(new MessageSent(1, $msg));
SaveMessageJob::dispatch($msg);
// 在下注截止时安排结算任务
CloseBaccaratRoundJob::dispatch($round)->delay($closesAt);
}
}