<?php
namespace App\Controller\Telegram\AgentPublicBot;
use App\DependencyInjection\JDF;
use App\Entity\Country;
use App\Entity\Generic\User;
use App\Entity\SubTransactions\ArzDigital;
use App\Entity\Telegram\AgentPublicBot\Bot;
use App\Entity\Telegram\AgentPublicBot\BotCampaign;
use App\Entity\Telegram\AgentPublicBot\BotPlan;
use App\Entity\Telegram\AgentPublicBot\BotTransaction;
use App\Entity\Telegram\AgentPublicBot\BotUser;
use App\Entity\Transaction;
use App\Entity\VPN\Service\Plan;
use App\Entity\VPN\Service\Service;
use App\Entity\VPN\V2ray\Server;
use App\Form\VPN\Service\Service\LimitedOcServType;
use App\Form\VPN\Service\Service\LimitedOpenType;
use App\Form\VPN\Service\Service\LimitedV2rayType;
use App\Form\VPN\Service\Service\LimitedVipType;
use App\Form\VPN\Service\Service\UnlimitedOcServType;
use App\Form\VPN\Service\Service\UnlimitedOpenType;
use App\Form\VPN\Service\Service\UnlimitedV2rayType;
use App\Repository\Telegram\AgentPublicBot\BotPlanRepository;
use App\Repository\Telegram\AgentPublicBot\BotRepository;
use App\Repository\Telegram\AgentPublicBot\BotUserRepository;
use App\Repository\VPN\Service\ServiceRepository;
use App\Repository\VPN\V2ray\ServerRepository;
use App\Service\SettingService;
use App\Service\Telegram\AgentPublicBot\BotUserService;
use App\Service\TransactionService;
use App\Service\Util\ByteConvert;
use App\Service\Util\DynamicPriceCalculation;
use App\Service\Util\NotificationService;
use App\Service\Util\TelegramBot;
use App\Service\Util\TelegramNotifier;
use App\Service\Util\V2rayConnectionMaker;
use App\Service\VPN\Service\ServiceService;
use DateTime;
use DateTimeImmutable;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
use App\Service\Util\MarzbanNewAPI;
use Psr\Log\LoggerInterface;
use Ramsey\Collection\Set;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class NeoWebHookController extends AbstractController
{
public TransactionService $transaction;
public DynamicPriceCalculation $dynamicPriceCalculation;
public EntityManagerInterface $entityManager;
public TransactionService $panelTrasnactionService;
public ServiceService $service;
public TransactionService $transactionService;
// public null| $botUser = null;
public array $messages = [
'welcome' => PHP_EOL . '------
موجودی شما : --WALLET--
شناسه کاربری شما : --USERID--
',
'chooseServiceType' => 'لطفا ابتدا نوع سرویس مدنظر را انتخاب فرمایید' . PHP_EOL .
'سرویس انتخاب شده : ' . PHP_EOL .
'نوع سرویس : --SERVICETYPE--' . PHP_EOL .
'لوکیشن : --SERVERTYPE--' . PHP_EOL .
' تعداد کاربر : --USERCOUNT--' . PHP_EOL .
' زمان سرویس : --SERVICETIME--' . PHP_EOL,
'chooseServiceServerType' => 'لطفا نوع سرور سرویس خود را انتخاب فرمایید' . PHP_EOL .
'سرویس انتخاب شده : ' . PHP_EOL .
'نوع سرویس : --SERVICETYPE--' . PHP_EOL .
'لوکیشن : --SERVERTYPE--' . PHP_EOL .
' تعداد کاربر : --USERCOUNT--' . PHP_EOL .
' زمان سرویس : --SERVICETIME--' . PHP_EOL,
'chooseServiceLocation' => 'لطفا کشور مد نظر را انتخاب فرمایید' . PHP_EOL .
'سرویس انتخاب شده : ' . PHP_EOL .
'نوع سرویس : --SERVICETYPE--' . PHP_EOL .
'لوکیشن : --SERVERTYPE--' . PHP_EOL .
' تعداد کاربر : --USERCOUNT--' . PHP_EOL .
' زمان سرویس : --SERVICETIME--' . PHP_EOL,
'chooseServiceUsers' => 'تعداد کاربر مورد نیاز خود برای اتصال را انتخاب فرمایید' . PHP_EOL .
'سرویس انتخاب شده : ' . PHP_EOL .
'نوع سرویس : --SERVICETYPE--' . PHP_EOL .
'لوکیشن : --SERVERTYPE--' . PHP_EOL .
' تعداد کاربر : --USERCOUNT--' . PHP_EOL .
' زمان سرویس : --SERVICETIME--' . PHP_EOL,
'chooseServicePlan' => 'سرویس مورد نظر را انتخاب فرمایید' . PHP_EOL .
'سرویس انتخاب شده : ' . PHP_EOL .
'نوع سرویس : --SERVICETYPE--' . PHP_EOL .
'لوکیشن : --SERVERTYPE--' . PHP_EOL .
' تعداد کاربر : --USERCOUNT--' . PHP_EOL .
' زمان سرویس : --SERVICETIME--' . PHP_EOL,
'chooseServiceTime' => 'زمان سرویس مورد نظر را انتخاب فرمایید' . PHP_EOL .
'سرویس انتخاب شده : ' . PHP_EOL .
'نوع سرویس : --SERVICETYPE--' . PHP_EOL .
'لوکیشن : --SERVERTYPE--' . PHP_EOL .
' تعداد کاربر : --USERCOUNT--' . PHP_EOL .
' زمان سرویس : --SERVICETIME--' . PHP_EOL,
];
public array $startMessageButtons;
public array $serviceTypesButtons;
public array $testServiceTypesButtons = [
// [
// [
// 'text' => 'سرویس V2ray نامحدود',
// 'callback_data' => 'tes-v2rayServiceUnLimited'
// ],
// [
// 'text' => 'سرویس V2ray حجمی',
// 'callback_data' => 'tes-v2rayService'
// ]
// ],
// [
// [
// 'text' => 'سرویس Cisco نامحدود',
// 'callback_data' => 'tes-ciscoServiceUnLimited'
// ],
// [
// 'text' => 'سرویس Cisco حجمی',
// 'callback_data' => 'tes-ciscoService'
// ]
// ],
//
// [
// [
// 'text' => 'سرویس OpenVpn نامحدود',
// 'callback_data' => 'tes-openServiceUnLimited'
// ],
// [
// 'text' => 'سرویس OpenVpn حجمی',
// 'callback_data' => 'tes-openService'
// ]
// ],
// [
// [
// 'text' => 'سرویس مولتی پروتکل',
// 'callback_data' => 'tes-vipService'
// ]
// ],
[
[
'text' => 'دریافت تست یک روزه',
'callback_data' => 'tes-vipService'
]
],
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
]
];
public array $serviceUsersButtons = [
[
[
'text' => 'یک کاربر همزمان',
'callback_data' => '1User'
]
],
[
[
'text' => 'دو کاربر همزمان',
'callback_data' => '2User'
]
],
[
[
'text' => 'سه کاربر همزمان',
'callback_data' => '3User'
]
],
[
[
'text' => 'چهار کاربر همزمان',
'callback_data' => '4User'
]
],
[
[
'text' => 'پنج کاربر همزمان',
'callback_data' => '5User'
]
],
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
]
];
public array $serviceTimeButtons = [
[
[
'text' => 'یک ماه',
'callback_data' => '30Days'
]
],
[
[
'text' => 'دو ماه',
'callback_data' => '60Days'
]
],
[
[
'text' => 'سه ماه',
'callback_data' => '90Days'
]
],
[
[
'text' => 'شش ماه',
'callback_data' => '180Days'
]
],
[
[
'text' => 'یک سال',
'callback_data' => '365Days'
]
],
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
]
];
public array $paymentButtons;
public Bot|null $bot;
public BotUser|null $botUser;
public string $channelUsername;
public string $token;
public TelegramNotifier $telegramBot;
public $learn_channel = "@khanvpnofficial";
public $adminId = '6471235924';
private string $brandDomain;
private BotUserService $botUserService;
public NotificationService $notificationService;
public function getStartButtons($userId = null)
{
if ($this->bot->isIsBotForWebsite()) {
$this->startMessageButtons = [
[
[
"text" => "🎁 دریافت اکانت تست (رایگان)",
"callback_data" => "testService"
]
],
[
[
"text" => "📞 پشتیبانی آنلاین",
"url" => "https://t.me/" . $this->bot->getSupportUsername()
]
],
[
[
"text" => "🔋 اعطای نمایندگی",
"url" => "https://t.me/" . $this->bot->getSupportUsername()
],
],
];
} else {
if ($userId) {
if (str_contains($this->brandDomain , 'tehransub.website')){
$myServicesLink = "https://tehrannet.org/telegram/agent-public-bot/webhook-neo/{$this->bot->getId()}/user-services/{$this->botUser->getUserId()}";
}else{
$myServicesLink = "{$this->brandDomain}/telegram/agent-public-bot/webhook-neo/{$this->bot->getId()}/user-services/{$this->botUser->getUserId()}";
}
$this->startMessageButtons = [
[
[
"text" => "📦 کانفیگ های من",
"url" => $myServicesLink
],
[
"text" => "🛒 خرید کانفیگ جدید",
"callback_data" => "buyService"
],
],
[
[
"text" => "🔋 تمدید کانفیگ",
"url" => $myServicesLink
],
],
[
[
"text" => "🎁 دریافت اکانت تست (رایگان)",
"callback_data" => "testService"
]
],
[
[
"text" => "💸 حسابداری",
"callback_data" => "accounting"
],
[
"text" => "💰 شارژ کیف پول",
"callback_data" => "charge"
],
],
// [
// [
// "text" => "🧩|آموزش اتصال",
// "url" => "https://t.me/khanvpn_support"
// ]
// ],
[
[
"text" => "📞 پشتیبانی آنلاین",
"url" => "https://t.me/" . $this->bot->getSupportUsername()
]
],
[
[
"text" => "🔋 اعطای نمایندگی",
"url" => "https://t.me/" . $this->bot->getSupportUsername()
],
// [
// "text" => "😇|دعوت از دوستان",
// "url" => "https://t.me/khanvpn_support"
// ]
],
];
} else {
$this->startMessageButtons = [
[
// [
// "text" => "📦 کانفیگ های من",
// "url" => $myServicesLink
// ],
[
"text" => "🛒 خرید کانفیگ جدید",
"callback_data" => "buyService"
],
],
[
[
"text" => "🎁 دریافت اکانت تست (رایگان)",
"callback_data" => "testService"
]
],
[
[
"text" => "💸 حسابداری",
"callback_data" => "accounting"
],
[
"text" => "💰 شارژ کیف پول",
"callback_data" => "charge"
],
],
// [
// [
// "text" => "🧩|آموزش اتصال",
// "url" => "https://t.me/khanvpn_support"
// ]
// ],
[
[
"text" => "📞 پشتیبانی آنلاین",
"url" => "https://t.me/" . $this->bot->getSupportUsername()
]
],
[
[
"text" => "🔋 اعطای نمایندگی",
"url" => "https://t.me/" . $this->bot->getSupportUsername()
],
// [
// "text" => "😇|دعوت از دوستان",
// "url" => "https://t.me/khanvpn_support"
// ]
],
];
}
}
return $this->startMessageButtons;
}
public function __construct(NotificationService $notificationService , TransactionService $transaction, TransactionService $panelTransactionService, BotPlanRepository $botPlanRepository, ServiceService $service, EntityManagerInterface $entityManager, TransactionService $transactionService, TelegramNotifier $telegramBot, RequestStack $requestStack, BotUserService $botUserService, DynamicPriceCalculation $dynamicPriceCalculation)
{
$this->notificationService = $notificationService;
$this->transaction = $transaction;
$this->dynamicPriceCalculation = $dynamicPriceCalculation;
$this->panelTrasnactionService = $panelTransactionService;
$setting = new SettingService($entityManager);
$this->brandDomain = 'https://' . $setting->getSetting('SUBSCRIPTIONLINK', '#');
$this->transactionService = $transactionService;
$botID = $requestStack->getCurrentRequest()->attributes->get('id');
$this->entityManager = $entityManager;
$bot = $entityManager->getRepository(Bot::class)->find($botID);
$this->bot = $bot;
if ($bot->isIsBotForWebsite()) {
$this->messages['welcome'] = $this->bot->getWelcomeMessage();
} else {
$this->messages['welcome'] = $this->bot->getWelcomeMessage() . $this->messages['welcome'];
}
$this->token = $bot->getToken();
$this->channelUsername = "@" . $this->bot->getChannelUserNAme();
$this->telegramBot = $telegramBot;
if ($bot->getDomain()) {
$this->brandDomain = 'https://' . $bot->getDomain()->getAddress();
}
$this->botUserService = $botUserService;
$this->service = $service;
$this->paymentButtons = [];
if ($this->bot->getCardNumber() && ($this->bot->getCardNumber() !== '')) {
$this->paymentButtons[] = [
[
'text' => 'کارت به کارت',
'callback_data' => 'chargeCardToCard'
]
];
}
if ($this->bot->getWalletAddress() && ($this->bot->getWalletAddress() !== '')) {
$this->paymentButtons[] = [
[
'text' => 'پرداخت آنلاین',
'callback_data' => 'chargeOnline'
]
];
}
// دکمه بازگشت همیشه هست
$this->paymentButtons[] = [
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
];
// $this->serviceTypesButtons =[
// [
// [
// 'text' => 'V2ray نامحدود',
// 'callback_data' => 'v2rayServiceUnLimited'
// ],
// [
// 'text' => 'V2ray حجمی',
// 'callback_data' => 'v2rayService'
// ]
// ],
// [
// [
// 'text' => 'Cisco نامحدود',
// 'callback_data' => 'ciscoServiceUnLimited'
// ],
// [
// 'text' => 'Cisco حجمی',
// 'callback_data' => 'ciscoService'
// ]
// ],
// [
// [
// 'text' => 'OpenVPN نامحدود',
// 'callback_data' => 'openServiceUnLimited'
// ],
// [
// 'text' => 'OpenVPN حجمی',
// 'callback_data' => 'openService'
// ]
// ],
// [
// [
// 'text' => 'مولتی پروتکل',
// 'callback_data' => 'vipService'
// ]
// ],
// [
// [
// 'text' => '⬆️ بازگشت به صفحه اصلی',
// 'callback_data' => '/start'
// ]
// ]
//
//
// ];
$this->serviceTypesButtons = [];
if ($botPlanRepository->hasPlanType($this->bot, 'unlimited', 'v2ray') || $botPlanRepository->hasPlanType($this->bot, 'sized', 'v2ray')) {
$row = [];
if ($botPlanRepository->hasPlanType($this->bot, 'unlimited', 'v2ray')) {
$row[] = [
'text' => 'V2ray نامحدود',
'callback_data' => 'v2rayServiceUnLimited'
];
}
if ($botPlanRepository->hasPlanType($this->bot, 'sized', 'v2ray')) {
$row[] = [
'text' => 'V2ray حجمی',
'callback_data' => 'v2rayService'
];
}
if (!empty($row)) {
$this->serviceTypesButtons[] = $row;
}
}
// مشابه همین واسه Cisco
$row = [];
if ($botPlanRepository->hasPlanType($this->bot, 'unlimited', 'ocserv')) {
$row[] = [
'text' => 'Cisco نامحدود',
'callback_data' => 'ciscoServiceUnLimited'
];
}
if ($botPlanRepository->hasPlanType($this->bot, 'sized', 'ocserv')) {
$row[] = [
'text' => 'Cisco حجمی',
'callback_data' => 'ciscoService'
];
}
if (!empty($row)) {
$this->serviceTypesButtons[] = $row;
}
// مشابه واسه OpenVPN
$row = [];
if ($botPlanRepository->hasPlanType($this->bot, 'unlimited', 'open')) {
$row[] = [
'text' => 'OpenVPN نامحدود',
'callback_data' => 'openServiceUnLimited'
];
}
if ($botPlanRepository->hasPlanType($this->bot, 'sized', 'open')) {
$row[] = [
'text' => 'OpenVPN حجمی',
'callback_data' => 'openService'
];
}
if (!empty($row)) {
$this->serviceTypesButtons[] = $row;
}
if ($botPlanRepository->hasPlanType($this->bot, 'sized', 'vip')) {
$this->serviceTypesButtons[] = [
[
'text' => 'مولتی پروتکل',
'callback_data' => 'vipService'
]
];
}
// دکمه بازگشت همیشه هست
$this->serviceTypesButtons[] = [
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
];
}
#[Route('/telegram/agent-public-bot/webhook-neo/{id}', name: 'app_telegram_agent_public_bot_web_hook_neon')]
public function handleWebhook(Request $request, LoggerInterface $logger): Response
{
// if (isset($content['channel_post'])) {
// $this->handleChannelPost($content['channel_post'], $logger);
// }
$content = json_decode($request->getContent(), true);
if (isset($content['message'])) {
$this->handleMessage($content['message'], $logger);
}
if (isset($content['callback_query'])) {
$this->handleCallbackQuery($content['callback_query'], $logger);
}
if (isset($content['edited_message'])) {
$this->handleEditedMessage($content['edited_message'], $logger);
}
if (isset($content['inline_query'])) {
$this->handleInlineQuery($content['inline_query'], $logger);
}
if (isset($content['channel_post'])) {
$this->handleChannelPost($content['channel_post'], $logger);
}
if (isset($content['edited_channel_post'])) {
$this->handleEditedChannelPost($content['edited_channel_post'], $logger);
}
if (isset($content['poll'])) {
$this->handlePoll($content['poll'], $logger);
}
if (isset($content['poll_answer'])) {
$this->handlePollAnswer($content['poll_answer'], $logger);
}
if (isset($content['my_chat_member'])) {
$this->handleMyChatMember($content['my_chat_member'], $logger);
}
if (isset($content['chat_member'])) {
$this->handleChatMember($content['chat_member'], $logger);
}
// Respond with 200 OK
return new Response('NoDirectAccess', Response::HTTP_OK);
}
public function beautifyText($text)
{
if ($this->botUser) {
$text = str_replace('--USERID--', $this->botUser->getUserId(), $text);
$text = str_replace('--WALLET--', number_format($this->botUser->getWallet()) . ' تومان', $text);
$text = str_replace('--CARDNUMBER--', '`' . $this->bot->getCardNumber() . '`', $text);
if (isset($this->botUser->getNewServiceDetail()['users'])) {
$text = str_replace('--USERCOUNT--', $this->botUser->getNewServiceDetail()['users'] . ' کاربر', $text);
} else {
$text = str_replace('--USERCOUNT--', 'انتخاب نشده', $text);
}
if (isset($this->botUser->getNewServiceDetail()['serviceType'])) {
switch ($this->botUser->getNewServiceDetail()['serviceType']) {
case 'v2rayService':
$text = str_replace('--SERVICETYPE--', 'سرویس V2ray حجمی', $text);
break;
case 'ciscoService':
$text = str_replace('--SERVICETYPE--', 'سرویس Cisco حجمی', $text);
break;
case 'openService':
$text = str_replace('--SERVICETYPE--', 'سرویس OpenVPN حجمی', $text);
break;
case 'v2rayServiceUnLimited':
$text = str_replace('--SERVICETYPE--', 'سرویس V2ray نامحدود', $text);
break;
case 'ciscoServiceUnLimited':
$text = str_replace('--SERVICETYPE--', 'سرویس Cisco نامحدود', $text);
break;
case 'openServiceUnLimited':
$text = str_replace('--SERVICETYPE--', 'سرویس OpenVPN نامحدود', $text);
break;
case 'vipService':
$text = str_replace('--SERVICETYPE--', 'سرویس VIP مولتی پروتکل', $text);
break;
}
} else {
$text = str_replace('--SERVICETYPE--', 'انتخاب نشده', $text);
}
if (isset($this->botUser->getNewServiceDetail()['serviceTime'])) {
switch ($this->botUser->getNewServiceDetail()['serviceTime']) {
case '30':
$text = str_replace('--SERVICETIME--', 'یک ماه', $text);
break;
case '60':
$text = str_replace('--SERVICETIME--', 'دو ماه', $text);
break;
case '90':
$text = str_replace('--SERVICETIME--', 'سه ماه', $text);
break;
case '180':
$text = str_replace('--SERVICETIME--', 'شش ماه', $text);
break;
case '365':
$text = str_replace('--SERVICETIME--', 'یک سال', $text);
break;
}
} else {
$text = str_replace('--SERVICETIME--', 'انتخاب نشده', $text);
}
if (isset($this->botUser->getNewServiceDetail()['serviceType'])
&&
str_contains($this->botUser->getNewServiceDetail()['serviceType'], 'UnLimited')
) {
if (isset($this->botUser->getNewServiceDetail()['country'])) {
$countryRepo = $this->getDoctrine()->getRepository(Country::class);
$selectedCountry = $countryRepo->findOneBy(['code' => $this->botUser->getNewServiceDetail()['country']]);
$text = str_replace('--SERVERTYPE--',
$this->countryCodeToFlag($selectedCountry->getCode()) .
$selectedCountry->getTitle(), $text);
} else {
$text = str_replace('--SERVERTYPE--', 'انتخاب نشده', $text);
}
} else {
$text = str_replace('--SERVERTYPE--', 'تمام لوکیشن های موجود', $text);
}
}
return $text;
}
// #[Route('/set-webhook', name: 'set_webhook')]
// public function setWebhook()
// {
// $webhookUrl = "https://tehrannet.org/khan/bot/main/webhook";
// $apiUrl = "https://api.telegram.org/bot{$this->token}/setWebhook";
// $parameters = [
// 'url' => $webhookUrl,
// 'drop_pending_updates' => 'True',
// 'max_connections' => '100'
// ];
// $ch = curl_init();
// curl_setopt($ch, CURLOPT_URL, "https://api.telegram.org/bot{$this->token}/deleteWebhook");
// curl_setopt($ch, CURLOPT_POST, true);
// curl_setopt($ch, CURLOPT_POSTFIELDS, $parameters);
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// $response = curl_exec($ch);
// curl_close($ch);
// $ch = curl_init();
// curl_setopt($ch, CURLOPT_URL, $apiUrl);
// curl_setopt($ch, CURLOPT_POST, true);
// curl_setopt($ch, CURLOPT_POSTFIELDS, $parameters);
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// $response = curl_exec($ch);
// curl_close($ch);
// return $this->json(['res' => $response]);
// }
private function handleMessage(array $message, LoggerInterface $logger): void
{
$repo = $this->getDoctrine()->getRepository(BotUser::class);
$chatId = $message['chat']['id'];
$firstName = $message['chat']['first_name'] ?? null;
$lastName = $message['chat']['last_name'] ?? null;
$username = $message['chat']['username'] ?? null;
$khanUser = $repo->findOneBy(['userId' => $chatId, 'bot' => $this->bot]);
if (!$khanUser) {
$khanUser = new BotUser();
$khanUser->setNewServiceDetail([]);
$khanUser->setUserId($chatId);
$khanUser->setBot($this->bot);
}
$khanUser->setName($firstName ?: '');
$khanUser->setUsername($username ?: '');
$this->entityManager->persist($khanUser);
$this->entityManager->flush();
$this->botUser = $khanUser;
if (!$this->bot->isActive() || !$this->bot->getOwner()->isActive()) {
$this->sendMessage($this->botUser->getUserId(),
'ربات فعال نمیباشد با پشتیبانی در ارتباط باشید....'
);
die;
}
$chatId = $message['chat']['id'];
$text = $message['text'] ?? '';
$messageId = $message['message_id'] ?? null; // Get message ID
if ((bool)$this->bot->isForceJoinChannel() && $this->bot->getChannelUserNAme()) {
if (!$this->checkIfUserIsInChannel($chatId, $this->channelUsername)) {
$this->sendInlineKeyboard($chatId, '❌ برای استفاده از ربات حتما باید در کانال زیر عضو شوید:
✅ بعد از اینکه عضو شدید روی دکمه عضو شدم بزنید'
. PHP_EOL .
$this->channelUsername, [
[
[
'text' => '✅عضو شدم✅',
'callback_data' => '/start'
]
]
]
);
return;
}
}
// try {
// $serviceTypesButtons = [];
// $botPlanRepository = $this->getDoctrine()->getRepository(BotPlan::class);
// if ($botPlanRepository->hasPlanType($this->bot , 'unlimited' , 'v2ray') || $botPlanRepository->hasPlanType($this->bot , 'sized' , 'v2ray')) {
// $row = [];
// if ($botPlanRepository->hasPlanType($this->bot , 'unlimited' , 'v2ray')) {
// $row[] = [
// 'text' => 'V2ray نامحدود',
// 'callback_data' => 'v2rayServiceUnLimited'
// ];
// }
// if ($botPlanRepository->hasPlanType($this->bot , 'sized' , 'v2ray')) {
// $row[] = [
// 'text' => 'V2ray حجمی',
// 'callback_data' => 'v2rayService'
// ];
// }
// if (!empty($row)) {
// $serviceTypesButtons = $row;
// }
// }
//
//// مشابه همین واسه Cisco
// $row = [];
// if ($botPlanRepository->hasPlanType($this->bot , 'unlimited' , 'ocserv')) {
// $row[] = [
// 'text' => 'Cisco نامحدود',
// 'callback_data' => 'ciscoServiceUnLimited'
// ];
// }
// if ($botPlanRepository->hasPlanType($this->bot , 'sized' , 'ocserv')) {
// $row[] = [
// 'text' => 'Cisco حجمی',
// 'callback_data' => 'ciscoService'
// ];
// }
// if (!empty($row)) {
// $serviceTypesButtons[] = $row;
// }
//
//// مشابه واسه OpenVPN
// $row = [];
// if ($botPlanRepository->hasPlanType($this->bot , 'unlimited' , 'openvpn')) {
// $row[] = [
// 'text' => 'OpenVPN نامحدود',
// 'callback_data' => 'openServiceUnLimited'
// ];
// }
// if ($botPlanRepository->hasPlanType($this->bot , 'sized' , 'openvpn')) {
// $row[] = [
// 'text' => 'OpenVPN حجمی',
// 'callback_data' => 'openService'
// ];
// }
// if (!empty($row)) {
// $serviceTypesButtons[] = $row;
// }
//
//// دکمه VIP همیشه هست
// $serviceTypesButtons[] = [
// [
// 'text' => 'مولتی پروتکل',
// 'callback_data' => 'vipService'
// ]
// ];
//
//// دکمه بازگشت همیشه هست
// $serviceTypesButtons[] = [
// [
// 'text' => '⬆️ بازگشت به صفحه اصلی',
// 'callback_data' => '/start'
// ]
// ];
//
// $this->sendMessageRaw($this->adminId , json_encode($serviceTypesButtons));
// }catch (\Exception $exception){
// $this->sendMessageRaw($this->adminId , $exception->getMessage());
// }
if (preg_match('/^\/start(?:\s+\w+=(\w+))?/', $text, $matches)) {
if (str_contains($text, 'usr')) {
$this->handleConnectMessage(str_replace('/start usr=', '', $text), $chatId, $logger); // For user ID
}
if (str_contains($text, 'utm')) {
$this->handleCampaign(str_replace('/start utm=', '', $text), $chatId, $logger); // For UTM value
$this->sendInlineKeyboard($chatId, $this->messages['welcome'], $this->getStartButtons($chatId));
}
if ($text == '/start') {
$this->botUser->setNewServiceDetail([]);
$this->entityManager->flush();
$this->sendInlineKeyboard($chatId, $this->messages['welcome'], $this->getStartButtons($chatId));
} else {
if ($this->botUser->getStep()) {
if ($this->botUser->getStep() == 'waitForPrice') {
$startNumber = intval($text);
if ($startNumber < ($this->bot->getMinimumCardToCard() ?: 1000)) {
$this->sendMessage($this->botUser->getUserId(), 'مبلغ وارد شده اشتباه می باشد مجدد مبلغ را ارسال فرمایید');
die;
} else {
$minimumCardToCard = $this->bot->getMinimumCardToCard() ?: 10000;
$minimumCardToCardString = number_format($minimumCardToCard);
if ((int)$text >= (int)$minimumCardToCard) {
$targetPrice = (int)$text;
$this->botUser->setStep("waitForPanelFactor({$targetPrice})");
$this->getDoctrine()->getManager()->flush();
$this->sendMessage($this->botUser->getUserId(),
'درصورت ارسال رسید جعلی حساب شما بدون عودت وجه مسدود خواهد شد
لطفا مبلغ وارد شده با به شماره کارت
--CARDNUMBER--
واریز کنید و رسید آن را ارسال فرماید', 'markdown');
} else {
$this->sendMessage($this->botUser->getUserId(), "عدد به درستی وارد نشده یا عدد ثبت شده کمتر از {$minimumCardToCardString} تومان می باشد لطفا مجدد به تومان با استفاده از کیبورد لاتین ارسال فرمایید");
}
}
} elseif (preg_match('/waitForPanelFactor\((\d+)\)/', $this->botUser->getStep(), $match)) {
if (isset($message['message']['photo']) || isset($message['photo'])) {
$photo = $message['message']['photo'] ?? $message['photo'];
$this->botUser->setStep('');
$chargetPrice = number_format((int)$match[1]);
try {
$this->sendPhoto($this->bot->getOwner()->getConnectedTelegramUserId()['userId'], $photo[0]['file_id'],
PHP_EOL .
"نام مشتری : {$this->botUser->getName()}"
. PHP_EOL .
"نام کاربری مشتری : {$this->botUser->getUsername()}"
. PHP_EOL .
"مبلغ ثبت شده : {$chargetPrice} تومان "
. PHP_EOL .
"در صورتی که مبلغ وارد شده با مبلغ داخل رسید یکیست آنرا تایید کنید تا مشتری شارژ شود و در غیر اینصورت آنرا رد کنید تا رد شود",
[
[
[
"text" => "تایید رسید",
"callback_data" => "/acPCh(p-{$match[1]})|(e-{$this->botUser->getUrlSlug()})|(u-{$this->botUser->getUserId()})"
],
],
[
[
"text" => "رد رسید",
"callback_data" => "/dcPCh(p-{$match[1]})|(e-{$this->botUser->getUrlSlug()})|(u-{$this->botUser->getUserId()})"
],
],
[
[
"text" => "رد رسید - رسید جعلی",
"callback_data" => "/dcPChJa(p-{$match[1]})|(e-{$this->botUser->getUrlSlug()})|(u-{$this->botUser->getUserId()})"
],
],
[
[
"text" => "رد رسید - عدم تطابق عدد واریز و عدد ثبتی در پنل",
"callback_data" => "/dcPChPa(p-{$match[1]})|(e-{$this->botUser->getUrlSlug()})|(u-{$this->botUser->getUserId()})"
],
],
[
[
"text" => "رد رسید - عدم عدم وضوح متون تصویر",
"callback_data" => "/dcPChKa(p-{$match[1]})|(e-{$this->botUser->getUrlSlug()})|(u-{$this->botUser->getUserId()})"
],
],
[
[
"text" => "رد رسید - عدم دریافت مبلغ (پایا - شبا - پل)",
"callback_data" => "/dcPChMa(p-{$match[1]})|(e-{$this->botUser->getUrlSlug()})|(u-{$this->botUser->getUserId()})"
],
]
]
);
$this->sendMessage($this->botUser->getUserId(), 'رسید برای ادمین ارسال شد منتظر تایید آن باشید');
} catch (Exception $exception) {
$this->notificationService->exception($exception);
// $this->te
// $this->telegram->exception($exception);
// $this->bot('sendMessage', [
// 'chat_id' => $this->chatId,
// 'text' => 'تصویر به درستی ارسال نشد مجدد اقدام فرمایید',
// 'reply_markup' => $this->backMenu
// ], $bot->getToken());
// $objectUser->setStep('');
}
$this->getDoctrine()->getManager()->flush();
} else {
$this->sendMessage($this->botUser->getUserId(), 'تصویر ارسال کن');
}
}
} else {
$this->sendInlineKeyboard($chatId, $this->messages['welcome'], $this->getStartButtons($chatId));
}
}
} else {
if ($this->botUser->getStep()) {
if ($this->botUser->getStep() == 'waitForPrice') {
$startNumber = intval($text);
if ($startNumber < ($this->bot->getMinimumCardToCard() ?: 1000)) {
$this->sendMessage($this->botUser->getUserId(), 'مبلغ وارد شده اشتباه می باشد مجدد مبلغ را ارسال فرمایید');
die;
} else {
$minimumCardToCard = $this->bot->getMinimumCardToCard() ?: 10000;
$minimumCardToCardString = number_format($minimumCardToCard);
if ((int)$text >= (int)$minimumCardToCard) {
$targetPrice = (int)$text;
$this->botUser->setStep("waitForPanelFactor({$targetPrice})");
$this->getDoctrine()->getManager()->flush();
$this->sendMessage($this->botUser->getUserId(),
'درصورت ارسال رسید جعلی حساب شما بدون عودت وجه مسدود خواهد شد
لطفا مبلغ وارد شده با به شماره کارت
--CARDNUMBER--
واریز کنید و رسید آن را ارسال فرماید', 'markdown');
} else {
$this->sendMessage($this->botUser->getUserId(), "عدد به درستی وارد نشده یا عدد ثبت شده کمتر از {$minimumCardToCardString} تومان می باشد لطفا مجدد به تومان با استفاده از کیبورد لاتین ارسال فرمایید");
}
}
} elseif (preg_match('/waitForPanelFactor\((\d+)\)/', $this->botUser->getStep(), $match)) {
if (isset($message['message']['photo']) || isset($message['photo'])) {
$photo = $message['message']['photo'] ?? $message['photo'];
$this->botUser->setStep('');
$chargetPrice = number_format((int)$match[1]);
try {
$this->sendPhoto($this->bot->getOwner()
->getConnectedTelegramUserId()['userId'], $photo[0]['file_id'],
PHP_EOL .
"نام مشتری : {$this->botUser->getName()}"
. PHP_EOL .
"نام کاربری مشتری : {$this->botUser->getUsername()}"
. PHP_EOL .
"مبلغ ثبت شده : {$chargetPrice} تومان "
. PHP_EOL .
"در صورتی که مبلغ وارد شده با مبلغ داخل رسید یکیست آنرا تایید کنید تا مشتری شارژ شود و در غیر اینصورت آنرا رد کنید تا رد شود",
[
[
[
"text" => "تایید رسید",
"callback_data" => "/acPCh(p-{$match[1]})|(e-{$this->botUser->getUrlSlug()})|(u-{$this->botUser->getUserId()})"
],
],
[
[
"text" => "رد رسید",
"callback_data" => "/dcPCh(p-{$match[1]})|(e-{$this->botUser->getUrlSlug()})|(u-{$this->botUser->getUserId()})"
],
],
[
[
"text" => "رد رسید - رسید جعلی",
"callback_data" => "/dcPChJa(p-{$match[1]})|(e-{$this->botUser->getUrlSlug()})|(u-{$this->botUser->getUserId()})"
],
],
[
[
"text" => "رد رسید - عدم تطابق عدد واریز و عدد ثبتی در پنل",
"callback_data" => "/dcPChPa(p-{$match[1]})|(e-{$this->botUser->getUrlSlug()})|(u-{$this->botUser->getUserId()})"
],
],
[
[
"text" => "رد رسید - عدم عدم وضوح متون تصویر",
"callback_data" => "/dcPChKa(p-{$match[1]})|(e-{$this->botUser->getUrlSlug()})|(u-{$this->botUser->getUserId()})"
],
],
[
[
"text" => "رد رسید - عدم دریافت مبلغ (پایا - شبا - پل)",
"callback_data" => "/dcPChMa(p-{$match[1]})|(e-{$this->botUser->getUrlSlug()})|(u-{$this->botUser->getUserId()})"
],
]
]
);
$this->sendMessage($this->botUser->getUserId(), 'رسید برای ادمین ارسال شد منتظر تایید آن باشید');
} catch (Exception $exception) {
$this->notificationService->exception($exception);
// $this->telegram->exception($exception);
// $this->bot('sendMessage', [
// 'chat_id' => $this->chatId,
// 'text' => 'تصویر به درستی ارسال نشد مجدد اقدام فرمایید',
// 'reply_markup' => $this->backMenu
// ], $bot->getToken());
// $objectUser->setStep('');
}
$this->getDoctrine()->getManager()->flush();
} else {
$this->sendMessage($this->botUser->getUserId(), 'تصویر ارسال کن');
}
}
} else {
$this->sendInlineKeyboard($chatId, $this->messages['welcome'], $this->getStartButtons($chatId));
}
}
}
private function handleCallbackQuery(array $callbackQuery, LoggerInterface $logger)
{
try {
$repo = $this->getDoctrine()->getRepository(BotUser::class);
$chatId = $callbackQuery['message']['chat']['id'];
$firstName = $callbackQuery['message']['chat']['first_name'] ?? null;
$lastName = $callbackQuery['message']['chat']['last_name'] ?? null;
$username = $callbackQuery['message']['chat']['username'] ?? null;
$khanUser = $repo->findOneBy(['userId' => $chatId, 'bot' => $this->bot]);
if (!$khanUser) {
$khanUser = new BotUser();
$khanUser->setBot($this->bot);
$khanUser->setNewServiceDetail([]);
$khanUser->setUserId($chatId);
}
$khanUser->setName($firstName ?: '');
$khanUser->setUsername($username ?: '');
$this->entityManager->persist($khanUser);
$this->entityManager->flush();
$this->botUser = $khanUser;
if ((bool)$this->bot->isForceJoinChannel() && $this->bot->getChannelUserNAme()) {
if (!$this->checkIfUserIsInChannel($chatId, $this->channelUsername)) {
$this->sendInlineKeyboard($chatId, '❌ برای استفاده از ربات حتما باید در کانال زیر عضو شوید:
✅ بعد از اینکه عضو شدید روی دکمه عضو شدم بزنید'
. PHP_EOL .
$this->channelUsername, [
[
[
'text' => '✅عضو شدم✅',
'callback_data' => '/start'
]
]
]
);
die;
}
}
if (!$this->bot->isActive() || !$this->bot->getOwner()->isActive()) {
$this->sendMessage($this->botUser->getUserId(),
'ربات فعال نمیباشد با پشتیبانی در ارتباط باشید....'
);
die;
}
} catch (Exception $exception) {
$this->notificationService->exception($exception);
$this->telegramBot->exception($exception);
}
try {
$callbackQueryId = $callbackQuery['id'];
$data = $callbackQuery['data'] ?? '';
$chatId = $callbackQuery['message']['chat']['id'];
$messageId = $callbackQuery['message']['message_id'];
// $logger->info('Handling callback query', ['data' => $data]);
$messageId = $callbackQuery['message']['message_id'] ?? null; // Get message ID
if ($data == '/start') {
if ($this->botUser) {
$this->botUser->setNewServiceDetail([]);
$this->botUser->setStep(null);
$this->entityManager->flush();
}
if ($messageId) {
$this->editAsInlineMessage($chatId, $messageId, $this->messages['welcome'], $this->getStartButtons($this->botUser->getUserId()));
} else {
$this->sendInlineKeyboard($chatId, $this->messages['welcome'], $this->getStartButtons($this->botUser->getUserId()));
}
} elseif (str_contains($data, 'arz-')) {
$price = str_replace('arz-', '', $data);
$setting = new SettingService($this->entityManager);
$arzplusObject = new ArzDigital();
$arzRef = uniqid('ref-', false);
$arzplusObject->setRefId($arzRef);
$arzPrice = number_format(($price / ($setting->getSetting('tron_sell'))), 1);
$arzplusObject->setPrice(($price));
$arzplusObject->setBot($this->bot);
$arzplusObject->setBotUserOwner($this->botUser);
$arzplusObject->setIsPaid(0);
$this->entityManager->persist($arzplusObject);
$this->entityManager->flush();
$arzWallet = $this->bot->getWalletAddress();
$arzUrl = "https://arzplus24.com/fastpay?network=trx&symbol=TRX&amount=$arzPrice&address=$arzWallet&callback=https://tehransub.website/callback/arz-plus/{$this->bot->getTitle()}/{$this->botUser->getUserId()}?refId={$arzplusObject->getRefId()}";
if ($messageId) {
$this->editAsInlineMessage($chatId, $messageId, 'فاکتور ایجاد شد لطفا با زدن دکمه پرداخت و پرداخت در صرافی کیف پول خود را شارژ فرمایید',
[
[
[
'text' => 'پرداخت',
"url" => $arzUrl
],
],
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]
);
} else {
$this->sendInlineKeyboard($chatId, 'فاکتور ایجاد شد لطفا با زدن دکمه پرداخت و پرداخت در صرافی کیف پول خود را شارژ فرمایید'
,
[
[
[
'text' => 'پرداخت',
"url" => $arzUrl
],
],
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]
);
}
} elseif ($data == '/startd') {
$this->sendInlineKeyboard($chatId, $this->messages['welcome'], $this->getStartButtons($this->botUser->getUserId()));
} elseif ($data == 'buyService') {
if ($messageId) {
$this->editAsInlineMessage($chatId, $messageId, $this->messages['chooseServiceType'], $this->serviceTypesButtons);
} else {
$this->sendInlineKeyboard($chatId, $this->messages['chooseServiceType'], $this->serviceTypesButtons);
}
} elseif (in_array($data, [
'v2rayServiceUnLimited',
'ciscoServiceUnLimited',
'openServiceUnLimited',
'v2rayService',
'ciscoService',
'openService',
'vipService',
], true)) {
$serviceArray = $this->botUser->getNewServiceDetail() ?: [];
$serviceArray['serviceType'] = $data;
$this->botUser->setNewServiceDetail($serviceArray);
$this->entityManager->flush();
$this->handleNextQuestion($messageId);
} elseif ($data == '1User' || $data == '2User' || $data == '3User' || $data == '4User' || $data == '5User') {
$serviceArray = $this->botUser->getNewServiceDetail() ?: [];
$serviceArray['users'] = str_replace('User', '', $data);
$this->botUser->setNewServiceDetail($serviceArray);
$this->entityManager->flush();
$this->handleNextQuestion($messageId);
} elseif (str_contains($data, 'country-')) {
$serviceArray = $this->botUser->getNewServiceDetail() ?: [];
$serviceArray['country'] = str_replace('country-', '', $data);
$this->botUser->setNewServiceDetail($serviceArray);
$this->entityManager->flush();
$this->handleNextQuestion($messageId);
} elseif ($data == '30Days' || $data == '60Days' || $data == '90Days' || $data == '180Days' || $data == '365Days') {
$serviceArray = $this->botUser->getNewServiceDetail() ?: [];
$serviceArray['serviceTime'] = str_replace('Days', '', $data);
$this->botUser->setNewServiceDetail($serviceArray);
$this->entityManager->flush();
$this->handleNextQuestion($messageId);
} elseif (preg_match('/^pslug-[a-f0-9]+$/', $data, $matches)) {
$plan = $this->getDoctrine()->getRepository(BotPlan::class)->findOneBy(['urlSlug' => str_replace('pslug-', 'slug-', $data)]);
switch ($this->botUser->getNewServiceDetail()['serviceType']) {
case 'openServiceUnLimited':
case 'ciscoServiceUnLimited':
case 'v2rayServiceUnLimited':
$thisText = 'شما در حال خرید سرویس زیر می باشید : '
. PHP_EOL .
"\u{200F}" .
$plan->getPlan()->__toString()
. PHP_EOL .
"\u{200F}" .
number_format($plan->getPrice(), 0) . ' تومان ';
break;
case 'vipService':
case 'ciscoService':
case 'openService':
case 'v2rayService':
$thisText = 'شما در حال خرید سرویس زیر می باشید : '
. PHP_EOL .
"\u{200F}" .
$this->formatSizeUnits($plan->getPlan()->getSize()) .
' - ' .
number_format($plan->getPrice(), 0) . ' تومان ';
break;
}
if ($messageId) {
$this->editAsInlineMessage($chatId, $messageId, $thisText,
[
[
[
'text' => 'تایید میکنم',
'callback_data' => 'y' . $plan->getUrlSlug()
]
],
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]
);
} else {
$this->sendInlineKeyboard($chatId, $thisText,
[
[
[
'text' => 'تایید میکنم',
'callback_data' => 'y' . $plan->getUrlSlug()
]
],
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]
);
}
} elseif (preg_match('/^yslug-[a-f0-9]+$/', $data, $matches)) {
$plan = $this->getDoctrine()->getRepository(BotPlan::class)->findOneBy(['urlSlug' => str_replace('yslug-', 'slug-', $data), 'active' => 1]);
if (!$plan) {
if ($messageId) {
$this->editAsInlineMessage($this->botUser->getUserId(), $messageId, 'بسته انتخابی برای فروش فعال نیست', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
} else {
$this->sendInlineKeyboard($this->botUser->getUserId(), 'بسته انتخابی برای فروش فعال نیست', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
}
}
$price = $plan->getPrice();
if ($this->botUser->getWallet() >= $price || $this->botUser->getUserId() == $this->bot->getOwnerUserId()) {
$this->createService($this->botUser, $this->bot, $plan, $messageId);
if ($this->bot->getOwner()->getWallet() < 100000) {
$this->sendMessage($this->bot->getOwnerUserId(), "مدیریت محترم موجودی کیف پول شما در سایت کمتر از صد هزار تومان می باشد برای جلوگیری از توقف فروش در ربات لطفا فورا کیف پول خود را در سایت شارژ فرمایید");
}
} else {
if ($messageId) {
$this->editAsInlineMessage($chatId, $messageId, 'موجودی کیف پول شما برای خرید کافی نیست لطفا ابتدا کیف پول خود را شارژ فرمایید'
. PHP_EOL .
'موجودی فعلی شما : ' .
number_format($this->botUser->getWallet()) .
' تومان' .
PHP_EOL .
'موجودی مورد نیاز : ' .
number_format($price) .
' تومان', [
[
[
"text" => "💰 شارژ کیف پول",
"callback_data" => "charge"
],
],
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
} else {
$this->sendInlineKeyboard($chatId, 'موجودی کیف پول شما برای خرید کافی نیست لطفا ابتدا کیف پول خود را شارژ فرمایید'
. PHP_EOL .
'موجودی فعلی شما : ' .
number_format($this->botUser->getWallet()) .
' تومان' .
PHP_EOL .
'موجودی مورد نیاز : ' .
number_format($price) .
' تومان'
, [
[
[
"text" => "💰 شارژ کیف پول",
"callback_data" => "charge"
],
],
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
}
}
} elseif ($data == 'myServices') {
// TODO MYSERVICES
die;
// $userServiceRepo = $this->getDoctrine()->getRepository(UserService::class);
$myServicesKeyboard = [];
$myServicesKeyboard[] = [
[
'text' => 'دریافت کانفیگ',
'callback_data' => '#'
],
[
'text' => 'وضعیت',
'callback_data' => '#'
],
[
'text' => 'حجم مانده : ',
'callback_data' => '#'
],
[
'text' => 'روز مانده : ',
'callback_data' => '#'
],
[
'text' => 'سرویس : ',
'callback_data' => '#'
],
[
'text' => 'شناسه سرویس : ',
'callback_data' => '#'
]
];
$myServicesKeyboard[] = [
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
];
$myServicesKeyboard[] = [
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
];
if ($messageId) {
$this->editAsInlineMessage($chatId, $messageId, 'لیست سرویس های دریافتی شما : ',
$myServicesKeyboard);
} else {
$this->sendInlineKeyboard($chatId, 'لیست سرویس های دریافتی شما : ',
$myServicesKeyboard);
}
} elseif ($data == 'accounting') {
$transactions = $this->getDoctrine()->getRepository(BotTransaction::class)->findBy(['botUser' => $this->botUser, 'bot' => $this->bot]);
if (count($transactions) > 0) {
$text = 'آخرین تراکنش های شما :' . PHP_EOL;
foreach ($transactions as $transaction) {
$text = $text .
$transaction->getDescription()
. PHP_EOL;
}
if ($messageId) {
$this->editAsInlineMessage($chatId, $messageId, $text, [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
} else {
$this->sendInlineKeyboard($chatId, $text, [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
}
} else {
if ($messageId) {
$this->editAsInlineMessage($chatId, $messageId, 'تراکنشی برای کیف پول شما هنوز بوجود نیامده است', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
} else {
$this->sendInlineKeyboard($chatId, 'تراکنشی برای کیف پول شما هنوز بوجود نیامده است', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
}
}
} elseif ($data == 'charge') {
if ($messageId) {
$this->editAsInlineMessage($chatId, $messageId, 'روش شارژ را انتخاب فرمایید'
,
$this->paymentButtons
);
} else {
$this->sendInlineKeyboard($chatId, 'روش شارژ را انتخاب فرمایید',
$this->paymentButtons
);
}
} elseif ($data == 'chargeCardToCard') {
$this->botUser->setStep('waitForPrice');
$this->getDoctrine()->getManager()->flush();
$this->sendMessage($this->botUser->getUserId(), 'لطفا مبلغ مورد نیاز را وارد فرمایید - حداقل ' . number_format($this->bot->getMinimumCardToCard(), 0));
} elseif ($data == 'chargeOnline') {
if ($this->bot->getWalletAddress()) {
if ($messageId) {
$this->editAsInlineMessage($chatId, $messageId, 'مبلغ مدنظر برای شارژ را انتخاب فرمایید'
. PHP_EOL .
'پس از پرداخت حساب شما تا ۳ دقیقه بعد شارژ خواهد شد لطفا پس از پرداخت صبور باشید....'
,
[
[
[
'text' => number_format(300000) . ' تومان',
'callback_data' => 'arz-300000'
],
[
'text' => number_format(200000) . ' تومان',
'callback_data' => 'arz-200000'
],
[
'text' => number_format(100000) . ' تومان',
'callback_data' => 'arz-100000'
],
],
[
[
'text' => number_format(600000) . ' تومان',
'callback_data' => 'arz-600000'
],
[
'text' => number_format(500000) . ' تومان',
'callback_data' => 'arz-500000'
],
[
'text' => number_format(400000) . ' تومان',
'callback_data' => 'arz-400000'
],
],
[
[
'text' => number_format(900000) . ' تومان',
'callback_data' => 'arz-900000'
],
[
'text' => number_format(800000) . ' تومان',
'callback_data' => 'arz-800000'
],
[
'text' => number_format(700000) . ' تومان',
'callback_data' => 'arz-700000'
],
],
[
[
'text' => 'یک میلیون تومان',
'callback_data' => 'arz-1000000'
],
],
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]
);
} else {
$this->sendInlineKeyboard($chatId, 'مبلغ مدنظر برای شارژ را انتخاب فرمایید'
. PHP_EOL .
'پس از پرداخت حساب شما تا ۳ دقیقه بعد شارژ خواهد شد لطفا پس از پرداخت صبور باشید....'
,
[
[
[
'text' => number_format(300000) . ' تومان',
'callback_data' => 'arz-300000'
],
[
'text' => number_format(200000) . ' تومان',
'callback_data' => 'arz-200000'
],
[
'text' => number_format(100000) . ' تومان',
'callback_data' => 'arz-100000'
],
],
[
[
'text' => number_format(600000) . ' تومان',
'callback_data' => 'arz-600000'
],
[
'text' => number_format(500000) . ' تومان',
'callback_data' => 'arz-500000'
],
[
'text' => number_format(400000) . ' تومان',
'callback_data' => 'arz-400000'
],
],
[
[
'text' => number_format(900000) . ' تومان',
'callback_data' => 'arz-900000'
],
[
'text' => number_format(800000) . ' تومان',
'callback_data' => 'arz-800000'
],
[
'text' => number_format(700000) . ' تومان',
'callback_data' => 'arz-700000'
],
],
[
[
'text' => 'یک میلیون تومان',
'callback_data' => 'arz-1000000'
],
],
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]
);
}
} else {
if ($messageId) {
$this->editAsInlineMessage($chatId, $messageId, 'درگاه پرداخت آنلاین غیر فعال میباشد برای فعالسازی با پشتیبانی در ارتباط باشید'
,
[
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]
);
} else {
$this->sendInlineKeyboard($chatId, 'درگاه پرداخت آنلاین غیر فعال میباشد برای فعالسازی با پشتیبانی در ارتباط باشید',
[
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]
);
}
}
} elseif ($data == 'testService') {
if ($messageId) {
$this->editAsInlineMessage($chatId, $messageId, 'نیاز به تست کدام پروتکل دارید؟',
$this->testServiceTypesButtons
);
} else {
$this->sendInlineKeyboard($chatId, 'نیاز به تست کدام پروتکل دارید؟',
$this->testServiceTypesButtons
);
}
} elseif (
$data == 'tes-v2rayService' ||
$data == 'tes-v2rayServiceUnLimited' ||
$data == 'tes-ciscoService' ||
$data == 'tes-ciscoServiceUnLimited' ||
$data == 'tes-openService' ||
$data == 'tes-openServiceUnLimited' ||
$data == 'tes-vipService'
) {
$this->botUser->setGotTest(1);
$this->entityManager->flush();
$this->createTestService($messageId, $data);
} elseif (preg_match('/^d-\d+$/', $data, $matches)) {
$khanServiceId = str_replace('d-', '', $data);
} elseif (preg_match('/\/acPCh\(p-(\d+)\)\|\(e-([^|]+)\)\|\(u-(\d+)\)/', $data, $matches)) {
$this->getDoctrine()->getManager()->flush();
$price = $matches[1];
$slug = $matches[2];
$userId = $matches[3];
$customerBotUserObject = $this->getDoctrine()->getRepository(BotUser::class)->findOneBy(['userId' => $userId, 'bot' => $this->bot]);
$this->sendInlineKeyboard($this->botUser->getUserId(), 'شارژ کیف پول تایید شد', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
$this->sendInlineKeyboard($customerBotUserObject->getUserId(), 'شارژ کیف پول تایید شد',
[
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]
);
$increaseTransaction = new BotTransaction();
$increaseTransaction->setBot($this->bot);
$increaseTransaction->setBotUser($customerBotUserObject);
$increaseTransaction->setPrice($price);
$increaseTransaction->setDescription('شارژ کیف پول');
$increaseTransaction->setBeforeWallet($customerBotUserObject->getWallet());
$increaseTransaction->setAfterWallet((int)$customerBotUserObject->getWallet() + (int)$price);
$increaseTransaction->setType(1);
$this->entityManager->persist($increaseTransaction);
$this->entityManager->flush();
$customerBotUserObject->setWallet((int)$customerBotUserObject->getWallet() + (int)$price);
if ($messageId) {
$this->deleteMessage($this->bot->getOwnerUserId(), $messageId);
}
$customerBotUserObject->setStep('');
$this->getDoctrine()->getManager()->flush();
} elseif (preg_match('/\/dcPCh\(p-(\d+)\)\|\(e-([^|]+)\)\|\(u-(\d+)\)/', $data, $matches)) {
$this->getDoctrine()->getManager()->flush();
$price = $matches[1];
$slug = $matches[2];
$userId = $matches[3];
$customerBotUserObject = $this->getDoctrine()->getRepository(BotUser::class)->findOneBy(['userId' => $userId, 'bot' => $this->bot]);
$this->sendInlineKeyboard($this->botUser->getUserId(), 'شارژ کیف پول تایید نشد', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
$this->sendInlineKeyboard($customerBotUserObject->getUserId(), 'شارژ کیف پول تایید نشد',
[
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]
);
if ($messageId) {
$this->deleteMessage($this->bot->getOwnerUserId(), $messageId);
}
$customerBotUserObject->setStep('');
$this->getDoctrine()->getManager()->flush();
} else {
$this->sendMessage($chatId, 'No Action Called');
}
return $this->json(['res' => true]);
} catch
(Exception $exception) {
$this->notificationService->exception($exception);
$this->telegramBot->exception($exception);
}
}
public function handleNextQuestion($messageId = null)
{
// $this->sendMessage($this->adminId , $this->botUser->getNewServiceDetail()['serviceType']);die;
switch ($this->botUser->getNewServiceDetail()) {
case (!isset($this->botUser->getNewServiceDetail()['serviceType']) || ($this->botUser->getNewServiceDetail()['serviceType']) == ''):
if ($messageId) {
$this->editAsInlineMessage($this->botUser->getUserId(), $messageId, $this->messages['chooseServiceType'], $this->serviceTypesButtons);
} else {
$this->sendInlineKeyboard($this->botUser->getUserId(), $this->messages['chooseServiceType'], $this->serviceTypesButtons);
}
break;
case (
(str_contains($this->botUser->getNewServiceDetail()['serviceType'], 'UnLimited'))
&&
(!isset($this->botUser->getNewServiceDetail()['country']) || ($this->botUser->getNewServiceDetail()['country']) == '')
):
$countryKeyboard = [];
switch ($this->botUser->getNewServiceDetail()['serviceType']) {
case 'v2rayServiceUnLimited':
$servers = $this->getDoctrine()->getRepository(Server::class)->findBy(['active' => 1]);
foreach ($servers as $server) {
$countryKeyboard[] = [
[
'text' => $this->countryCodeToFlag($server->getCountry()->getCode()) . $server->getCountry()->getTitle(),
'callback_data' => 'country-' . $server->getCountry()->getCode()
]
];
}
break;
case 'openServiceUnLimited':
$servers = $this->getDoctrine()->getRepository(\App\Entity\VPN\OpenVPN\Server::class)->findBy(['active' => 1]);
foreach ($servers as $server) {
$countryKeyboard[] = [
[
'text' => $this->countryCodeToFlag($server->getCountry()->getCode()) . $server->getCountry()->getTitle(),
'callback_data' => 'country-' . $server->getCountry()->getCode()
]
];
}
break;
case 'ciscoServiceUnLimited':
$servers = $this->getDoctrine()->getRepository(\App\Entity\VPN\OcServ\Server::class)->findBy(['active' => 1]);
foreach ($servers as $server) {
$countryKeyboard[] = [
[
'text' => $this->countryCodeToFlag($server->getCountry()->getCode()) . $server->getCountry()->getTitle(),
'callback_data' => 'country-' . $server->getCountry()->getCode()
]
];
}
break;
}
$countryKeyboard[] = [
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
];
if ($messageId) {
$this->editAsInlineMessage($this->botUser->getUserId(), $messageId, $this->messages['chooseServiceLocation'], $countryKeyboard);
} else {
$this->sendInlineKeyboard($this->botUser->getUserId(), $this->messages['chooseServiceLocation'], $countryKeyboard);
}
break;
case (!isset($this->botUser->getNewServiceDetail()['users']) || ($this->botUser->getNewServiceDetail()['users']) == ''):
if ($messageId) {
$this->editAsInlineMessage($this->botUser->getUserId(), $messageId, $this->messages['chooseServiceUsers'], $this->serviceUsersButtons);
} else {
$this->sendInlineKeyboard($this->botUser->getUserId(), $this->messages['chooseServiceUsers'], $this->serviceUsersButtons);
}
break;
case (!isset($this->botUser->getNewServiceDetail()['serviceTime']) || ($this->botUser->getNewServiceDetail()['serviceTime']) == ''):
if ($messageId) {
$this->editAsInlineMessage($this->botUser->getUserId(), $messageId, $this->messages['chooseServiceTime'], $this->serviceTimeButtons);
} else {
$this->sendInlineKeyboard($this->botUser->getUserId(), $this->messages['chooseServiceTime'], $this->serviceTimeButtons);
}
break;
case (
isset($this->botUser->getNewServiceDetail()['serviceType']) &&
isset($this->botUser->getNewServiceDetail()['users']) &&
isset($this->botUser->getNewServiceDetail()['serviceTime'])
):
$botPlansRepo = $this->getDoctrine()->getRepository(BotPlan::class);
try {
switch ($this->botUser->getNewServiceDetail()['serviceType']) {
case 'v2rayService':
$plans = $botPlansRepo->findBy([
'active' => 1,
'bot' => $this->bot,
], []);
foreach ($plans as $key => $plan) {
if ($plan->getPlan() && $plan->getPlan()->isActive()) {
if ($plan->getPlan()->getProtocol() !== 'v2ray' || $plan->getPlan()->getServiceType() !== 'sized' || (int)$plan->getPlan()->getUsers() !== (int)$this->botUser->getNewServiceDetail()['users']) {
unset($plans[$key]);
}
if ($plan->getPlan()->getProtocol() !== 'v2ray' || $plan->getPlan()->getServiceType() !== 'sized' || (int)$plan->getPlan()->getDays() !== (int)$this->botUser->getNewServiceDetail()['serviceTime']) {
unset($plans[$key]);
}
} else {
unset($plans[$key]);
}
}
$plansKeyboard = [];
foreach ($plans as $plan) {
$plansKeyboard[] = [
[
'text' =>
"\u{200F}" .
$this->formatSizeUnits($plan->getPlan()->getSize()) .
' - ' .
number_format($plan->getPrice(), 0) . ' تومان ',
'callback_data' => 'p' . $plan->getUrlSlug()
]
];
}
if (count($plans) < 1) {
if ($messageId) {
$this->editAsInlineMessage($this->botUser->getUserId(), $messageId, 'بسته ای برای فروش با این مشخصات تعریف نشده است', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
} else {
$this->sendInlineKeyboard($this->botUser->getUserId(), 'بسته ای برای فروش با این مشخصات تعریف نشده است', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
}
} else {
$plansKeyboard[] = [
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
];
if ($messageId) {
$this->editAsInlineMessage($this->botUser->getUserId(), $messageId, $this->messages['chooseServicePlan'], $plansKeyboard);
} else {
$this->sendInlineKeyboard($this->botUser->getUserId(), $this->messages['chooseServicePlan'], $plansKeyboard);
}
}
break;
case 'v2rayServiceUnLimited':
$plans = $botPlansRepo->findBy([
'active' => 1,
'bot' => $this->bot,
], []);
foreach ($plans as $key => $plan) {
if ($plan->getPlan() && $plan->getPlan()->isActive()) {
if ($plan->getPlan()->getProtocol() !== 'v2ray' || $plan->getPlan()->getServiceType() !== 'unlimited' || (int)$plan->getPlan()->getUsers() !== (int)$this->botUser->getNewServiceDetail()['users']) {
unset($plans[$key]);
}
if ($plan->getPlan()->getProtocol() !== 'v2ray' || $plan->getPlan()->getServiceType() !== 'unlimited' || (int)$plan->getPlan()->getDays() !== (int)$this->botUser->getNewServiceDetail()['serviceTime']) {
unset($plans[$key]);
}
} else {
unset($plans[$key]);
}
}
$plansKeyboard = [];
foreach ($plans as $plan) {
$plansKeyboard[] = [
[
'text' =>
"\u{200F}" .
number_format($plan->getPrice(), 0) . ' تومان ',
'callback_data' => 'p' . $plan->getUrlSlug()
]
];
}
if (count($plans) < 1) {
if ($messageId) {
$this->editAsInlineMessage($this->botUser->getUserId(), $messageId, 'بسته ای برای فروش با این مشخصات تعریف نشده است', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
} else {
$this->sendInlineKeyboard($this->botUser->getUserId(), 'بسته ای برای فروش با این مشخصات تعریف نشده است', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
}
} else {
$plansKeyboard[] = [
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
];
if ($messageId) {
$this->editAsInlineMessage($this->botUser->getUserId(), $messageId, $this->messages['chooseServicePlan'], $plansKeyboard);
} else {
$this->sendInlineKeyboard($this->botUser->getUserId(), $this->messages['chooseServicePlan'], $plansKeyboard);
}
}
break;
case 'openService':
$plans = $botPlansRepo->findBy([
'active' => 1,
'bot' => $this->bot,
], []);
foreach ($plans as $key => $plan) {
if ($plan->getPlan() && $plan->getPlan()->isActive()) {
if ($plan->getPlan()->getProtocol() !== 'open' || $plan->getPlan()->getServiceType() !== 'sized' || (int)$plan->getPlan()->getUsers() !== (int)$this->botUser->getNewServiceDetail()['users']) {
unset($plans[$key]);
}
if ($plan->getPlan()->getProtocol() !== 'open' || $plan->getPlan()->getServiceType() !== 'sized' || (int)$plan->getPlan()->getDays() !== (int)$this->botUser->getNewServiceDetail()['serviceTime']) {
unset($plans[$key]);
}
} else {
unset($plans[$key]);
}
}
$plansKeyboard = [];
foreach ($plans as $plan) {
$plansKeyboard[] = [
[
'text' =>
"\u{200F}" .
$this->formatSizeUnits($plan->getPlan()->getSize()) .
' - ' .
number_format($plan->getPrice(), 0) . ' تومان ',
'callback_data' => 'p' . $plan->getUrlSlug()
]
];
}
if (count($plans) < 1) {
if ($messageId) {
$this->editAsInlineMessage($this->botUser->getUserId(), $messageId, 'بسته ای برای فروش با این مشخصات تعریف نشده است', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
} else {
$this->sendInlineKeyboard($this->botUser->getUserId(), 'بسته ای برای فروش با این مشخصات تعریف نشده است', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
}
} else {
$plansKeyboard[] = [
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
];
if ($messageId) {
$this->editAsInlineMessage($this->botUser->getUserId(), $messageId, $this->messages['chooseServicePlan'], $plansKeyboard);
} else {
$this->sendInlineKeyboard($this->botUser->getUserId(), $this->messages['chooseServicePlan'], $plansKeyboard);
}
}
break;
case 'openServiceUnLimited':
$plans = $botPlansRepo->findBy([
'active' => 1,
'bot' => $this->bot,
], []);
foreach ($plans as $key => $plan) {
if ($plan->getPlan() && $plan->getPlan()->isActive()) {
if ($plan->getPlan()->getProtocol() !== 'open' || $plan->getPlan()->getServiceType() !== 'unlimited' || (int)$plan->getPlan()->getUsers() !== (int)$this->botUser->getNewServiceDetail()['users']) {
unset($plans[$key]);
}
if ($plan->getPlan()->getProtocol() !== 'open' || $plan->getPlan()->getServiceType() !== 'unlimited' || (int)$plan->getPlan()->getDays() !== (int)$this->botUser->getNewServiceDetail()['serviceTime']) {
unset($plans[$key]);
}
} else {
unset($plans[$key]);
}
}
$plansKeyboard = [];
foreach ($plans as $plan) {
$plansKeyboard[] = [
[
'text' =>
"\u{200F}" .
number_format($plan->getPrice(), 0) . ' تومان ',
'callback_data' => 'p' . $plan->getUrlSlug()
]
];
}
if (count($plans) < 1) {
if ($messageId) {
$this->editAsInlineMessage($this->botUser->getUserId(), $messageId, 'بسته ای برای فروش با این مشخصات تعریف نشده است', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
} else {
$this->sendInlineKeyboard($this->botUser->getUserId(), 'بسته ای برای فروش با این مشخصات تعریف نشده است', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
}
} else {
$plansKeyboard[] = [
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
];
if ($messageId) {
$this->editAsInlineMessage($this->botUser->getUserId(), $messageId, $this->messages['chooseServicePlan'], $plansKeyboard);
} else {
$this->sendInlineKeyboard($this->botUser->getUserId(), $this->messages['chooseServicePlan'], $plansKeyboard);
}
}
break;
case 'ciscoService':
$plans = $botPlansRepo->findBy([
'active' => 1,
'bot' => $this->bot,
], []);
foreach ($plans as $key => $plan) {
if ($plan->getPlan() && $plan->getPlan()->isActive()) {
if ($plan->getPlan()->getProtocol() !== 'ocserv' || $plan->getPlan()->getServiceType() !== 'sized' || (int)$plan->getPlan()->getUsers() !== (int)$this->botUser->getNewServiceDetail()['users']) {
unset($plans[$key]);
}
if ($plan->getPlan()->getProtocol() !== 'ocserv' || $plan->getPlan()->getServiceType() !== 'sized' || (int)$plan->getPlan()->getDays() !== (int)$this->botUser->getNewServiceDetail()['serviceTime']) {
unset($plans[$key]);
}
} else {
unset($plans[$key]);
}
}
$plansKeyboard = [];
foreach ($plans as $plan) {
$plansKeyboard[] = [
[
'text' =>
"\u{200F}" .
$this->formatSizeUnits($plan->getPlan()->getSize()) .
' - ' .
number_format($plan->getPrice(), 0) . ' تومان ',
'callback_data' => 'p' . $plan->getUrlSlug()
]
];
}
if (count($plans) < 1) {
if ($messageId) {
$this->editAsInlineMessage($this->botUser->getUserId(), $messageId, 'بسته ای برای فروش با این مشخصات تعریف نشده است', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
} else {
$this->sendInlineKeyboard($this->botUser->getUserId(), 'بسته ای برای فروش با این مشخصات تعریف نشده است', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
}
} else {
$plansKeyboard[] = [
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
];
if ($messageId) {
$this->editAsInlineMessage($this->botUser->getUserId(), $messageId, $this->messages['chooseServicePlan'], $plansKeyboard);
} else {
$this->sendInlineKeyboard($this->botUser->getUserId(), $this->messages['chooseServicePlan'], $plansKeyboard);
}
}
break;
case 'ciscoServiceUnLimited':
$plans = $botPlansRepo->findBy([
'active' => 1,
'bot' => $this->bot,
], []);
foreach ($plans as $key => $plan) {
if ($plan->getPlan() && $plan->getPlan()->isActive()) {
if ($plan->getPlan()->getProtocol() !== 'ocserv' || $plan->getPlan()->getServiceType() !== 'unlimited' || (int)$plan->getPlan()->getUsers() !== (int)$this->botUser->getNewServiceDetail()['users']) {
unset($plans[$key]);
}
if ($plan->getPlan()->getProtocol() !== 'ocserv' || $plan->getPlan()->getServiceType() !== 'unlimited' || (int)$plan->getPlan()->getDays() !== (int)$this->botUser->getNewServiceDetail()['serviceTime']) {
unset($plans[$key]);
}
} else {
unset($plans[$key]);
}
}
$plansKeyboard = [];
foreach ($plans as $plan) {
$plansKeyboard[] = [
[
'text' =>
"\u{200F}" .
number_format($plan->getPrice(), 0) . ' تومان ',
'callback_data' => 'p' . $plan->getUrlSlug()
]
];
}
if (count($plans) < 1) {
if ($messageId) {
$this->editAsInlineMessage($this->botUser->getUserId(), $messageId, 'بسته ای برای فروش با این مشخصات تعریف نشده است', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
} else {
$this->sendInlineKeyboard($this->botUser->getUserId(), 'بسته ای برای فروش با این مشخصات تعریف نشده است', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
}
} else {
$plansKeyboard[] = [
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
];
if ($messageId) {
$this->editAsInlineMessage($this->botUser->getUserId(), $messageId, $this->messages['chooseServicePlan'], $plansKeyboard);
} else {
$this->sendInlineKeyboard($this->botUser->getUserId(), $this->messages['chooseServicePlan'], $plansKeyboard);
}
}
break;
case 'vipService':
$plans = $botPlansRepo->findBy([
'active' => 1,
'bot' => $this->bot,
], []);
foreach ($plans as $key => $plan) {
if ($plan->getPlan() && $plan->getPlan()->isActive()) {
if ($plan->getPlan()->getProtocol() !== 'vip' || $plan->getPlan()->getServiceType() !== 'sized' || (int)$plan->getPlan()->getUsers() !== (int)$this->botUser->getNewServiceDetail()['users']) {
unset($plans[$key]);
}
if ($plan->getPlan()->getProtocol() !== 'vip' || $plan->getPlan()->getServiceType() !== 'sized' || (int)$plan->getPlan()->getDays() !== (int)$this->botUser->getNewServiceDetail()['serviceTime']) {
unset($plans[$key]);
}
} else {
unset($plans[$key]);
}
}
$plansKeyboard = [];
foreach ($plans as $plan) {
$plansKeyboard[] = [
[
'text' =>
"\u{200F}" .
$this->formatSizeUnits($plan->getPlan()->getSize()) .
' - ' .
number_format($plan->getPrice(), 0) . ' تومان ',
'callback_data' => 'p' . $plan->getUrlSlug()
]
];
}
if (count($plans) < 1) {
if ($messageId) {
$this->editAsInlineMessage($this->botUser->getUserId(), $messageId, 'بسته ای برای فروش با این مشخصات تعریف نشده است', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
} else {
$this->sendInlineKeyboard($this->botUser->getUserId(), 'بسته ای برای فروش با این مشخصات تعریف نشده است', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
}
} else {
$plansKeyboard[] = [
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
];
if ($messageId) {
$this->editAsInlineMessage($this->botUser->getUserId(), $messageId, $this->messages['chooseServicePlan'], $plansKeyboard);
} else {
$this->sendInlineKeyboard($this->botUser->getUserId(), $this->messages['chooseServicePlan'], $plansKeyboard);
}
}
break;
}
} catch (Exception $exception) {
$this->notificationService->exception($exception);
$this->sendMessage($this->adminId, $exception->getMessage());
die;
}
break;
}
}
public function formatSizeUnits($bytes): string
{
if ($bytes >= 1073741824) {
$bytes = number_format($bytes / 1073741824, 2) . ' گیگابایت ';
} elseif ($bytes >= 1048576) {
$bytes = number_format($bytes / 1048576, 2) . ' MB';
} elseif ($bytes >= 1024) {
$bytes = number_format($bytes / 1024, 2) . ' KB';
} elseif ($bytes > 1) {
$bytes = $bytes . ' bytes';
} elseif ($bytes == 1) {
$bytes = $bytes . ' byte';
} else {
$bytes = '0 bytes';
}
return $bytes;
}
private function checkIfUserIsInChannel(string $chatId, string $channelUsername): bool
{
$url = sprintf(
'https://api.telegram.org/bot%s/getChatMember',
$this->token // Replace with your bot token
);
$payload = [
'chat_id' => $channelUsername, // Channel's username or ID
'user_id' => $chatId, // User's chat ID
];
$response = $this->sendRequest($url, $payload);
$responseData = json_decode($response, true);
// Check if the user is a member or admin (you can also check for other statuses)
if (isset($responseData['ok']) && $responseData['ok'] === true) {
$status = $responseData['result']['status'];
return in_array($status, ['member', 'administrator', 'creator']);
}
return false; // Return false if the user is not in the channel or an error occurs
}
private function handleCampaign(string|null $text, string $chatId, LoggerInterface $logger): void
{
if ($text) {
$campaign = $this->getDoctrine()->getRepository(BotCampaign::class)->findOneBy(['bot' => $this->bot, 'title' => $text]);
if (!$campaign) {
$campaign = new BotCampaign();
$campaign->setBot($this->bot);
$campaign->setTitle($text);
}
$this->getDoctrine()->getManager()->persist($campaign);
$this->getDoctrine()->getManager()->flush();
$this->botUser->setCampaign($campaign);
$this->getDoctrine()->getManager()->flush();
}
}
private function handleConnectMessage(string|null $text, string $chatId, LoggerInterface $logger): void
{
if ($text) {
$agent = $this->getDoctrine()->getManager()->getRepository(User::class)->findOneBy([
'id' => $text,
'active' => 1
]);
if (!$agent) {
$this->sendMessage($chatId, 'لینک اتصال به ربات منقضی شده است لطفا مجددا از پنل لینک اتصال دریافت فرمایید');
die;
}
if (!$this->getDoctrine()->getManager()->getRepository(Transaction::class)->findOneBy(['owner' => $agent, 'increaseType' => 'connectTelegram'])) {
$oldExistTelegram = $this->getDoctrine()->getRepository(User::class)->getOldExistTelegramUser($this->botUser->getUserId());
$oldExistIncrease = $this->getDoctrine()->getRepository(Transaction::class)->findOneBy(['owner' => $agent, 'increaseType' => 'connectTelegram']);
if (!$oldExistIncrease && !$oldExistTelegram) {
// $this->panelTrasnactionService->createTransaction($agent, 12000, 'هدیه اتصال به تلگرام و دریافت تست', 1, 0, null, 0, null, 'connectTelegram');
$agent->setGiftWallet($agent->getGiftWallet() + 100000);
$this->entityManager->flush();
}
}
$agent->setConnectedTelegramUserId(([
'userId' => $this->botUser->getUserId(),
'username' => $this->botUser->getUsername() ?? '',
'name' => $this->botUser->getName() ?? ''
]));
$this->entityManager->flush();
$this->sendMessage($chatId,
$agent->getEmail() . PHP_EOL .
$agent->getFirstName() . ' ' . $agent->getLastName() . ' عزیز' .
PHP_EOL .
'از این پس تمامی اعلانات مربوطه از این طریق به اطلاع شما خواهد رسید'
);
$oldExistTelegram = $this->getDoctrine()->getRepository(User::class)->getOldExistTelegramUser($this->botUser->getUserId());
if ($oldExistTelegram) {
$this->sendMessage($chatId,
'این حساب تلگرام قبلا به حساب نمایندگی دیگری متصل شده و هدیه تست دریافت کرده است'
);
}
} else {
$this->sendMessage($this->botUser->getUserId(), 'اتصال انجام نشد مجددا از طریق پنل نمایندگی اقدام فرمایید....');
die;
}
}
private function handleEditedMessage(array $editedMessage, LoggerInterface $logger): void
{
$logger->info('Handling edited message', ['edited_message' => $editedMessage]);
// Process the edited message
}
private function handleInlineQuery(array $inlineQuery, LoggerInterface $logger): void
{
$logger->info('Handling inline query', ['inline_query' => $inlineQuery]);
// Process the inline query
}
private function handleChannelPost(array $channelPost, LoggerInterface $logger): void
{
$logger->info('Handling channel post', ['channel_post' => $channelPost]);
// $this->sendMessage($channelPost['chat']['id'], $channelPost['text']);
// Process the channel post
}
private function handleEditedChannelPost(array $editedChannelPost, LoggerInterface $logger): void
{
$logger->info('Handling edited channel post', ['edited_channel_post' => $editedChannelPost]);
// Process the edited channel post
}
private function handlePoll(array $poll, LoggerInterface $logger): void
{
$logger->info('Handling poll', ['poll' => $poll]);
// Process the poll
}
private function handlePollAnswer(array $pollAnswer, LoggerInterface $logger): void
{
$logger->info('Handling poll answer', ['poll_answer' => $pollAnswer]);
// Process the poll answer
}
private function handleMyChatMember(array $myChatMember, LoggerInterface $logger): void
{
$logger->info('Handling my chat member', ['my_chat_member' => $myChatMember]);
// Process the my_chat_member update
}
private function handleChatMember(array $chatMember, LoggerInterface $logger): void
{
$logger->info('Handling chat member update', ['chat_member' => $chatMember]);
// Extract relevant data from the chat_member update
$userId = $chatMember['user']['id']; // The user ID of the chat member
$status = $chatMember['status']; // The status of the user in the channel
// Check if the user has left the channel
if ($status === 'left') {
$this->sendMessage($userId, 'شما از کانال خارج شدید برای دریافت اطلاعیه بر روس سفارشات خود یا تخفیف ها لطفا مجددا عضو کانال شوید.'
. PHP_EOL .
$this->channelUsername
);
}
}
public function makeUserTransaction($price, $type, $description, $user = null)
{
$transactionObject = new Transaction();
$transactionObject->setPrice($price);
$transactionObject->setDescription($description);
$transactionObject->setType($type);
if ($user) {
$mainUser = $user;
} else {
$mainUser = $this->botUser;
}
$transactionObject->setOwner($mainUser);
$transactionObject->setBeforeWallet($mainUser->getWallet());
if ($type) {
$transactionObject->setAfterWallet($mainUser->getWallet() + $price);
$mainUser->setWallet($mainUser->getWallet() + $price);
} else {
$transactionObject->setAfterWallet($mainUser->getWallet() - $price);
$mainUser->setWallet($mainUser->getWallet() - $price);
}
$this->entityManager->persist($transactionObject);
$this->entityManager->flush();
return true;
}
private function sendMessage(string $chatId, string $text, $markdown = null, bool $silent = false): void
{
$url = sprintf(
'https://api.telegram.org/bot%s/sendMessage',
$this->token // Replace with your bot token
);
$payload = [
'chat_id' => $chatId,
'text' => $this->beautifyText($text),
'disable_notification' => $silent, // Set to true for silent messages
];
if ($markdown) {
$payload['parse_mode'] = $markdown;
}
$this->sendRequest($url, $payload);
}
private function sendMessageRaw(string $chatId, string $text, $markdown = null, bool $silent = false): void
{
$url = sprintf(
'https://api.telegram.org/bot%s/sendMessage',
$this->token // Replace with your bot token
);
$payload = [
'chat_id' => $chatId,
'text' => ($text),
'disable_notification' => $silent, // Set to true for silent messages
];
if ($markdown) {
$payload['parse_mode'] = $markdown;
}
$this->sendRequest($url, $payload);
}
private function answerCallbackQuery(string $callbackQueryId, string $text): void
{
$url = sprintf(
'https://api.telegram.org/bot%s/answerCallbackQuery',
$this->token
);
$payload = [
'callback_query_id' => $callbackQueryId,
'text' => $text,
'show_alert' => true, // Set to true to show an alert popup
];
$this->sendRequest($url, $payload);
}
private function sendInlineKeyboard(string $chatId, string $text, array $keyborad, $parseMode = null): void
{
$url = sprintf(
'https://api.telegram.org/bot%s/sendMessage',
$this->token
);
$payload = [
'chat_id' => $chatId,
'text' => $this->beautifyText($text),
'parse_mode' => $parseMode,
'reply_markup' => json_encode([
'inline_keyboard' =>
$keyborad,
]),
];
if ($parseMode) {
$payload['parse_mode'] = $parseMode;
}
$this->sendRequest($url, $payload);
}
public function editAsInlineMessage(string $chatId, string $messageId, string $text, array $keyborad)
{
$url = sprintf(
'https://api.telegram.org/bot%s/editMessageText',
$this->token
);
$payload = [
'chat_id' => $chatId,
'text' => $this->beautifyText($text),
'message_id' => $messageId,
'reply_markup' => json_encode([
'inline_keyboard' =>
$keyborad,
]),
];
$this->sendRequest($url, $payload);
}
private function deleteMessage(string $chatId, int $messageId): void
{
$url = sprintf(
'https://api.telegram.org/bot%s/deleteMessage',
$this->token
);
$payload = [
'chat_id' => $chatId,
'message_id' => $messageId,
];
$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
}
public function createTestService($messageId = null, $data)
{
if ($this->entityManager->getRepository(Service::class)->findOneBy(['creatorBot' => $this->bot, 'botUser' => $this->botUser])) {
// if (false) {
if ($messageId) {
$this->editAsInlineMessage($this->botUser->getUserId(), $messageId, 'شما قبل تست سرویس ها را به شکل مولتی پروتکل را دریافت کرده اید', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
} else {
$this->sendInlineKeyboard($this->botUser->getUserId(), 'شما قبل تست سرویس ها را به شکل مولتی پروتکل را دریافت کرده اید', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
}
} else {
$testPlan = $this->getDoctrine()->getRepository(Plan::class)->findOneBy([
'protocol' => 'vip',
'serviceType' => 'sized',
'days' => 1,
'users' => 1
]);
$this->deleteMessage($this->botUser->getUserId(), $messageId);
$countryArray = $this->botUser->getNewServiceDetail()['country'] ?? 'all';
$service = $this->createServiceInService($testPlan, [
'clientId' => $this->service->getFreeClientId(),
'username' => $this->botUser->getUserId(),
'password' => $this->botUser->getUserId(),
'note' => ''
], $this->botUser, $countryArray);
$newDomain = str_replace('tehransub.website' , 'tehrannet.org' , $this->brandDomain) ;
$caption =
PHP_EOL .
"سرویس شما با موفقیت ایجاد شد لطفا از طریق لینک زیر اطلاعات سرویس را دریافت کنید" .
PHP_EOL .
"{$newDomain}/vpn/servcie-panel/no-password/{$service->getId()}" .
PHP_EOL .
'تمامی اپلیکیشن ها برای دانلود آموزش ها برای اتصال و اطلاعات سرویس در لینک بالا می باشند پس از مشاهده اطلاعات در صورت وجود مشکل یا سوال پشتیبانی در خدمت شماست...'
. PHP_EOL;
$startPrice = $testPlan->getPrice();
// foreach ($bot->getOwner()->getUserTrace() as $email) {
// $thisUser = $this->getDoctrine()->getRepository(User::class)->findOneBy(['email' => $email]);
// $startPrice = $startPrice + (($startPrice * $thisUser->getInterestRate()) / 100);
// }
$description = "خرید سرویس ربات {$this->bot->getTitle()}
نام کاربر :
{$this->botUser->getName()} -
نام کاربری تلگرام :
{$this->botUser->getUsername()}
بسته :
تست
";
if ($service->getPlan()->hasV2ray()) {
$imgUrl = "{$this->brandDomain}/qr/code?data={$this->brandDomain}/service/{$service->getId()}/subscription-url";
$this->sendPhoto(
$this->botUser->getUserId(),
$imgUrl,
$caption .
PHP_EOL .
'لینک سابسکریپشن افزودن کانفیگ ها (ٰV2ray) : ' .
PHP_EOL .
"{$this->brandDomain}/service/{$service->getId()}/subscription-url"
);
} else {
$this->sendMessage($this->botUser->getUserId(), $caption);
}
}
}
private function sendPhoto($chatId, string $photo, string $caption, $keyboard = null, $beautify = true)
{
$url = sprintf(
'https://api.telegram.org/bot%s/sendPhoto',
$this->token // Replace with your bot token
);
if (!$keyboard) {
$keyboard = [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/startd'
]
]
];
}
if ($beautify) {
$text = $this->beautifyText($caption);
} else {
$text = $caption;
}
$payload = [
'chat_id' => $chatId,
'photo' => $photo,
'caption' => $text,
'parse_mode' => 'HTML', // Enables bold, italic, etc.
'reply_markup' => json_encode([
'inline_keyboard' => $keyboard,
])
];
$this->sendRequest($url, $payload);
}
public function countryCodeToFlag($countryCode)
{
// Convert country code to uppercase
$countryCode = strtoupper($countryCode);
// Offset between uppercase ASCII and regional indicator symbols
$offset = 127397;
// Convert each character of the country code to its flag emoji equivalent
$flagEmoji = '';
for ($i = 0; $i < strlen($countryCode); $i++) {
$flagEmoji .= $this->emoji_convert_unicode(ord($countryCode[$i]) + $offset);
}
return $flagEmoji;
}
public function emoji_convert_unicode($unicode)
{
return mb_convert_encoding('&#' . intval($unicode) . ';', 'UTF-8', 'HTML-ENTITIES');
}
public function createService(?BotUser $objectUser, Bot $bot, BotPlan $botPlan, $messageId)
{
$startPrice = $botPlan->getPlan()->getPrice();
// foreach ($bot->getOwner()->getUserTrace() as $email) {
// $thisUser = $this->getDoctrine()->getRepository(User::class)->findOneBy(['email' => $email]);
// $startPrice = $startPrice + (($startPrice * $thisUser->getInterestRate()) / 100);
// }
if ($objectUser->getWallet() < $startPrice) {
if ($messageId) {
$this->editAsInlineMessage($this->botUser->getUserId(), $messageId, 'موجودی کیف پول شما برای این عمل کافی نیست', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
} else {
$this->sendInlineKeyboard($this->botUser->getUserId(), 'موجودی کیف پول شما برای این عمل کافی نیست', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
}
}
if ($startPrice > $bot->getOwner()->getWallet()) {
if ($messageId) {
$this->editAsInlineMessage($this->botUser->getUserId(), $messageId, 'خطای مالی رخ داد لطفا با پشتیبانی در ارتباط باشید', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
} else {
$this->sendInlineKeyboard($this->botUser->getUserId(), 'خطای مالی رخ داد لطفا با پشتیبانی در ارتباط باشید', [
[
[
'text' => '⬆️ بازگشت به صفحه اصلی',
'callback_data' => '/start'
]
],
]);
}
die;
}
// if ($bot->getOffPercent() && $bot->getOffPercent() > 0) {
// $costPrice = ($bot->getOffPercent() * $botPlan->getVipPlan()->getPrice()) / 100;
// $objectUser->setWallet($objectUser->getWallet() - ($botPlan->getVipPlan()->getPrice() - $costPrice));
// } else {
$objectUser->setWallet($objectUser->getWallet() - $botPlan->getPrice());
// }
$this->deleteMessage($this->botUser->getUserId(), $messageId);
$selectedCountry = 'all';
if (isset($this->botUser->getNewServiceDetail()['country'])) {
$selectedCountry = $this->botUser->getNewServiceDetail()['country'];
}
$increaseTransaction = new BotTransaction();
$increaseTransaction->setBot($this->bot);
$increaseTransaction->setBotUser($this->botUser);
$increaseTransaction->setPrice($botPlan->getPrice());
$increaseTransaction->setDescription('خرید سرویس جدید');
$increaseTransaction->setBeforeWallet($this->botUser->getWallet());
$increaseTransaction->setAfterWallet((int)$this->botUser->getWallet() - (int)$botPlan->getPrice());
$increaseTransaction->setType(0);
$this->entityManager->persist($increaseTransaction);
$this->entityManager->flush();
$service = $this->createServiceInService($botPlan->getPlan(), [
'clientId' => $this->service->getFreeClientId(),
'username' => $this->botUser->getUserId(),
'password' => $this->botUser->getUserId(),
'note' => ''
], $this->botUser, $selectedCountry);
$newDomain = str_replace('tehransub.website' , 'tehrannet.org' , $this->brandDomain) ;
$caption =
PHP_EOL .
"سرویس شما با موفقیت ایجاد شد لطفا از طریق لینک زیر اطلاعات سرویس را دریافت کنید" .
PHP_EOL .
"{$newDomain}/vpn/servcie-panel/no-password/{$service->getId()}" .
PHP_EOL .
'تمامی اپلیکیشن ها برای دانلود آموزش ها برای اتصال و اطلاعات سرویس در لینک بالا می باشند پس از مشاهده اطلاعات در صورت وجود مشکل یا سوال پشتیبانی در خدمت شماست...'
. PHP_EOL;
$agentPrice = $botPlan->getPlan()->getPrice();
$startPrice = $botPlan->getPlan()->getPrice();
// foreach ($bot->getOwner()->getUserTrace() as $email) {
// $thisUser = $this->getDoctrine()->getRepository(User::class)->findOneBy(['email' => $email]);
// $startPrice = $startPrice + (($startPrice * $thisUser->getInterestRate()) / 100);
// }
$description = "خرید سرویس ربات {$bot->getTitle()}
نام کاربر :
{$objectUser->getName()} -
نام کاربری تلگرام :
{$objectUser->getUsername()}
بسته :
{$botPlan->getPlan()}
";
$price = $this->dynamicPriceCalculation->calculatePrice($this->bot->getOwner(), $botPlan->getPlan());
$transaction = $this->transactionService->createTransaction($this->bot->getOwner(), $price, $description, 0);
$oldPrice = $botPlan->getPlan()->getPrice();
$benefitedPrice = $botPlan->getPlan()->getPrice();
$traceArray = [];
// foreach ($bot->getOwner()->getUserTrace() as $email) {
// /**
// * @var User $thisUser
// */
// $thisUser = $this->entityManager->getRepository(User::class)->findOneBy(['email' => $email]);
// if ($thisUser->getPresenter() !== null) {
// $presentor = $thisUser->getPresenter();
// $oldPrice = $traceArray[$presentor->getEmail()];
// $tempPrice = $oldPrice + (($oldPrice * $thisUser->getInterestRate()) / 100);
// $profit = $tempPrice - $oldPrice;
// $description = "سود شما از خرید کاربر واسط ";
// $transaction = $this->transactionService->createTransaction($thisUser->getPresenter(), $profit, $description, 1, 0, $service->getClientId(), 0, null, null, 1, 'Vip');
// $traceArray[$email] = $tempPrice;
// } else {
// if ($thisUser->getInterestRate() !== 0) {
// $finPrice = $botPlan->getVipPlan()->getPrice() + (($botPlan->getVipPlan()->getPrice() * $thisUser->getInterestRate()) / 100);
// $traceArray[$email] = $finPrice;
// } else {
// $traceArray[$email] = $botPlan->getVipPlan()->getPrice();
// }
//
// }
// }
if ($service->getPlan()->hasV2ray()) {
$imgUrl = "{$this->brandDomain}/qr/code?data={$this->brandDomain}/service/{$service->getId()}/subscription-url";
$this->sendPhoto(
$this->botUser->getUserId(),
$imgUrl,
$caption .
PHP_EOL .
'لینک سابسکریپشن افزودن کانفیگ ها (ٰV2ray) : ' .
PHP_EOL .
"{$this->brandDomain}/service/{$service->getId()}/subscription-url"
);
} else {
$this->sendMessage($this->botUser->getUserId(), $caption);
}
if ($bot->getThanksMessage()) {
$this->sendMessage($this->botUser->getUserId(), $bot->getThanksMessage());
}
}
public function createServiceInService(Plan $plan, $dataArray, User|BotUser $owner, $country = 'all'): Service
{
$service = new Service();
$service->setCountry($country);
$service->setClientId($dataArray['clientId']);
$service->setPlan($plan);
if ($owner instanceof User) {
$service->setOwner($owner);
} elseif ($owner instanceof BotUser) {
$service->setBotUser($owner);
$service->setCreatorBot($owner->getBot());
$service->setOwner($owner->getBot()->getOwner());
}
$service->setActive(1);
$service->setUsername($dataArray['username']);
$service->setPassword($dataArray['password']);
$service->setTotal($plan->getSize());
$service->setUsed(0);
$service->setIsEnabled(true);
$service->setNote($dataArray['note'] ?? '');
$service->setTotalPrice($plan->getPrice());
$service->setPayMethod('paid');
$this->entityManager->persist($service);
$this->entityManager->flush();
return $service;
}
#[Route('/ad-dev/{id}', name: 'ad_dev')]
public function dev(BotRepository $botRepository)
{
$bot = $botRepository->findOneBy(['title' => 'tehrannet_bot']);
$this->bot = $bot;
$text = 'واسطه هارو کم کردیم و سعی میکنیم که کمترین قیمت رو به مشتری هامون ارائه بدیم' . PHP_EOL . '
پشتیبانی خیلی پیگیر و (تقریبا!) همیشه آنلاین' . PHP_EOL . '
قیمت سرویس نامحدود از ۸۰ هزارتومن ' . PHP_EOL . '
اگه تا الان از جای دیگه ای فیلترشکن خریدی و راضی نبودی ,بهمون این شانس رو بده , نظرتو عوض میکنیم...' . PHP_EOL . '
دارای سه پروتکل OPEN , CISCO و V2RAY' . PHP_EOL . '
تهران نت , از سال ۱۴۰۰' . PHP_EOL . '
تست رایگان داخل ربات هست و میتونید از قیمت ۱۵ هزارتومن سرویس های کم حجم رو بخرید' . PHP_EOL . '
'.'@tehrannetofficial
🇩🇪🇳🇱🇮🇷 🇬🇧🇫🇮🇦🇪 🇮🇪🇪🇸🇧🇪🇹🇷🇫🇷🇵🇹 ' . PHP_EOL . '
👇👇' . PHP_EOL;
$banner = 'https://tehrannet.org/ad-banner.png';
$this->sendPhoto($this->adminId, $banner, $text, [
[
[
'text' => 'دریافت تست',
'url' => 'https://t.me/tehrannet_bot?start=utm=Gaymotion'
]
]
], false);
}
#[Route('/telegram/agent-public-bot/webhook-neo/{id}/user-services/{userId}', name: 'app_telegram_agent_public_bot_web_hook_neon_user_services')]
public function app_telegram_agent_public_bot_web_hook_neon_user_services(Request $request, $id, $userId, ServiceRepository $serviceRepository, LoggerInterface $logger, BotRepository $botRepository, BotUserRepository $botUserRepository): Response
{
$bot = $botRepository->find($id);
if (!$bot) {
throw new NotFoundHttpException();
}
$botUser = $botUserRepository->findOneBy(['userId' => $userId, 'bot' => $bot]);
if (!$botUser) {
throw new NotFoundHttpException();
}
return $this->render('vpn/telegram-panel/my-services.html.twig', [
'bot' => $bot,
'user' => $botUser,
'services' => $serviceRepository->findBy(['creatorBot' => $bot, 'botUser' => $botUser])
]);
}
#[Route('/telegram/agent-public-bot/webhook-neo/{id}/user-services/{userId}/{serviceId}', name: 'app_telegram_agent_public_bot_web_hook_neon_user_services_charge')]
public function app_telegram_agent_public_bot_web_hook_neon_user_services_charge(ByteConvert $byteConvert , Request $request,\App\Repository\VPN\OpenVPN\ServerRepository $openServerREpo, \App\Repository\VPN\OcServ\ServerRepository $ocServerRepository , ServerRepository $serverRepository, $serviceId, ServiceRepository $serviceRepository, $id, $userId, LoggerInterface $logger, BotRepository $botRepository, BotUserRepository $botUserRepository): Response
{
$bot = $botRepository->find($id);
if (!$bot) {
throw new NotFoundHttpException();
}
$botUser = $botUserRepository->findOneBy(['userId' => $userId, 'bot' => $bot]);
if (!$botUser) {
throw new NotFoundHttpException();
}
$service = $serviceRepository->findOneBy(['id' => $serviceId]);
if (!$service) {
throw new NotFoundHttpException();
}
// var_dump($user->getWallet());die;
$formTypes = [
'sizedVip' => LimitedVipType::class,
'sizedV2ray' => LimitedV2rayType::class,
'unlimitedV2ray' => UnlimitedV2rayType::class,
'sizedOcServ' => LimitedOcServType::class,
'unlimitedOcServ' => UnlimitedOcServType::class,
'sizedOpen' => LimitedOpenType::class,
'unlimitedOpen' => UnlimitedOpenType::class,
];
$forms = [];
foreach ($formTypes as $formName => $formClass) {
switch ($formName) {
case 'unlimitedV2ray':
$locations = [];
foreach ($serverRepository->findBy(['active' => 1]) as $server) {
$locations[$this->countryCodeToFlag($server->getCountry()->getCode()) . $server->getCountry()->getTitle()] = $server->getCountry()->getCode();
}
$form = $this->createForm($formClass, null, [
'clientId' => $service->getClientId(),
'locations' => $locations
]);
break;
case 'unlimitedOcServ':
$locations = [];
foreach ($ocServerRepository->findBy(['active' => 1]) as $server) {
$locations[$this->countryCodeToFlag($server->getCountry()->getCode()) . $server->getCountry()->getTitle()] = $server->getCountry()->getCode();
}
$form = $this->createForm($formClass, null, [
'clientId' => $service->getClientId(),
'locations' => $locations
]);
break;
case 'unlimitedOpen':
$locations = [];
foreach ($openServerREpo->findBy(['active' => 1]) as $server) {
$locations[$this->countryCodeToFlag($server->getCountry()->getCode()) . $server->getCountry()->getTitle()] = $server->getCountry()->getCode();
}
$form = $this->createForm($formClass, null, [
'clientId' => $service->getClientId(),
'locations' => $locations
]);
break;
case 'sizedV2ray':
case 'sizedOpen':
case 'sizedOcServ':
case 'sizedVip':
$form = $this->createForm($formClass, null, [
'clientId' => $service->getClientId()
]);
break;
}
// $form = $this->createForm($formClass, null, [
// 'clientId' => $this->service->getFreeClientId()
// ]);
$form->remove('username');
$form->remove('password');
$form->remove('note');
$form->handleRequest($request);
switch ($formName) {
case 'sizedV2ray':
case 'sizedVip':
case 'unlimitedV2ray':
case 'sizedOcServ':
case 'unlimitedOcServ':
case 'sizedOpen':
case 'unlimitedOpen':
if ($form->isSubmitted() && $form->isValid()) {
$queryArray = $form->getData();
// unset($queryArray['username']);
// unset($queryArray['password']);
$queryArray['size'] = $byteConvert->toByte($queryArray['size'] . 'GB');
$queryArray['active'] = 1;
$targetPlan = $this->getDoctrine()->getRepository(Plan::class)->findOneBy($queryArray);
$targetPlanPrice = $this->getDoctrine()->getRepository(BotPlan::class)->findOneBy([
'bot' => $bot,
'plan' => $targetPlan
]);
if (!$targetPlanPrice) {
$this->addFlash('error', 'این بسته در حال حاضر ارائه نمیشود');
return $this->redirectToRoute('app_telegram_agent_public_bot_web_hook_neon_user_services_charge', [
'id' => $bot->getId(),
'userId' => $botUser->getUserId(),
'serviceId' => $service->getId()
]);
}
// TODO:Check User Interest Rate For Price
$buyPrice = $targetPlanPrice->getPrice();
if ($botUser->getWallet() >= $buyPrice) {
$serviceData = $form->getData();
$serviceData['clientId'] = $form->get('clientId')->getData();
$this->service->chargeService($service, $targetPlan, $serviceData);
$increaseTransaction = new BotTransaction();
$increaseTransaction->setBot($this->bot);
$increaseTransaction->setBotUser($botUser);
$increaseTransaction->setPrice($buyPrice);
$increaseTransaction->setDescription('تمدید سرویس');
$increaseTransaction->setBeforeWallet($botUser->getWallet());
$increaseTransaction->setAfterWallet((int)$botUser->getWallet() - (int)$buyPrice);
$increaseTransaction->setType(0);
$botUser->setWallet($botUser->getWallet() - $buyPrice);
$this->entityManager->persist($increaseTransaction);
$this->entityManager->flush();
$price = $this->dynamicPriceCalculation->calculatePrice($bot->getOwner(), $targetPlan);
$this->transaction->createTransaction($bot->getOwner(), $price, "تمدید سرویس {$service->getClientId()}
از ربات
",
0
);
$this->addFlash('success', 'سرویس مد نظر با موفقیت تمدید شد');
} else {
$this->addFlash('error', 'موجودی کیف پول شما کافی نمی باشد');
}
return $this->redirectToRoute('app_telegram_agent_public_bot_web_hook_neon_user_services_charge', [
'id' => $bot->getId(),
'userId' => $botUser->getUserId(),
'serviceId' => $service->getId(),
]);
}
break;
default:
// Handle any default case if necessary
break;
}
$forms[$formName] = $form->createView();
}
return $this->render('vpn/telegram-panel/charge.html.twig', [
'bot' => $bot,
'user' => $botUser,
'services' => $serviceRepository->findBy(['creatorBot' => $bot, 'botUser' => $botUser]),
'service' => $service,
'sizedVipForm' => $forms['sizedVip'] ?? '',
'sizedV2rayForm' => $forms['sizedV2ray'] ?? '',
'unlimitedV2rayForm' => $forms['unlimitedV2ray'] ?? '',
'sizedOcServForm' => $forms['sizedOcServ'] ?? '',
'unlimitedOcServForm' => $forms['unlimitedOcServ'] ?? '',
'sizedOpenForm' => $forms['sizedOpen'] ?? '',
'unlimitedOpenForm' => $forms['unlimitedOpen'] ?? '',
'charge' => 1
]);
}
#[Route('/telegram/get-ajax-price/agent-public-bot/webhook-neo/{id}/user-services/{userId}/{serviceId}', name: 'app_telegram_agent_public_bot_web_hook_neon_user_services_charge_get_ajax_price')]
public function app_telegram_agent_public_bot_web_hook_neon_user_services_charge_get_ajax_price(ByteConvert $byteConvert , Request $request,\App\Repository\VPN\OpenVPN\ServerRepository $openServerREpo, \App\Repository\VPN\OcServ\ServerRepository $ocServerRepository , ServerRepository $serverRepository, $serviceId, ServiceRepository $serviceRepository, $id, $userId, LoggerInterface $logger, BotRepository $botRepository, BotUserRepository $botUserRepository )
{
$bot = $botRepository->find($id);
if (!$bot) {
throw new NotFoundHttpException();
}
$botUser = $botUserRepository->findOneBy(['userId' => $userId, 'bot' => $bot]);
if (!$botUser) {
throw new NotFoundHttpException();
}
/**
* @var User $user
*/
$user = $this->getUser();
$queryArray = $request->request->all();
unset($queryArray['country']);
unset($queryArray['password']);
unset($queryArray['username']);
unset($queryArray['price']);
unset($queryArray['_token']);
$queryArray['size'] = $byteConvert->toByte($queryArray['size'] . 'GB');
$queryArray['active'] = 1;
$targetPlan = $this->getDoctrine()->getRepository(Plan::class)->findOneBy($queryArray);
$targetBotPlan = $this->getDoctrine()->getRepository(BotPlan::class)->findOneBy([
'bot' => $bot,'plan' => $targetPlan]);
// return $this->json(['res' => $queryArray]);
if (!$targetBotPlan) {
return $this->json(['message' => 'این بسته در حال حاضر ارائه نمیشود']);
} else {
return $this->json(['message' =>
number_format($targetBotPlan->getPrice()) .
' تومان'
]);
}
}
}