implement player stats

This commit is contained in:
ghost 2024-01-07 19:20:13 +02:00
parent 2955cbdabb
commit f1c08a20b9
4 changed files with 171 additions and 10 deletions

View file

@ -10,6 +10,7 @@ use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use App\Entity\Online;
use App\Entity\Player;
use Doctrine\ORM\EntityManagerInterface;
class MainController extends AbstractController
@ -28,7 +29,12 @@ class MainController extends AbstractController
): Response
{
// Prepare request
if (in_array($request->get('field'), ['time','players','bots','total']))
if ('online' == $request->get('sort') && in_array($request->get('field'), ['time','players','bots','total']))
{
$field = $request->get('field');
}
else if ('players' == $request->get('sort') && in_array($request->get('field'), ['name','frags','joined','online']))
{
$field = $request->get('field');
}
@ -68,6 +74,7 @@ class MainController extends AbstractController
$info = [];
$session = [];
$online = [];
$players = [];
// Generate CRC32 ID
$crc32server = crc32(
@ -128,7 +135,16 @@ class MainController extends AbstractController
[
'crc32server' => $crc32server
],
'online' == $request->get('sort') && $crc32server == $request->get('crc32server') ? [$field => $order] : ['id' => 'DESC'],
'online' == $request->get('sort') && $crc32server == $request->get('crc32server') ? [$field => $order] : ['time' => 'DESC'],
10
);
// Get players
$players = $entityManagerInterface->getRepository(Player::class)->findBy(
[
'crc32server' => $crc32server
],
'players' == $request->get('sort') && $crc32server == $request->get('crc32server') ? [$field => $order] : ['frags' => 'DESC'],
10
);
}
@ -161,6 +177,7 @@ class MainController extends AbstractController
'info' => $info,
'session' => $session,
'online' => $online,
'players' => $players,
'status' => $status
];
}

View file

@ -10,6 +10,7 @@ use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use App\Entity\Online;
use App\Entity\Player;
use Doctrine\ORM\EntityManagerInterface;
class RssController extends AbstractController
@ -106,4 +107,95 @@ class RssController extends AbstractController
throw $this->createNotFoundException();
}
#[Route(
'/rss/players/{crc32server}',
name: 'rss_players',
requirements:
[
'crc32server' => '\d+',
],
methods:
[
'GET'
]
)]
public function players(
?Request $request,
EntityManagerInterface $entityManagerInterface
): Response
{
// Get HLServers config
if ($hlservers = file_get_contents($this->getParameter('app.hlservers')))
{
$hlservers = json_decode($hlservers);
}
else
{
$hlservers = [];
}
// Find server info
foreach ($hlservers as $hlserver)
{
// Generate CRC32 server ID
$crc32server = crc32(
$hlserver->host . ':' . $hlserver->port
);
// Skip servers not registered in HLServers
if ($crc32server != $request->get('crc32server'))
{
continue;
}
// Get last players
$players = $entityManagerInterface->getRepository(Player::class)->findBy(
[
'crc32server' => $crc32server
],
[
'id' => 'DESC'
],
10
);
$result = [];
foreach ($players as $value)
{
$result[] =
[
'id' => $value->getId(),
'name' => $value->getName(),
'joined' => $value->getJoined()
];
}
// Response
$response = new Response();
$response->headers->set(
'Content-Type',
'text/xml'
);
return $this->render(
'default/rss/players.xml.twig',
[
'server' =>
[
'crc32' => $crc32server,
'host' => $hlserver->host,
'port' => $hlserver->port,
],
'players' => $result
],
$response
);
}
throw $this->createNotFoundException();
}
}