attributes->get('currentPlayer'); abort_unless( $player instanceof Player && $player->room_id === $room->id, 403, ); $validated = $request->validate([ 'target_player_id' => ['required', 'integer'], ]); $targetPlayerId = (int) $validated['target_player_id']; if ($targetPlayerId === $player->id) { throw ValidationException::withMessages([ 'target_player_id' => 'Du kannst dich nicht selbst abwerfen.', ]); } $targetExists = $room->players() ->whereKey($targetPlayerId) ->exists(); if (! $targetExists) { throw ValidationException::withMessages([ 'target_player_id' => 'Dieser Spieler sitzt nicht an diesem Tisch.', ]); } $rateLimitKey = "room-emote:{$room->id}:{$player->id}"; abort_if( RateLimiter::tooManyAttempts($rateLimitKey, 10), 429, 'Bitte warte kurz, bevor du erneut wirfst.', ); RateLimiter::hit($rateLimitKey, 10); PaperBallThrown::dispatch( Str::uuid()->toString(), $room->id, $player->id, $targetPlayerId, ); return response()->noContent(); } }