do not need login

This commit is contained in:
2026-09-10 16:33:13 +02:00
parent 6ca91f3fe9
commit 2ab95cebdf
12 changed files with 184 additions and 71 deletions
+59 -13
View File
@@ -102,9 +102,13 @@ class RoomParticipationService
return [$room, $player];
}
public function joinEmbedded(Room $room, User $user, string $playerName): Player
{
[$player, $change, $stateVersion] = DB::transaction(function () use ($room, $user, $playerName): array {
public function joinEmbedded(
Room $room,
?User $user,
string $playerName,
mixed $sessionPlayerId,
): Player {
[$player, $change, $stateVersion] = DB::transaction(function () use ($room, $user, $playerName, $sessionPlayerId): array {
$lockedRoom = Room::query()
->lockForUpdate()
->findOrFail($room->id);
@@ -115,12 +119,18 @@ class RoomParticipationService
]);
}
$player = $this->findExistingEmbeddedPlayer(
$lockedRoom,
$user,
$sessionPlayerId,
);
$nameIsTaken = $lockedRoom->players()
->where('name', $playerName)
->where(function ($query) use ($user): void {
$query->whereNull('user_id')
->orWhere('user_id', '!=', $user->id);
})
->when(
$player !== null,
fn ($query) => $query->whereKeyNot($player->id),
)
->exists();
if ($nameIsTaken) {
@@ -129,14 +139,11 @@ class RoomParticipationService
]);
}
$player = $lockedRoom->players()
->where('user_id', $user->id)
->first();
$change = null;
if ($player === null) {
$player = $lockedRoom->players()->create([
'user_id' => $user->id,
'user_id' => $user?->id,
'name' => $playerName,
'is_moderator' => false,
'last_seen_at' => now(),
@@ -149,11 +156,24 @@ class RoomParticipationService
$change = RoomStateChange::PlayerUpdated;
}
$player->update([
$updates = [
'name' => $playerName,
'last_seen_at' => now(),
'inactive_at' => null,
]);
];
if (
$user !== null
&& $player->user_id === null
&& ! $lockedRoom->players()
->where('user_id', $user->id)
->whereKeyNot($player->id)
->exists()
) {
$updates['user_id'] = $user->id;
}
$player->update($updates);
}
if ($change === null) {
@@ -180,6 +200,32 @@ class RoomParticipationService
return $player;
}
private function findExistingEmbeddedPlayer(
Room $room,
?User $user,
mixed $sessionPlayerId,
): ?Player {
if (is_numeric($sessionPlayerId)) {
$sessionPlayer = $room->players()
->whereKey((int) $sessionPlayerId)
->lockForUpdate()
->first();
if ($sessionPlayer !== null) {
return $sessionPlayer;
}
}
if ($user === null) {
return null;
}
return $room->players()
->where('user_id', $user->id)
->lockForUpdate()
->first();
}
public function kick(
Room $room,
Player $player,