<?php
namespace App\Controller\Cronjob\Panel;
use App\DependencyInjection\jDateTime;
use App\DependencyInjection\JDF;
use App\Entity\Analytics;
use App\Repository\AnalyticsRepository;
use App\Repository\Generic\UserRepository;
use App\Repository\Telegram\Public\TelegramPaymentRepository;
use App\Repository\TransactionRepository;
use App\Repository\VPN\Service\ServiceRepository;
use App\Service\SettingService;
use App\Service\TransactionService;
use App\Service\Util\NotificationService;
use DateTime;
use DateTimeImmutable;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DomCrawler\Crawler;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\HttpClient\HttpClientInterface;
class PanelCronController extends AbstractController
{
public TransactionService $service;
public \App\Service\Util\Telegram $telegram;
public ?Request $request;
private $client;
private EntityManagerInterface $entityManager;
public function __construct(\App\Service\Util\Telegram $telegram, TransactionService $service, RequestStack $requestStack, HttpClientInterface $client, EntityManagerInterface $em, private HttpClientInterface $clientProcessor)
{
$this->service = $service;
$this->request = $requestStack->getCurrentRequest();
$this->client = $client;
$this->entityManager = $em;
$this->telegram = $telegram;
}
#[Route('/cronjob/panel/dollar/cron', name: 'app_cronjob_panel_dollar')]
public function dollar(NotificationService $notificationService): JsonResponse
{
$haveError = false;
try {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api-v2.arzinja.app/api/v1/market/all-market?page=1&per_page=1&base_asset=TRX&provider_type=otc');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
$headers = array();
$headers[] = 'Accept: application/json, text/plain, */*';
$headers[] = 'Accept-Language: en-US,en;q=0.9,fa-IR;q=0.8,fa;q=0.7';
$headers[] = 'Dnt: 1';
$headers[] = 'Origin: https://arzinja.info';
$headers[] = 'Priority: u=1, i';
$headers[] = 'Referer: https://arzinja.info/';
$headers[] = 'Sec-Ch-Ua: \"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"';
$headers[] = 'Sec-Ch-Ua-Mobile: ?0';
$headers[] = 'Sec-Ch-Ua-Platform: \"macOS\"';
$headers[] = 'Sec-Fetch-Dest: empty';
$headers[] = 'Sec-Fetch-Mode: cors';
$headers[] = 'Sec-Fetch-Site: cross-site';
$headers[] = 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$tronNewData = curl_exec($ch);
curl_close($ch);
$tronNewDataJson = $tronNewData;
$tronDataArray = json_decode($tronNewDataJson, true);
if ($tronDataArray['success']){
$tronSellPrice = $tronDataArray['result'][0]['TRXIRT']['stats']['lastPrice'];
$tronBuyPrice = $tronDataArray['result'][0]['TRXIRT']['stats']['lastPrice'];
$settingObject = new SettingService($this->entityManager);
$settingObject->updateSetting('tron_buy', $tronBuyPrice);
$settingObject->updateSetting('tron_sell', $tronSellPrice);
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api-v2.arzinja.app/api/v1/market/all-market?page=1&per_page=1&base_asset=usdt&provider_type=otc');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
$headers = array();
$headers[] = 'Accept: application/json, text/plain, */*';
$headers[] = 'Accept-Language: en-US,en;q=0.9,fa-IR;q=0.8,fa;q=0.7';
$headers[] = 'Dnt: 1';
$headers[] = 'Origin: https://arzinja.info';
$headers[] = 'Priority: u=1, i';
$headers[] = 'Referer: https://arzinja.info/';
$headers[] = 'Sec-Ch-Ua: \"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"';
$headers[] = 'Sec-Ch-Ua-Mobile: ?0';
$headers[] = 'Sec-Ch-Ua-Platform: \"macOS\"';
$headers[] = 'Sec-Fetch-Dest: empty';
$headers[] = 'Sec-Fetch-Mode: cors';
$headers[] = 'Sec-Fetch-Site: cross-site';
$headers[] = 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$tronNewData = curl_exec($ch);
curl_close($ch);
$tronNewDataJson = $tronNewData;
$tronDataArray = json_decode($tronNewDataJson, true);
if ($tronDataArray['success']){
$tronSellPrice = $tronDataArray['result'][0]['USDTIRT']['stats']['lastPrice'];
$tronBuyPrice = $tronDataArray['result'][0]['USDTIRT']['stats']['lastPrice'];
$settingObject = new SettingService($this->entityManager);
$settingObject->updateSetting('usdt_buy', $tronBuyPrice);
$settingObject->updateSetting('usdt_sell', $tronSellPrice);
}
// $settingObject = new SettingService($this->entityManager);
// $settingObject->updateSetting('usd_buy', $buyPrice);
// $settingObject->updateSetting('usd', $buyPrice);
// $settingObject->updateSetting('usd_sell', $sellPrice);
// var_dump($sellPrice);die;
} catch (Exception $exception) {
$notificationService->exception($exception);
$haveError = true;
}
if (!$haveError) {
}
return $this->json(['res' => true]);
}
#[Route('/cronjob/panel/analytics', name: 'app_cronjob_panel_analytics')]
public function analytics(ServiceRepository $serviceRepository , AnalyticsRepository $analyticsRepository, TransactionRepository $transactionRepository): JsonResponse
{
// For Main Panel
$haveError = false;
// try {
$now = new DateTime(); // Get the current date
// Loop through the last 30 days
for ($i = 0; $i <= 3; $i++) {
// Subtract $i days from today
$currentDate = clone $now; // Clone to avoid modifying the original $now
$currentDate->modify('-' . $i . ' day'); // Modify the date by subtracting $i days
// Check if an analytics record exists for the current date
$analyticsObject = $analyticsRepository->findOneBy(['date' => $currentDate]);
if (!$analyticsObject) {
$analyticsObject = new Analytics();
$analyticsObject->setDate($currentDate);
}
// Get the required data for the current date
$increaseValue = $transactionRepository->getIncreaseForDate($currentDate);
$boughtVolume = $transactionRepository->getBoughtVolume($currentDate);
$totalBought = 0;
// Set the analytics data for the current date
$analyticsObject->setVip($serviceRepository->getTotalSellForDateCount($currentDate , 'sized' , 'vip'));
$analyticsObject->setOcServ($serviceRepository->getTotalSellForDateCount($currentDate , 'sized' , 'ocserv'));
$analyticsObject->setOcServUnlimited($serviceRepository->getTotalSellForDateCount($currentDate , 'unlimited' , 'ocserv'));
$analyticsObject->setV2ray($serviceRepository->getTotalSellForDateCount($currentDate , 'sized' , 'v2ray'));
$analyticsObject->setV2rayUnlimited($serviceRepository->getTotalSellForDateCount($currentDate , 'unlimited' , 'v2ray'));
$analyticsObject->setOpen($serviceRepository->getTotalSellForDateCount($currentDate , 'sized' , 'open'));
$analyticsObject->setOpenUnlimited($serviceRepository->getTotalSellForDateCount($currentDate , 'unlimited' , 'open'));
$analyticsObject->setBoughtVolume($boughtVolume);
// Calculate total bought volume for the current date
$totalBought += $analyticsObject->getVip();
$totalBought += $analyticsObject->getV2ray();
$totalBought += $analyticsObject->getV2rayUnlimited();
$totalBought += $analyticsObject->getOpen();
$totalBought += $analyticsObject->getOpenUnlimited();
$totalBought += $analyticsObject->getOcServ();
$totalBought += $analyticsObject->getOcServUnlimited();
$analyticsObject->setBoughtService($totalBought);
$analyticsObject->setWalletIncrease($increaseValue);
// Persist the analytics data for the current date
$this->entityManager->persist($analyticsObject);
}
// Flush all persisted data at once after the loop
$this->entityManager->flush();
$this->entityManager->clear(); // Clear to free memory after flush
// } catch (Exception $exception) {
// $haveError = true;
// }
// Return success response
return $this->json(['res' => true]);
}
#[Route('/cronjob/panel/user', name: 'app_cronjob_panel_user')]
public function app_cronjob_panel_user(NotificationService $notificationService , ServiceRepository $serviceRepository ,EntityManagerInterface $entityManager, UserRepository $userRepository, TransactionRepository $transactionRepository): JsonResponse
{
try {
$jdf = new JDF();
$monthNumber = (int)$jdf->trNum($jdf->date('m'));
$startJalali = '1404/' . $monthNumber . '/1';
$endJalali = '1404/' . $monthNumber . '/' . $jdf->trNum($jdf->date('t', '', 'fa', $monthNumber));
$startDateTime = $jdf->jalaliToGregorian(explode('/', $startJalali)[0], explode('/', $startJalali)[1], explode('/', $startJalali)[2])[0] . '-' . $jdf->jalaliToGregorian(explode('/', $startJalali)[0], explode('/', $startJalali)[1], explode('/', $startJalali)[2])[1] . '-' . $jdf->jalaliToGregorian(explode('/', $startJalali)[0], explode('/', $startJalali)[1], explode('/', $startJalali)[2])[2] . ' 00:00:00';
$startDateTime = new \DateTime($startDateTime);
$endDateTime = $jdf->jalaliToGregorian(explode('/', $endJalali)[0], explode('/', $endJalali)[1], explode('/', $endJalali)[2])[0] . '-' . $jdf->jalaliToGregorian(explode('/', $endJalali)[0], explode('/', $endJalali)[1], explode('/', $endJalali)[2])[1] . '-' . $jdf->jalaliToGregorian(explode('/', $endJalali)[0], explode('/', $endJalali)[1], explode('/', $endJalali)[2])[2] . ' 00:00:00';
$endDateTime = new \DateTime($endDateTime);
foreach ($userRepository->findBy(['deletedAt' => null, 'active' => 1]) as $user) {
$sum = $transactionRepository->getUserMonthCharge($user, $startDateTime, $endDateTime);
$user->setThisMonthCharge($sum);
$dates = [
$serviceRepository->findOneBy(['owner' => $user, 'isEnabled' => 1], ['createdAt' => 'DESC'])?->getCreatedAt()->format('Y-m-d H:i:s'),
];
$lastBuyString = date("Y-m-j H:i:s", max(array_map('strtotime', $dates)));
$user->setLastBuy(new DateTimeImmutable($lastBuyString));
$user->setVpnServicesCount(count($serviceRepository->findBy(['owner' => $user, 'isEnabled' => 1], ['createdAt' => 'DESC'])));
$this->entityManager->flush();
}
$this->entityManager->flush();
$this->entityManager->clear();
} catch (Exception $exception) {
$notificationService->exception($exception);
// $this->telegram->exception($exception);
}
return $this->json(['res' => true]);
}
}