/ src / Controller / RssController.php
RssController.php
  1  <?php
  2  
  3  namespace App\Controller;
  4  
  5  use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  6  use Symfony\Contracts\Translation\TranslatorInterface;
  7  
  8  use Symfony\Component\Routing\Annotation\Route;
  9  use Symfony\Component\HttpFoundation\Response;
 10  use Symfony\Component\HttpFoundation\Request;
 11  
 12  use App\Entity\Online;
 13  use App\Entity\Player;
 14  use App\Entity\Server;
 15  
 16  use Doctrine\ORM\EntityManagerInterface;
 17  
 18  class RssController extends AbstractController
 19  {
 20      #[Route(
 21          '/rss/online/{crc32server}',
 22          name: 'rss_online',
 23          requirements:
 24          [
 25              'crc32server' => '\d+',
 26          ],
 27          methods:
 28          [
 29              'GET'
 30          ]
 31      )]
 32      public function online(
 33          ?Request $request,
 34          EntityManagerInterface $entityManagerInterface
 35      ): Response
 36      {
 37          $online = [];
 38  
 39          foreach ($entityManagerInterface->getRepository(Online::class)->findBy(
 40              [
 41                  'crc32server' => $request->get('crc32server')
 42              ],
 43              [
 44                  'id' => 'DESC' // same as online.time but faster
 45              ],
 46              10
 47          ) as $value)
 48          {
 49              $online[] =
 50              [
 51                  'id'      => $value->getId(),
 52                  'bots'    => $value->getBots(),
 53                  'players' => $value->getPlayers(),
 54                  'total'   => $value->getTotal(),
 55                  'time'    => $value->getTime()
 56              ];
 57          }
 58  
 59          // Response
 60          $response = new Response();
 61  
 62          $response->headers->set(
 63              'Content-Type',
 64              'text/xml'
 65          );
 66  
 67          return $this->render(
 68              'default/rss/online.xml.twig',
 69              [
 70                  'server' =>
 71                  [
 72                      'crc32server' => $request->get('crc32server'),
 73                      'online'      => $online
 74                  ]
 75              ],
 76              $response
 77          );
 78  
 79          throw $this->createNotFoundException();
 80      }
 81  
 82      #[Route(
 83          '/rss/players/{crc32server}',
 84          name: 'rss_players',
 85          requirements:
 86          [
 87              'crc32server' => '\d+',
 88          ],
 89          methods:
 90          [
 91              'GET'
 92          ]
 93      )]
 94      public function players(
 95          ?Request $request,
 96          EntityManagerInterface $entityManagerInterface
 97      ): Response
 98      {
 99          $players = [];
100  
101          foreach ($entityManagerInterface->getRepository(Player::class)->findBy(
102              [
103                  'crc32server' => $request->get('crc32server')
104              ],
105              [
106                  'id' => 'DESC'
107              ],
108              10
109          ) as $value)
110          {
111              $players[] =
112              [
113                  'id'     => $value->getId(),
114                  'name'   => $value->getName(),
115                  'joined' => $value->getJoined()
116              ];
117          }
118  
119          // Response
120          $response = new Response();
121  
122          $response->headers->set(
123              'Content-Type',
124              'text/xml'
125          );
126  
127          return $this->render(
128              'default/rss/players.xml.twig',
129              [
130                  'server' =>
131                  [
132                      'crc32server' => $request->get('crc32server'),
133                      'players'     => $players
134                  ]
135              ],
136              $response
137          );
138      }
139  }