<?php
namespace App\Controller\Client;
use App\Entity\VPN\Service\Service;
use App\Entity\VPN\Service\ServiceUsage;
use App\Repository\VPN\OcServ\ServerRepository;
use App\Repository\VPN\Service\ServiceRepository;
use App\Repository\VPN\Service\ServiceUsageRepository;
use App\Service\Util\NotificationService;
use App\Service\Util\OcServSSHApi;
use App\Service\Util\ServersAnalyticsUsageService;
use App\Service\Util\Telegram;
use DateTime;
use DateTimeImmutable;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\Routing\Annotation\Route;
class OcServController extends AbstractController
{
public ServerRepository $serversRepository;
public ServiceRepository $servicesRepository;
public EntityManagerInterface $entityManager;
public Telegram $telegram;
public function __construct(Telegram $telegram, EntityManagerInterface $entityManager, ServerRepository $serversRepository, ServiceRepository $servicesRepository)
{
$this->serversRepository = $serversRepository;
$this->servicesRepository = $servicesRepository;
$this->entityManager = $entityManager;
$this->telegram = $telegram;
}
#[Route('/client/oc-serv/dc-script/{username}', name: 'app_client_oc_serv_script')]
public function index($username,NotificationService $notificationService, Telegram $telegram,ServiceUsageRepository $serviceUsageRepository , Request $request, EntityManagerInterface $entityManager): JsonResponse
{
try {
$ciscoServerIp = $_SERVER['REMOTE_ADDR'] ?: null;
$server = $this->serversRepository->findOneBy(['ip' => $ciscoServerIp]);
if (!$server && $ciscoServerIp!== '20.171.207.48') {
// $this->telegram->sendRawMessage($ciscoServerIp);
return $this->json(['res' => false] , 403);
}
$calculationVolume = 1.5;
$analytics = new ServersAnalyticsUsageService($ciscoServerIp, $entityManager);
$in = $request->request->get('STATS_BYTES_IN');
$out = $request->request->get('STATS_BYTES_OUT');
$totalServerUsage = $in + $out;
$analytics->addServerUsage($ciscoServerIp, $totalServerUsage);
/**
* @var OcServService $ocService
*/
$clientId = substr($username, 1, -1);
$service = $this->entityManager->getRepository(Service::class)->findOneBy(['clientId' => $clientId]);
if ($service) {
$in = $request->request->get('STATS_BYTES_IN');
$out = $request->request->get('STATS_BYTES_OUT');
$newSizeUsed = $out + $in;
if (!$service->getExpireAt())
{
$now = new \DateTimeImmutable();
$expiredAt = $now->add(new \DateInterval("P{$service->getPlan()->getDays()}D"));
$service->setExpireAt($expiredAt);
$entityManager->flush();
}
$service->setOcServUsage(
(int)$service->getOcServUsage()
+
(int)((float)$calculationVolume * (int)$newSizeUsed));
if ($service->getPlan()->getServiceType() === 'unlimited' &&
$service->getCountry() !==
$server->getCountry()->getCode()){
// TODO Remove Service
}
$now = new \DateTime();
$todayUsageObject = $serviceUsageRepository->findOneBy(['service' => $service , 'date' => $now]);
if (!$todayUsageObject) {
$todayUsageObject = new ServiceUsage();
$todayUsageObject->setService($service);
$todayUsageObject->setDate(new \DateTime());
$entityManager->persist($todayUsageObject);
}
$todayUsageObject->setOcUsage(
$todayUsageObject->getOcUsage() +
(int)((float)$calculationVolume * (int)$newSizeUsed)
);
$this->entityManager->flush();
}
$this->entityManager->flush();
$this->entityManager->clear();
return $this->json(['res' => true], 200);
} catch (\Exception $exception) {
$notificationService->exception($exception);
// $telegram->exception($exception, 'Error On OcServ Disconnect Usage', $ciscoServerIp ?: null);
}
return $this->json(['res' => true]);
}
}