54 lines
1.4 KiB
PHP
54 lines
1.4 KiB
PHP
<?php
|
|
|
|
namespace App\Events;
|
|
|
|
use Illuminate\Queue\SerializesModels;
|
|
use Illuminate\Broadcasting\PrivateChannel;
|
|
use Illuminate\Foundation\Events\Dispatchable;
|
|
use Illuminate\Broadcasting\InteractsWithSockets;
|
|
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
|
|
|
|
/** 通知旧客户端:同一原生玩家账号已有较新的登录会话。 */
|
|
final class PlayerSessionReplacedBroadcast implements ShouldBroadcast
|
|
{
|
|
use Dispatchable, InteractsWithSockets, SerializesModels;
|
|
|
|
public string $queue = 'broadcasts';
|
|
|
|
public int $tries = 3;
|
|
|
|
public int $timeout = 10;
|
|
|
|
public function __construct(
|
|
public readonly int $playerId,
|
|
public readonly int $sessionVersion,
|
|
public readonly int $emittedAtMs,
|
|
) {}
|
|
|
|
public function retryUntil(): \DateTimeInterface
|
|
{
|
|
return now()->addSeconds(30);
|
|
}
|
|
|
|
/** @return array<int, PrivateChannel> */
|
|
public function broadcastOn(): array
|
|
{
|
|
return [new PrivateChannel('player.'.$this->playerId)];
|
|
}
|
|
|
|
public function broadcastAs(): string
|
|
{
|
|
return 'session.replaced';
|
|
}
|
|
|
|
/** @return array{player_id: int, session_version: int, emitted_at_ms: int} */
|
|
public function broadcastWith(): array
|
|
{
|
|
return [
|
|
'player_id' => $this->playerId,
|
|
'session_version' => $this->sessionVersion,
|
|
'emitted_at_ms' => $this->emittedAtMs,
|
|
];
|
|
}
|
|
}
|