Files
scrum-poker-internal/app/Services/Rooms/RoomEmoteService.php
T
2026-09-01 11:59:00 +02:00

62 lines
1.6 KiB
PHP

<?php
namespace App\Services\Rooms;
use App\Events\PaperBallThrown;
use App\Models\Player;
use App\Models\Room;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Str;
use Illuminate\Validation\ValidationException;
class RoomEmoteService
{
public function throwPaperBall(
Room $room,
Player $player,
int $targetPlayerId,
int $chargePercentage,
): void {
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);
$chargeLevel = match (true) {
$chargePercentage >= 300 => 3,
$chargePercentage >= 200 => 2,
$chargePercentage >= 100 => 1,
default => 0,
};
PaperBallThrown::dispatch(
Str::uuid()->toString(),
$room->id,
$player->id,
$targetPlayerId,
$chargeLevel,
);
}
}