* @category Class * @license https://www.gnu.org/licenses/lgpl-3.0.en.html GNU Lesser General Public License * @link www.splendidbear.org * @since 2026. 04. 09. */ #[AsController] class GameController extends AbstractController { public function __construct( #[Autowire(env: 'APP_ENV')] private readonly string $env, #[Autowire(env: 'MERCURE_PUBLIC_URL')] private readonly string $mercurePublicUrl, #[Autowire(env: 'MERCURE_SUBSCRIBER_JWT')] private readonly string $mercureSubscriberJwt, #[Autowire(env: 'APP_CONTACT_MAIL_ADDRESS')] private readonly string $appContactMailAddress, private readonly LoggerInterface $logger, ) { } #[Route('/', name: 'MineSeekerBundle_homepage')] public function index(): Response { return $this->render('Game/index.html.twig'); } #[Route('/play', name: 'MineSeekerBundle_gamePlay')] #[Route('/play/{gameAssoc}', name: 'MineSeekerBundle_gamePlayWId')] public function play(): Response { return $this->render('Game/play.html.twig', [ 'env' => $this->env, 'mercure_hub_url' => $this->mercurePublicUrl, 'mercure_subscriber_jwt' => $this->mercureSubscriberJwt, ]); } #[Route('/privacy-policy', name: 'MineSeekerBundle_privacy')] public function privacy(): Response { return $this->render('Official/privacy.html.twig'); } #[Route('/terms-of-service', name: 'MineSeekerBundle_terms')] public function terms(): Response { return $this->render('Official/terms.html.twig'); } #[Route('/contact', name: 'MineSeekerBundle_contact')] public function contact( Request $request, EntityManagerInterface $em, MailerInterface $mailer, ): Response { $contactMessage = new ContactMessage(); $form = $this->createForm(ContactFormType::class, $contactMessage); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $contactMessage->setIpAddress($request->getClientIp()); $em->persist($contactMessage); $em->flush(); $this->sendMail($mailer, $contactMessage); $this->addFlash('contact_success', 'Thank you for your message! We will get back to you soon.'); return $this->redirectToRoute('MineSeekerBundle_contact'); } return $this->render('Official/contact.html.twig', [ 'form' => $form, ]); } #[Route('/landing-page', name: 'MineSeekerBundle_landing')] public function landing(): Response { return $this->render('Official/landing.html.twig'); } public function sendMail(MailerInterface $mailer, ContactMessage $contactMessage): void { try { $mailer->send( new TemplatedEmail() ->from('noreply@mineseeker.hu') ->to($this->appContactMailAddress) ->replyTo($contactMessage->getEmail()) ->subject('New Contact Message from ' . $contactMessage->getName()) ->htmlTemplate('emails/contact_notification.html.twig') ->context(['message' => $contactMessage]) ); } catch (\Exception $e) { $this->logger->error('Failed to send contact notification email: ' . $e->getMessage(), [ 'exception' => $e, 'message' => $contactMessage, ]); throw new RuntimeException('Failed to send contact notification email: ' . $e->getMessage()); } catch (TransportExceptionInterface $e) { $this->logger->error('Failed to send contact notification email: ' . $e->getMessage(), [ 'exception' => $e, 'message' => $contactMessage, ]); throw new RuntimeException('Failed to send contact notification email: ' . $e->getMessage()); } } }