<?php
namespace App\Controller\Cronjob\BanCheck;
use App\DependencyInjection\JDF;
use App\Entity\VPN\Service\Service;
use App\Repository\Telegram\AgentPublicBot\BotRepository;
use App\Repository\Telegram\AgentPublicBot\BotUserRepository;
use App\Repository\VPN\Service\ServiceRepository;
use App\Service\SettingService;
use App\Service\Util\NotificationService;
use App\Service\Util\OcServSSHApi;
use App\Service\Util\Telegram;
use DateTimeImmutable;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Persistence\ManagerRegistry;
use Exception;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Stopwatch\Stopwatch;
class BanCheckController extends AbstractController
{
public EntityManagerInterface $entityManager;
private Telegram $telegram;
public function __construct(EntityManagerInterface $entityManager, Telegram $telegram)
{
$this->entityManager = $entityManager;
$this->telegram = $telegram;
}
#[Route('/cronjob/ban-check', name: 'app_cronjob_ban_check')]
public function OcBanCheck(ServiceRepository $serviceRepository,NotificationService $notificationService, \App\Repository\Generic\UserRepository $userRepository, BotRepository $botRepository, BotUserRepository $botUserRepository): JsonResponse
{
$now = new \DateTimeImmutable();
$jdf = new JDF();
// گرفتن تاریخ امروز در جلالی
$monthNumber = $jdf->trNum($jdf->date('m'));
$yearNumber = $jdf->trNum($jdf->date('Y'));
// گرفتن تعداد روزهای ماه جلالی
$lastDayOfMonth = $jdf->trNum($jdf->date('t', '', 'fa', $monthNumber));
// پیدا کردن تاریخ آخرین روز ماه جلالی
$endJalali = '1404/' . $monthNumber . '/' . $lastDayOfMonth;
// تبدیل به میلادی
[$gy, $gm, $gd] = $jdf->jalaliToGregorian($yearNumber, $monthNumber, $lastDayOfMonth);
$endDateTime = new \DateTime("$gy-$gm-$gd 23:59:59");
// چک کردن پنج دقیقه آخر روز
$isLastDayOfMonth = $now->format('Y-m-d') === $endDateTime->format('Y-m-d');
$isLastFiveMinutes = $now->format('H:i') >= '23:55' && $isLastDayOfMonth;
if ($isLastFiveMinutes) {
foreach ($userRepository->findAll() as $user) {
$user->setGiftWallet(0);
}
}
$this->entityManager->flush();
// دو روزه که سرویس فعال نشده
$now = new \DateTimeImmutable();
foreach ($serviceRepository->getMoreThanDaysNotStarted(2) as $service) {
/**
* @var Service $service
*/
$service->setExpireAt($now->modify("+{$service->getPlan()->getDays()} day"));
}
$this->entityManager->flush();
foreach ($botRepository->findBy(['active' => 1]) as $bot) {
$bot->setUsersCount(count($botUserRepository->findBy(['active' => 1, 'bot' => $bot])));
$bot->setServicesCount(count($serviceRepository->findBy(['isEnabled' => 1, 'creatorBot' => $bot])));
}
$this->entityManager->flush();
foreach ($serviceRepository->findBy(['isEnabled' => 1]) as $service) {
$service->setUsed(
$service->getOcServUsage() +
$service->getV2rayUsage() +
$service->getOpenVpnUsage()
);
if ($service->getExpireAt() == null && ((int)$service->getUsed() !== 0 || (int)$service->getV2rayUsage() !== 0 || (int)$service->getOpenVpnUsage() !== 0 || (int)$service->getOcServUsage() !== 0)) {
$now = $service->getCreatedAt();
$expiredAt = $now->add(new \DateInterval("P{$service->getPlan()->getDays()}D"));
$service->setExpireAt(new \DateTimeImmutable($expiredAt->format('Y-m-d H:i:s')));
}
}
$this->entityManager->flush();
$this->entityManager->flush();
try {
foreach ($serviceRepository->getMoreSizes() as $service) {
/**
* @var Service $service
*/
$service->setIsEnabled(0);
$mainBot = $botRepository->findOneBy(['isBotForWebsite' => 1]);
try {
/**
* @var Service $service
*/
$keyboard = json_encode([
"inline_keyboard" => [
[
[
"text" => "تمیدید مستقیم سرویس {$service->getClientId()} - {$service->getUsername()}",
"url" => "https://tehrannet.org/panel/user/vpn/service/charge/{$service->getId()}"
]
]
]
]);
$message = "#اطلاعیه" . PHP_EOL;
$message = $message . "#پایان" . PHP_EOL;
$message = $message . "سرویس شما به پایان رسید برای جلو گیری از قطعی سرویس را تمدید فرمایید" . PHP_EOL;
$message = $message . "شناسه سرویس : " . $service->getClientId() . PHP_EOL;
$message = $message . "نام کاربری سرویس : " . $service->getUsername() . PHP_EOL;
$service->setDoneNotif(1);
$this->sendMessage($mainBot->getToken(), $service->getOwner()->getConnectedTelegramUserId()['userId'], $message, $keyboard);
try {
$creatorBot = $service->getCreatorBot();
$botUser = $service->getBotUser();
if ($creatorBot && $botUser) {
$message = "#اطلاعیه" . PHP_EOL;
$message = $message . "#پایان" . PHP_EOL;
$message = $message . "سرویس شما به پایان رسید برای جلو گیری از قطعی سرویس را تمدید فرمایید" . PHP_EOL;
$message = $message . "شناسه سرویس : " . $service->getClientId() . PHP_EOL;
$message = $message . "نام کاربری سرویس : " . $service->getUsername() . PHP_EOL;
$userBot = $service->getBotUser();
$this->sendMessage($creatorBot->getToken(), $userBot->getUserId(), $message);
}
} catch (\Exception $exception) {
$notificationService->exception($exception);
}
} catch (\Exception $exception) {
$notificationService->exception($exception);
$service->getOwner()->setConnectedTelegramUserId([]);
$this->entityManager->flush();
}
$this->entityManager->flush();
}
$this->entityManager->flush();
foreach ($serviceRepository->getMoreDates() as $service) {
/**
* @var Service $service
*/
$service->setIsEnabled(0);
$mainBot = $botRepository->findOneBy(['isBotForWebsite' => 1]);
try {
/**
* @var Service $service
*/
$keyboard = json_encode([
"inline_keyboard" => [
[
[
"text" => "تمیدید مستقیم سرویس {$service->getClientId()} - {$service->getUsername()}",
"url" => "https://tehrannet.org/panel/user/vpn/service/charge/{$service->getId()}"
]
]
]
]);
$message = "#اطلاعیه" . PHP_EOL;
$message = $message . "#پایان" . PHP_EOL;
$message = $message . "سرویس شما به پایان رسید برای جلو گیری از قطعی سرویس را تمدید فرمایید" . PHP_EOL;
$message = $message . "شناسه سرویس : " . $service->getClientId() . PHP_EOL;
$message = $message . "نام کاربری سرویس : " . $service->getUsername() . PHP_EOL;
$service->setDoneNotif(1);
$this->sendMessage($mainBot->getToken(), $service->getOwner()->getConnectedTelegramUserId()['userId'], $message, $keyboard);
try {
$creatorBot = $service->getCreatorBot();
$botUser = $service->getBotUser();
if ($creatorBot && $botUser) {
$message = "#اطلاعیه" . PHP_EOL;
$message = $message . "#پایان" . PHP_EOL;
$message = $message . "سرویس شما به پایان رسید برای جلو گیری از قطعی سرویس را تمدید فرمایید" . PHP_EOL;
$message = $message . "شناسه سرویس : " . $service->getClientId() . PHP_EOL;
$message = $message . "نام کاربری سرویس : " . $service->getUsername() . PHP_EOL;
$userBot = $service->getBotUser();
$this->sendMessage($creatorBot->getToken(), $userBot->getUserId(), $message);
}
} catch (\Exception $exception) {
$notificationService->exception($exception);
}
} catch (\Exception $exception) {
$notificationService->exception($exception);
$service->getOwner()->setConnectedTelegramUserId([]);
$this->entityManager->flush();
}
$this->entityManager->flush();
}
$this->entityManager->flush();
} catch (Exception $exception) {
$notificationService->exception($exception);
// $this->telegram->exception($exception);
}
$this->entityManager->clear();
return $this->json(['res' => true]);
}
public function sendMessageToKhan($text, $userId)
{
$khanToken = '7643631774:AAHCQFpLwIDEyPGeljpCRIvlOolgxZD2jhk';
$khanUsername = "@khanvpn_official";
try {
$this->bot('sendMessage', [
'chat_id' => $userId,
'text' => $text,
'reply_markup' => json_encode([
"inline_keyboard" => [
[
[
"text" => "شروع",
"callback_data" => "/start"
]
]
]]
)
], $khanToken);
} catch (\Exception $exception) {
// $telegramUser->setActive(0);
// $telegramUser->setDeletedAt(new \DateTime());
// $this->entityManager->flush();
}
}
public function bot($method, $data, $token = null): bool|string
{
$setting = new SettingService($this->entityManager);
if ($token == null) {
$token = $setting->getSetting('superBotToken');
}
$telegramApiUrl = 'https://api.telegram.org/bot' . $token . '/';
return file_get_contents($telegramApiUrl . $method . '?' . str_replace('&', '&', http_build_query($data)));
}
private function sendMessage($token, string $chatId, string $text, $keyboard = [], $markdown = null, bool $silent = false): void
{
$url = sprintf(
'https://api.telegram.org/bot%s/sendMessage',
$token
);
$payload = [
'chat_id' => $chatId,
'text' => ($text),
'disable_notification' => $silent, // Set to true for silent messages
'reply_markup' => $keyboard
];
if ($markdown) {
$payload['parse_mode'] = $markdown;
}
$this->sendRequest($url, $payload);
}
private function sendRequest(string $url, array $payload)
{
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
$response = curl_exec($ch);
if (curl_errno($ch)) {
// Log or handle the error
throw new \Exception('Curl error: ' . curl_error($ch));
}
curl_close($ch);
return $response; // Return the response for further processing
}
}