<?php
namespace App\Controller\VPN\ServicePanel;
use App\DependencyInjection\JDF;
use App\Entity\VPN\OcServ\Server;
use App\Entity\VPN\Service\Service;
use App\Entity\VPN\Service\ServiceUsage;
use App\Repository\VPN\Service\ServiceRepository;
use App\Repository\VPN\Service\ServiceUsageRepository;
use App\Repository\VPN\V2ray\ServerRepository;
use App\Service\Util\V2rayConnectionMaker;
use App\Service\VPN\Service\ServiceService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
final class ServicePanelController extends AbstractController
{
public EntityManagerInterface $entityManager;
public ServiceService $serviceService;
public function __construct(EntityManagerInterface $entityManager, ServiceService $serviceService)
{
$this->entityManager = $entityManager;
$this->serviceService = $serviceService;
}
#[Route('/vpn/servcie-panel/no-password/{id}', name: 'app_vpn_service_panel_no_password')]
public function index(Service $service, ServiceUsageRepository $serviceUsageRepository, Request $request, ServerRepository $serverRepository, \App\Repository\VPN\OcServ\ServerRepository $ocServServerRepository, \App\Repository\VPN\OpenVPN\ServerRepository $openServerRepository)
{
$session = $request->getSession();
// if ($this->getUser() || ($service->getCreatorBot()->getTitle() && $request->get('bot') == $service->getCreatorBot()->getTitle()) ) {
// $session->set('clientId', $service->getClientId());
// }
//
// if ($session->get('clientId') == null) {
// return $this->redirectToRoute('app_site_panel_login');
// }
$now = new \DateTimeImmutable();
$jdf = new JDF();
$monthNumber = $request->query->get('month') ?: $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);
$usages = $serviceUsageRepository->getBetweenDays($startDateTime, $endDateTime, $service);
$data = [];
foreach ($usages as $usage) {
/**
* @var ServiceUsage $usage
*/
$data[] = [
'date' => $usage->getDate(),
'v2ray' => $usage->getV2rayUsage(),
'cisco' => $usage->getOcUsage(),
'open' => $usage->getOpenUsage()
];
}
if ($service->getPlan()->getServiceType() === 'unlimited' && ($service->getCountry() === 'all' || $service->getCountry() === '' || $service->getCountry() === null)) {
if ($service->getPlan()->getProtocol() === 'v2ray') {
$service->setCountry($serverRepository->findOneBy(['active' => 1])->getCountry()->getCode());
$this->entityManager->flush();
}
if ($service->getPlan()->getProtocol() === 'ocserv') {
$service->setCountry($ocServServerRepository->findOneBy(['active' => 1])->getCountry()->getCode());
$this->entityManager->flush();
}
if ($service->getPlan()->getProtocol() === 'open') {
$service->setCountry($openServerRepository->findOneBy(['active' => 1])->getCountry()->getCode());
$this->entityManager->flush();
}
}
if (!$service->getExpireAt()) {
$now = new \DateTimeImmutable();
$expiredAt = $now->add(new \DateInterval("P{$service->getPlan()->getDays()}D"));
$service->setExpireAt($expiredAt);
$this->entityManager->flush();
}
$this->serviceService->pushServiceToServers($service);
return $this->render('vpn/service-panel/dashboard.html.twig', [
'service' => $service,
'ocServers' => $this->entityManager->getRepository(Server::class)->findBy(['active' => 1]),
'openServers' => $this->entityManager->getRepository(\App\Entity\VPN\OpenVPN\Server::class)->findBy(['active' => 1]),
'usageReport' => $data,
'month' => $monthNumber,
]);
}
#[Route('/vpn/servcie-panel/no-password/smart-check/{id}', name: 'app_vpn_service_panel_no_password_smart_check')]
public function check(Service $service)
{
$this->serviceService->pushRemoveToServers($service);
$this->serviceService->pushServiceToServers($service);
$this->addFlash('success', 'سرویس شما بر روی تمامی سرور های ما وجود دارد و اتصال بررسی شد لطفا مجددا اقدام به اتصال نمایید');
return $this->redirectToRoute('app_vpn_service_panel_no_password', ['id' => $service->getId()]);
}
#[Route('/service/{id}/subscription-url', name: 'app_vpn_service_panel_subscription_url')]
public function subscriptionUrl($id, ServerRepository $serverRepository)
{
$generator = new V2rayConnectionMaker($serverRepository);
$service = $this->getDoctrine()->getRepository(Service::class)->find($id);
if (!$service) {
$connections = $generator->notFound();
$string = '';
foreach ($connections as $connection) {
if (count($connection['configs']) > 0) {
foreach ($connection['configs'] as $singleConfigLine) {
$string = $string . $singleConfigLine['text'] . PHP_EOL;
}
}
}
return $this->render('vpn/service-panel/subscription-url.html.twig', [
'data' => $string
]);
}
$this->serviceService->pushServiceToServers($service);
if (!$service->getExpireAt()) {
$now = new \DateTimeImmutable();
$expiredAt = $now->add(new \DateInterval("P{$service->getPlan()->getDays()}D"));
$service->setExpireAt($expiredAt);
$this->entityManager->flush();
}
if ($service->isEnabled()) {
$connections = $generator->generate($service);
} else {
$connections = $generator->expired($service);
}
$string = '';
foreach ($connections as $connection) {
if (count($connection['configs']) > 0) {
foreach ($connection['configs'] as $singleConfigLine) {
$string = $string . $singleConfigLine['text'] . PHP_EOL;
}
}
}
return $this->render('vpn/service-panel/subscription-url.html.twig', [
'data' => $string
]);
}
#[Route('/v2/{clientId}/subscription/{username}/{subType}', name: 'app_site_verify_service_subscription_operator')]
public function subscriptionUrlOldV2($clientId, ServerRepository $serverRepository, ServiceRepository $serviceRepository)
{
$service = $serviceRepository->findOneBy(['clientId' => $clientId]);
$generator = new V2rayConnectionMaker($serverRepository);
if (!$service) {
$connections = $generator->notFound();
$string = '';
foreach ($connections as $connection) {
if (count($connection['configs']) > 0) {
foreach ($connection['configs'] as $singleConfigLine) {
$string = $string . $singleConfigLine['text'] . PHP_EOL;
}
}
}
return $this->render('vpn/service-panel/subscription-url.html.twig', [
'data' => $string
]);
}
if (!$service->getExpireAt()) {
$now = new \DateTimeImmutable();
$expiredAt = $now->add(new \DateInterval("P{$service->getPlan()->getDays()}D"));
$service->setExpireAt($expiredAt);
$this->entityManager->flush();
}
$generator = new V2rayConnectionMaker($serverRepository);
if ($service->isEnabled()) {
$connections = $generator->generate($service);
} else {
$connections = $generator->expired($service);
}
$string = '';
foreach ($connections as $connection) {
if (count($connection['configs']) > 0) {
foreach ($connection['configs'] as $singleConfigLine) {
$string = $string . $singleConfigLine['text'] . PHP_EOL;
}
}
}
return $this->render('vpn/service-panel/subscription-url.html.twig', [
'data' => $string
]);
}
#[Route('/v2ip/{clientId}/subscription/{username}/{subType}', name: 'app_site_panel_vip_v2ray_subscription')]
public function subscriptionUrlOldV2Vip($clientId, ServerRepository $serverRepository, ServiceRepository $serviceRepository)
{
$service = $serviceRepository->findOneBy(['clientId' => $clientId]);
$generator = new V2rayConnectionMaker($serverRepository);
if (!$service) {
$connections = $generator->notFound();
$string = '';
foreach ($connections as $connection) {
if (count($connection['configs']) > 0) {
foreach ($connection['configs'] as $singleConfigLine) {
$string = $string . $singleConfigLine['text'] . PHP_EOL;
}
}
}
return $this->render('vpn/service-panel/subscription-url.html.twig', [
'data' => $string
]);
}
if (!$service->getExpireAt()) {
$now = new \DateTimeImmutable();
$expiredAt = $now->add(new \DateInterval("P{$service->getPlan()->getDays()}D"));
$service->setExpireAt($expiredAt);
$this->entityManager->flush();
}
$generator = new V2rayConnectionMaker($serverRepository);
if ($service->isEnabled()) {
$connections = $generator->generate($service);
} else {
$connections = $generator->expired($service);
}
$string = '';
foreach ($connections as $connection) {
if (count($connection['configs']) > 0) {
foreach ($connection['configs'] as $singleConfigLine) {
$string = $string . $singleConfigLine['text'] . PHP_EOL;
}
}
}
return $this->render('vpn/service-panel/subscription-url.html.twig', [
'data' => $string
]);
}
#[Route('/v2/no-pass/{id}', name: 'app_site_panel_v2_no_password')]
public function app_site_panel_v2_no_password(Service $service): Response
{
return $this->redirectToRoute('app_vpn_service_panel_no_password', ['id' => $service->getId()]);
}
}