Verification done
This commit is contained in:
@@ -71,11 +71,193 @@ final class GameDashboardService
|
||||
|
||||
$this->entityManager->persist($session);
|
||||
$this->entityManager->persist($player);
|
||||
|
||||
$this->initializePlayerSettings($player);
|
||||
|
||||
$this->entityManager->flush();
|
||||
|
||||
return $session;
|
||||
}
|
||||
|
||||
public function joinSession(string $inviteCode, UserInterface $user): bool
|
||||
{
|
||||
if (!$user instanceof User) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$setting = $this->entityManager->getRepository(SessionSetting::class)->findOneBy([
|
||||
'name' => SessionSettingType::INVITE_CODE,
|
||||
'value' => $inviteCode,
|
||||
]);
|
||||
|
||||
if (!$setting) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$session = $setting->getSession();
|
||||
|
||||
// Check if user is already in this session
|
||||
foreach ($session->getPlayers() as $player) {
|
||||
if ($player->getUser() === $user) {
|
||||
return true; // Already joined
|
||||
}
|
||||
}
|
||||
|
||||
$playerCount = count($session->getPlayers());
|
||||
if ($playerCount >= 3) {
|
||||
return false; // Session full
|
||||
}
|
||||
|
||||
$player = new Player();
|
||||
$player->setUser($user);
|
||||
$player->setSession($session);
|
||||
$player->setScreen($playerCount + 1);
|
||||
|
||||
$this->entityManager->persist($player);
|
||||
$this->initializePlayerSettings($player);
|
||||
|
||||
$this->entityManager->flush();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function leaveSession(Session $session, UserInterface $user): bool
|
||||
{
|
||||
if (!$user instanceof User) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($session->getStatus() !== SessionStatus::CREATED || $session->getTimer() > 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$playerToDelete = null;
|
||||
foreach ($session->getPlayers() as $player) {
|
||||
if ($player->getUser() === $user) {
|
||||
$playerToDelete = $player;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$playerToDelete) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Remove player specific settings (like rights)
|
||||
foreach ($session->getSettings() as $setting) {
|
||||
if ($setting->getPlayer() === $playerToDelete) {
|
||||
$session->removeSetting($setting);
|
||||
$this->entityManager->remove($setting);
|
||||
}
|
||||
}
|
||||
|
||||
$session->removePlayer($playerToDelete);
|
||||
$this->entityManager->remove($playerToDelete);
|
||||
|
||||
// If no players left, we might want to delete the session and its remaining settings
|
||||
if ($session->getPlayers()->isEmpty()) {
|
||||
foreach ($session->getSettings() as $setting) {
|
||||
$this->entityManager->remove($setting);
|
||||
}
|
||||
$this->entityManager->remove($session);
|
||||
}
|
||||
|
||||
$this->entityManager->flush();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private function initializePlayerSettings(Player $player): void
|
||||
{
|
||||
$screen = $player->getScreen();
|
||||
$rightsSettingName = match ($screen) {
|
||||
1 => SessionSettingType::RIGHTS_FOR_PLAYER1,
|
||||
2 => SessionSettingType::RIGHTS_FOR_PLAYER2,
|
||||
3 => SessionSettingType::RIGHTS_FOR_PLAYER3,
|
||||
default => null,
|
||||
};
|
||||
|
||||
if ($rightsSettingName) {
|
||||
$setting = new SessionSetting();
|
||||
$setting->setSession($player->getSession());
|
||||
$setting->setPlayer($player);
|
||||
$setting->setName($rightsSettingName);
|
||||
$setting->setValue(json_encode(['chat', 'help', 'ls', 'pwd']));
|
||||
$this->entityManager->persist($setting);
|
||||
}
|
||||
|
||||
$pwdSettingName = match ($screen) {
|
||||
1 => SessionSettingType::PWD_FOR_PLAYER1,
|
||||
2 => SessionSettingType::PWD_FOR_PLAYER2,
|
||||
3 => SessionSettingType::PWD_FOR_PLAYER3,
|
||||
default => null,
|
||||
};
|
||||
|
||||
if ($pwdSettingName) {
|
||||
$setting = new SessionSetting();
|
||||
$setting->setSession($player->getSession());
|
||||
$setting->setPlayer($player);
|
||||
$setting->setName($pwdSettingName);
|
||||
$setting->setValue('home/' . $player->getUser()->getUserIdentifier());
|
||||
$this->entityManager->persist($setting);
|
||||
}
|
||||
|
||||
$chatTrackingSettingName = match ($screen) {
|
||||
1 => SessionSettingType::CHAT_TRACKING_FOR_PLAYER1,
|
||||
2 => SessionSettingType::CHAT_TRACKING_FOR_PLAYER2,
|
||||
3 => SessionSettingType::CHAT_TRACKING_FOR_PLAYER3,
|
||||
default => null,
|
||||
};
|
||||
|
||||
if ($chatTrackingSettingName) {
|
||||
$setting = new SessionSetting();
|
||||
$setting->setSession($player->getSession());
|
||||
$setting->setPlayer($player);
|
||||
$setting->setName($chatTrackingSettingName);
|
||||
$setting->setValue(json_encode([]));
|
||||
$this->entityManager->persist($setting);
|
||||
}
|
||||
|
||||
$verifyCodesSettingName = match ($screen) {
|
||||
1 => SessionSettingType::VERIFY_CODES_FOR_PLAYER1,
|
||||
2 => SessionSettingType::VERIFY_CODES_FOR_PLAYER2,
|
||||
3 => SessionSettingType::VERIFY_CODES_FOR_PLAYER3,
|
||||
default => null,
|
||||
};
|
||||
|
||||
if ($verifyCodesSettingName) {
|
||||
$codes = [];
|
||||
for ($i = 1; $i <= 3; $i++) {
|
||||
if ($i !== $screen) {
|
||||
$codes[$i] = bin2hex(random_bytes(3)); // 6 characters code
|
||||
}
|
||||
}
|
||||
|
||||
$setting = new SessionSetting();
|
||||
$setting->setSession($player->getSession());
|
||||
$setting->setPlayer($player);
|
||||
$setting->setName($verifyCodesSettingName);
|
||||
$setting->setValue(json_encode($codes));
|
||||
$this->entityManager->persist($setting);
|
||||
}
|
||||
|
||||
$verificationProgressSettingName = match ($screen) {
|
||||
1 => SessionSettingType::VERIFICATION_PROGRESS_FOR_PLAYER1,
|
||||
2 => SessionSettingType::VERIFICATION_PROGRESS_FOR_PLAYER2,
|
||||
3 => SessionSettingType::VERIFICATION_PROGRESS_FOR_PLAYER3,
|
||||
default => null,
|
||||
};
|
||||
|
||||
if ($verificationProgressSettingName) {
|
||||
$setting = new SessionSetting();
|
||||
$setting->setSession($player->getSession());
|
||||
$setting->setPlayer($player);
|
||||
$setting->setName($verificationProgressSettingName);
|
||||
$setting->setValue(json_encode([]));
|
||||
$this->entityManager->persist($setting);
|
||||
}
|
||||
}
|
||||
|
||||
public function generateInviteCode(Session $session, UserInterface $user, bool $isAdmin): ?string
|
||||
{
|
||||
// Security check: is user part of this session?
|
||||
|
||||
Reference in New Issue
Block a user