<?php
namespace App\Controller\Slots;
use App\Controller\BaseController;
use Doctrine\DBAL\Connection;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
class SlotsController extends BaseController
{
/**
* @Route("/api/slots/load", name="load_slots", methods={"GET"})
*/
public function loadSlots(Request $request, SessionInterface $session, Connection $db): JsonResponse
{
$page = max(1, (int) $request->query->get('page', 1));
$limit = 60;
$offset = ($page - 1) * $limit;
$query = trim((string) $request->query->get('q', ''));
$provider = trim((string) $request->query->get('provider', ''));
$sql = "
SELECT id, title, provider
FROM slots
WHERE `show` = 1
";
$params = [];
if ($query !== '') {
$sql .= " AND (title LIKE :q OR provider LIKE :q)";
$params['q'] = '%' . $query . '%';
}
if ($provider !== '') {
$sql .= " AND provider = :provider";
$params['provider'] = $provider;
}
$sql .= " ORDER BY priority DESC LIMIT $limit OFFSET $offset";
$slots = $db->fetchAllAssociative($sql, $params);
$slots = array_map(function ($slot) {
$cleanTitle = str_replace(' ', '', $slot['title']);
$slot['icon'] = "/assets/images/slots/{$cleanTitle}.jpg?v=6";
return $slot;
}, $slots);
return new JsonResponse([
'success' => true,
'data' => $slots
]);
}
/**
* @Route("/slots/play/{id}", name="play_slot", methods={"GET"})
*/
public function playSlot(int $id, SessionInterface $session, Connection $db, Request $request) {
$slot = $db->fetchAssociative('SELECT * FROM slots WHERE id = :id', ['id' => $id]);
if (!$slot) {
throw $this->createNotFoundException('Слот не найден');
}
$hash = $session->get('hash');
if (!$hash) {
return $this->redirectToRoute('main_page');
}
$user = $db->fetchAssociative('SELECT * FROM users WHERE hash = :hash', ['hash' => $hash]);
if (!$user) {
return $this->redirectToRoute('main_page');
}
$depositsTotal = $db->fetchOne("
SELECT SUM(suma)
FROM deposits
WHERE user_id = ?
AND status = 1
AND STR_TO_DATE(data, '%d-%m-%Y %H:%i:%s') >= DATE_SUB(NOW(), INTERVAL 7 DAY)
", [$user['id']]);
if ($depositsTotal < 200 && !in_array($user['admin'], [1, 3])) {
return $this->redirectToRoute('lobby_page', [
'denied' => 'deposit'
]);
}
$userId = $user['id'];
$game_id = $slot['game_id'];
$agregator = $slot['agregator'];
$alias = $slot['alias'];
$provider = $slot['provider'];
$authToken = $user['auth_token'];
$currency = $user['current_currency'];
$lang = $user['lang'];
$yt = (int) $user['admin'];
$wager = (int) $user['wager'];
$url = '';
$spin = null;
$db->beginTransaction();
try {
$spin = $db->fetchAssociative("
SELECT id, free_rounds, spin_amount, status
FROM free_rounds
WHERE user_id = :uid
AND game_id = :gid
AND status = 1
AND activated_at >= NOW() - INTERVAL 1 DAY
ORDER BY id
LIMIT 1
FOR UPDATE
", [
'uid' => $userId,
'gid' => $game_id,
]);
if (!$spin) {
$spin = $db->fetchAssociative("
SELECT id, free_rounds, spin_amount, status
FROM free_rounds
WHERE user_id = :uid
AND game_id = :gid
AND status = 0
AND (activated_at IS NULL OR activated_at >= NOW() - INTERVAL 1 DAY)
ORDER BY id
LIMIT 1
FOR UPDATE
", [
'uid' => $userId,
'gid' => $game_id,
]);
if ($spin) {
$db->executeStatement("
UPDATE free_rounds
SET activated_at = NOW()
WHERE id = :id
", ['id' => $spin['id']]);
}
}
if ($spin) {
$db->commit();
} else {
$db->rollBack();
}
} catch (Exception $e) {
$db->rollBack();
throw $e;
}
$db->executeStatement("
UPDATE free_rounds
SET status = 2
WHERE activated_at < NOW() - INTERVAL 1 DAY
AND status IN (0, 1)
");
$fsline = $spin ? '&freerounds_id=' . $spin['id'] : '';
$isMobile = $request->headers->has('X-Mobile') || str_contains(strtolower($request->headers->get('User-Agent', '')), 'mobile');
$mobileParam = $isMobile ? 'true' : 'false';
$partner = $yt == 1 || $yt == 3 ? 'so_yt11' : 'cosmotank';
$url = "https://pp.rmobule.games/games.start"
. "?partner.alias={$partner}&partner.session={$authToken}"
. "&game.provider={$provider}&game.alias={$alias}"
. "&lang={$lang}&lobby_url=https://flashbet.app/¤cy={$currency}&mobile={$mobileParam}{$fsline}";
return $this->render('play.html.twig', [
'slot' => $slot,
'launch_url' => $url,
]);
}
}