feat: added laravel reverb and websocket, also emote throwing added

This commit is contained in:
2026-08-16 17:10:42 +02:00
parent 50e9fbd0b0
commit 6f47ed0674
30 changed files with 2244 additions and 34 deletions
@@ -0,0 +1,65 @@
<?php
namespace App\Http\Controllers;
use App\Events\PaperBallThrown;
use App\Models\Player;
use App\Models\Room;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Str;
use Illuminate\Validation\ValidationException;
class RoomEmoteController extends Controller
{
public function store(Request $request, Room $room): Response
{
$player = $request->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();
}
}