diff --git a/config/services.yaml b/config/services.yaml
index 6bbad87..5913030 100644
--- a/config/services.yaml
+++ b/config/services.yaml
@@ -16,5 +16,9 @@ services:
App\:
resource: '../src/'
+ App\Game\Service\GameResponseService:
+ arguments:
+ $projectDir: '%kernel.project_dir%'
+
# add more service definitions when explicit configuration is needed
# please note that last definitions always *replace* previous ones
diff --git a/src/Game/Controller/GameAdminController.php b/src/Game/Controller/GameAdminController.php
new file mode 100644
index 0000000..aaac8ec
--- /dev/null
+++ b/src/Game/Controller/GameAdminController.php
@@ -0,0 +1,63 @@
+findByRole('ROLE_PLAYER');
+ $sessions = $sessionRepository->findAll();
+
+ return $this->render('game/admin/index.html.twig', [
+ 'players' => $players,
+ 'sessions' => $sessions,
+ ]);
+ }
+
+ #[Route('/session/{session}', name: 'game_admin_view_session', methods: ['GET'])]
+ public function viewSession(Session $session): Response
+ {
+ $playersLogs = [];
+ foreach ($session->getPlayers() as $player) {
+ $username = $player->getUser()->getUsername();
+ $logFile = $this->projectDir . '/var/log/sessions/' . $session->getId() . '/' . $username . '.txt';
+
+ $logs = '';
+ if (file_exists($logFile)) {
+ $logs = file_get_contents($logFile);
+ }
+
+ $playersLogs[] = [
+ 'username' => $username,
+ 'logs' => $logs,
+ ];
+ }
+
+ return $this->render('game/admin/session.html.twig', [
+ 'session' => $session,
+ 'playersLogs' => $playersLogs,
+ ]);
+ }
+}
diff --git a/src/Game/Service/GameResponseService.php b/src/Game/Service/GameResponseService.php
index cacee9d..b298e27 100644
--- a/src/Game/Service/GameResponseService.php
+++ b/src/Game/Service/GameResponseService.php
@@ -21,6 +21,7 @@ class GameResponseService
private SessionSettingRepository $sessionSettingRepository,
private HubInterface $hub,
private EntityManagerInterface $entityManager,
+ private string $projectDir,
) {
}
@@ -44,7 +45,7 @@ class GameResponseService
if(!$player)
return ['error' => 'You are not in a game.'];
- // TODO: Here i need to add a message handler to save the message in a big log.
+ $this->logSessionActivity($player, 'PLAYER: ' . $message);
$data = [];
@@ -54,9 +55,43 @@ class GameResponseService
$data = $this->checkConsoleCommando($message, $player);
}
+ $responseLog = '';
+ if (isset($data['result']) && is_array($data['result'])) {
+ foreach ($data['result'] as $line) {
+ if (is_array($line)) {
+ $responseLog .= json_encode($line) . "\n";
+ } elseif (is_string($line) || is_numeric($line)) {
+ $responseLog .= (string)$line . "\n";
+ }
+ }
+ } elseif (isset($data['error'])) {
+ $responseLog = 'ERROR: ' . $data['error'];
+ }
+
+ if ($responseLog !== '') {
+ $this->logSessionActivity($player, 'SERVER: ' . trim($responseLog));
+ }
+
return $data;
}
+ private function logSessionActivity(Player $player, string $content): void
+ {
+ $sessionId = $player->getSession()->getId();
+ $username = $player->getUser()->getUsername();
+ $logDir = $this->projectDir . '/var/log/sessions/' . $sessionId;
+
+ if (!is_dir($logDir)) {
+ mkdir($logDir, 0777, true);
+ }
+
+ $logFile = $logDir . '/' . $username . '.txt';
+ $timestamp = date('Y-m-d H:i:s');
+ $logMessage = sprintf("[%s] %s\n", $timestamp, $content);
+
+ file_put_contents($logFile, $logMessage, FILE_APPEND);
+ }
+
private function getRechten(Player $player): array
{
$settingName = SessionSettingType::tryFrom('RightsForPlayer' . $player->getScreen());
diff --git a/src/Tech/Repository/UserRepository.php b/src/Tech/Repository/UserRepository.php
index 3417362..7742d1e 100644
--- a/src/Tech/Repository/UserRepository.php
+++ b/src/Tech/Repository/UserRepository.php
@@ -32,4 +32,16 @@ class UserRepository extends ServiceEntityRepository implements PasswordUpgrader
$this->getEntityManager()->persist($user);
$this->getEntityManager()->flush();
}
+
+ /**
+ * @return User[]
+ */
+ public function findByRole(string $role): array
+ {
+ return $this->createQueryBuilder('u')
+ ->andWhere('u.roles LIKE :role')
+ ->setParameter('role', '%"' . $role . '"%')
+ ->getQuery()
+ ->getResult();
+ }
}
diff --git a/templates/game/admin/index.html.twig b/templates/game/admin/index.html.twig
new file mode 100644
index 0000000..8378e8f
--- /dev/null
+++ b/templates/game/admin/index.html.twig
@@ -0,0 +1,82 @@
+{% extends 'base.html.twig' %}
+
+{% block title %}Game Admin Dashboard{% endblock %}
+
+{% block body %}
+
Game Admin Dashboard
+
+
+
+
All Players ({{ players|length }})
+
+
+
+ | ID |
+ Username |
+ Email |
+ Roles |
+ Verified |
+
+
+
+ {% for player in players %}
+
+ | {{ player.id }} |
+ {{ player.username }} |
+ {{ player.email }} |
+ {{ player.roles|join(', ') }} |
+ {{ player.isVerified ? 'Yes' : 'No' }} |
+
+ {% else %}
+
+ | No players found. |
+
+ {% endfor %}
+
+
+
+
+
+
All Sessions ({{ sessions|length }})
+
+
+
+ | ID |
+ Game |
+ Status |
+ Players Joined |
+ Created At |
+ Actions |
+
+
+
+ {% for session in sessions %}
+
+ | {{ session.id }} |
+ {{ session.game.name }} |
+ {{ session.status.value }} |
+
+
+ {% for p in session.players %}
+ - {{ p.user.username }} (Screen: {{ p.screen ?? 'N/A' }})
+ {% else %}
+ - No players
+ {% endfor %}
+
+ ({{ session.players|length }} / {{ session.game.numberOfPlayers }})
+ |
+ {{ session.created|date('Y-m-d H:i') }} |
+
+ View Game Logs
+ |
+
+ {% else %}
+
+ | No sessions found. |
+
+ {% endfor %}
+
+
+
+
+{% endblock %}
diff --git a/templates/game/admin/session.html.twig b/templates/game/admin/session.html.twig
new file mode 100644
index 0000000..b142302
--- /dev/null
+++ b/templates/game/admin/session.html.twig
@@ -0,0 +1,49 @@
+{% extends 'base.html.twig' %}
+
+{% block title %}View Session Logs - {{ session.id }}{% endblock %}
+
+{% block body %}
+ Session: {{ session.game.name }} (#{{ session.id }})
+ Back to Dashboard
+
+
+
+ {% for playerLog in playersLogs %}
+ -
+
+
+ {% endfor %}
+
+
+
+ {% for playerLog in playersLogs %}
+
+
Logs for {{ playerLog.username }}
+
{{ playerLog.logs ?: 'No logs found for this player.' }}
+
+ {% endfor %}
+
+
+{% endblock %}
diff --git a/templates/game/dashboard.html.twig b/templates/game/dashboard.html.twig
index 4836688..62b196c 100644
--- a/templates/game/dashboard.html.twig
+++ b/templates/game/dashboard.html.twig
@@ -5,6 +5,10 @@
{% block body %}
Game Dashboard
+ {% if is_granted('ROLE_ADMIN') %}
+ Go to Game Admin Dashboard
+ {% endif %}
+
Create New Session
{% if availableGames is not empty %}