<?php

set_time_limit(0);
ini_set('max_execution_time', 0);
ini_set('memory_limit', '512M');

$scriptStart = microtime(true);

// Telegram bot token and user ID
$armpToken = "6699635284:AAFklesnB4P6CmMz0mc8nIVq72XjSRf0gCQ";
$armpUserID = "1289522313";

// Groq API Key
$groqApiKey = "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";

// Check interval in seconds
$checkInterval = 5;

// Phone numbers to call
$phoneNumbers = array("09164440324");

// Function to rewrite message using Groq AI
function rewriteWithAI($messageText, $groqApiKey) {
$systemPrompt = <<<EOT
تو یک دستیار هوشمند برای بازنویسی اطلاعیه‌های رسمی آلودگی هوای استان خوزستان هستی. وظیفه‌ات اینه که اطلاعیه‌های ورودی رو به یک فرمت جذاب، خلاصه و آماده انتشار در تلگرام تبدیل کنی. خروجی همیشه دقیقاً در فرمت مشخص‌شده باشه و هیچ متن اضافی خارج از فرمت اضافه نکن (نه مقدمه، نه توضیح، نه خداحافظی). هیچ یوزرنیم، رسانه، وبسایت یا لینک اضافی به جز لینک‌های ثابت ربات و کانال اضافه نکن.

### قوانین کلی برای خروجی:
- **فرمت کلی خروجی**:
  - شروع با تایتل بولد: 🔴 **فوری / [تایتل خلاصه و جذاب]!!!**
  - متن اصلی با 🔸 برای هر پاراگراف یا بخش کلیدی (ساختار رو حفظ کن؛ تمام جزئیات کلیدی مثل تاریخ، دلایل، استثناها، محدودیت‌ها و توصیه‌ها رو کامل و بدون جاانداختن نگه دار). در آخر هر 🔸 ، عبارت « / دانش آموزِ خوزستانی» اضافه کن.
  - بعد از آخرین 🔸 دو خط خالی اضافه کن (برای فاصله مناسب، نه بیشتر از 3 خط)، سپس لینک‌های ثابت بولد:
```


**- ربات بررسی آلودگی هوا**  
🤖 **https://t.me/DOEArmpBot**  
**- اخبار تعطیلی خوزستان**  
📣 **https://t.me/Student_Khuzestan**
```
- **خلاصه‌سازی متن**: اطلاعیه اصلی رو بازنویسی کن، اما تمام جملات و بخش‌ها رو کامل و بدون جاانداختن حفظ کن. جملات رو روان و کوتاه کن اما اطلاعات اصلی رو از دست نده. همیشه در متن از "غیرحضوری" استفاده کن (نه تعطیل)، اما فقط در تایتل از "تعطیل" برای غیرحضوری مدارس استفاده کن. **هر اشاره به رسانه، کانال، وبسایت، خبرگزاری، صداوسیما یا پیام‌رسان رو کامل حذف کن و فقط محتوای اصلی رو نگه دار.**
- **اضافه کردن عبارت ثابت**: در ابتدای متن اصلی (اولین 🔸)، همیشه "به نقل از کانال دانش آموزِ خوزستانی و" رو قبل از "بر اساس تصمیم کارگروه..." یا معادلش اضافه کن. دلایل رو کامل نگه دار.
- **شمارش شهرها**: تعداد شهرها رو دقیق بشمار و در تایتل ذکر کن.
- **لیست شهرها**: شهرها رو دقیقاً به همان ترتیب اطلاعیه بنویس، با کاما جدا کن.
- **تاریخ و نوبت**: تاریخ شمسی رو دقیق حفظ کن و در متن اصلی ذکر کن. نوبت‌ها (صبح، ظهر، عصر) رو واضح ذکر کن؛ اگر مشخص نباشه، ذکر نکن.
- **اعداد**: همه اعداد (تاریخ، ساعت، تعداد شهرستان و …) حتماً فارسی باشن (مثل ۱، ۲، ۱۵، ۱۶، ۱۴۰۴، ۹:۳۰).

### قوانین دقیق برای تایتل (همیشه بولد و با ** کل تایتل):
- **تایتل باید کوتاه، هیجانی و خلاصه باشه** – حداکثر ۱-۲ جمله. همیشه با "فوری /" شروع کن و با "!!!" تموم کن.
- **اگر تعداد روزهای تعطیلی یا غیرحضوری بودن بیش از یک روز بود، حتما روزهای تعطیلی رو در تایتل ذکر کن** (مثلاً "روزهای شنبه و یکشنبه (۱ و ۲ آذر)" یا "از دوشنبه تا پایان هفته").
- **اولویت‌بندی**: همیشه اولویت با مدارس، بعد دانشگاه‌ها، بعد ادارات. اگر دانشگاه‌ها هم درگیر باشن، حتماً در تایتل ذکر کن.
- **موارد تعطیلی/غیرحضوری مدارس**:
  - الگو: "مدارس [و دانشگاه‌ها اگر باشه] [نوبت اگر مشخص] در [تعداد] شهرستان [لیست] [روزهای تعطیلی] تعطیل شد [و اگر تأخیر ادارات باشه: و ادارات با تأخیر از ساعت Y فعالیت می‌کنند]!!!"
  - مثال: "مدارس و دانشگاه‌ها در ۵ شهرستان اهواز، باوی، کارون، حمیدیه و شوشتر روزهای شنبه و یکشنبه (۱ و ۲ آذر) تعطیل شد!!!"
- **تعطیلی کل استان به جز چند شهرستان**:
  - الگو: "کلیه مدارس خوزستان به جز [تعداد] شهرستان [لیست مستثنی] [نوبت] [روزهای تعطیلی] تعطیل شد!!!"
  - مثال: "کلیه مدارس خوزستان به جز ۸ شهرستان ایذه، باغملک، صیدون، هفتکل، دهدز، لالی، اندیکا و مسجدسلیمان در نوبت صبح و عصر روزهای شنبه و یکشنبه تعطیل شد!!!"
- **بازگشت به حضوری**:
  - الگو: "تمام ادارات، مدارس و دانشگاه‌های خوزستان [تاریخ] حضوری و عادی شد!!!"
  - مثال: "تمام ادارات، مدارس و دانشگاه‌های خوزستان سه‌شنبه ۴ آذر حضوری و عادی شد!!!"
- **فقط تأخیر (بدون تعطیلی)**:
  - الگو: "مدارس [و دانشگاه‌ها] در [تعداد] شهرستان [لیست] از ساعت [زمان] صبح و ادارات با تأخیر از ساعت [زمان] فعالیت می‌کنند!!!"

وقتی اطلاعیه ورودی رو می‌گیری، مستقیم خروجی رو در فرمت مشخص بده – بدون هیچ توضیح اضافی. خروجی رو دقیقاً مطابق مثال‌ها نگه دار، با حفظ تمام جزئیات کلیدی و ساختار 🔸 جداگانه برای هر بخش، و در آخر هر 🔸 عبارت « / دانش آموزِ خوزستانی» اضافه کن. اگر چند روز تعطیلی اعلام شده، حتما در تایتل ذکر کن.

EOT;

$payload = [
"messages" => [
[
"role" => "system",
"content" => $systemPrompt
],
[
"role" => "user",
"content" => $messageText
]
],
"model" => "openai/gpt-oss-120b",
"temperature" => 1,
"max_completion_tokens" => 8192,
"top_p" => 1,
"stream" => false,
"reasoning_effort" => "medium",
"stop" => null
];

$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.groq.com/openai/v1/chat/completions',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 60,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Authorization: Bearer ' . $groqApiKey
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);

if ($err) {
return "❌ AI Error: " . $err;
}

$responseData = json_decode($response, true);

if (isset($responseData['choices'][0]['message']['content'])) {
$content = $responseData['choices'][0]['message']['content'];

if (preg_match('/```(.*?)```/s', $content, $matches)) {
return trim($matches[1]);
}

return $content;
}

return "❌ AI Response Error: " . $response;
}

// Function to make call via Komodaa API
function makeCall($phoneNumber) {
$callResult = "";

// First request
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.komodaa.com/api/v2.6/loginRC/request',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => json_encode([
"phone_number" => $phoneNumber,
"force_send_otp" => true
]),
CURLOPT_HTTPHEADER => [
'User-Agent: Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36',
'Accept: application/json',
'Content-Type: application/json',
],
]);

$response1 = curl_exec($curl);
$err1 = curl_error($curl);
curl_close($curl);

if ($err1) {
$callResult .= "❌ First Request Error: " . $err1 . "\n";
return $callResult;
}

$callResult .= "📞 First Request Response:\n" . $response1 . "\n\n";

// Wait a moment before second request
sleep(2);

// Second request
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.komodaa.com/api/v2.6/loginRC/request',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => json_encode([
"phone_number" => $phoneNumber,
"force_send_otp" => true
]),
CURLOPT_HTTPHEADER => [
'User-Agent: Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36',
'Accept: application/json',
'Content-Type: application/json',
],
]);

$response2 = curl_exec($curl);
$err2 = curl_error($curl);
curl_close($curl);

if ($err2) {
$callResult .= "❌ Second Request Error: " . $err2 . "\n";
return $callResult;
}

$callResult .= "📞 Second Request Response:\n" . $response2 . "\n";

// Check if wait_for_call is true
$response2Data = json_decode($response2, true);
if (isset($response2Data['wait_for_call']) && $response2Data['wait_for_call'] === true) {
$callResult .= "\n✅ Call initiated successfully!";
}
else {
$callResult .= "\n⚠️ Call may not have been initiated properly.";
}

return $callResult;
}

// Function to fetch content using cURL
function fetchContent($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36');
curl_setopt($ch, CURLOPT_TIMEOUT, 30);

$html = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if (curl_errno($ch)) {
echo "cURL Error: " . curl_error($ch) . "\n";
curl_close($ch);
return false;
}

curl_close($ch);

if ($httpCode != 200) {
echo "HTTP Error: $httpCode\n";
return false;
}

return $html;
}

// Function to check channels
function checkChannels($Filters, $channels, $armpToken, $armpUserID, $phoneNumbers, $groqApiKey) {
foreach ($channels as $Channel) {
$channelStart = microtime(true);

$Channel = trim($Channel);
if (empty($Channel)) {
continue;
}

$url = "https://ble.ir/$Channel";

$fetchStart = microtime(true);
$html = fetchContent($url);
$fetchTime = (microtime(true) - $fetchStart);

if ($html === false) {
echo "Failed to fetch content for channel: $Channel\n\n";
continue;
}

$parseStart = microtime(true);
preg_match('/<script id="__NEXT_DATA__" type="application\/json">(.*?)<\/script>/s', $html, $matches);

if (empty($matches[1])) {
echo "No JSON data found for channel: $Channel\n\n";
continue;
}

$jsonData = json_decode($matches[1], true);

if (json_last_error() !== JSON_ERROR_NONE) {
echo "JSON decode error for channel: $Channel - " . json_last_error_msg() . "\n\n";
continue;
}

if (!isset($jsonData['props']['pageProps']['messages']) || empty($jsonData['props']['pageProps']['messages'])) {
echo "No messages found for channel: $Channel\n\n";
continue;
}

$messages = $jsonData['props']['pageProps']['messages'];
$lastMessage = end($messages);

$messageText = "";

if ($lastMessage['type'] === 'TEXT' && isset($lastMessage['message']['textMessage']['text'])) {
$messageText = $lastMessage['message']['textMessage']['text'];
}
elseif ($lastMessage['type'] === 'PHOTO' && isset($lastMessage['message']['documentMessage']['caption']['text'])) {
$messageText = $lastMessage['message']['documentMessage']['caption']['text'];
}
elseif ($lastMessage['type'] === 'VIDEO' && isset($lastMessage['message']['documentMessage']['caption']['text'])) {
$messageText = $lastMessage['message']['documentMessage']['caption']['text'];
}

$messageText = trim($messageText);
$parseTime = (microtime(true) - $parseStart);

if (empty($messageText)) {
echo "Empty message from channel: $Channel\n\n";
continue;
}

$filterStart = microtime(true);
$foundFilters = array();
foreach ($Filters as $filter) {
if (str_contains($messageText, $filter)) {
$foundFilters[] = $filter;
}
}
$filterCheckTime = (microtime(true) - $filterStart) * 1000;

if (!empty($foundFilters)) {
$channelFile = "$Channel.txt";
if (!file_exists($channelFile) || $messageText != file_get_contents($channelFile)) {
$filterList = implode(", ", $foundFilters);

echo "🚨 IMPORTANT MESSAGE FOUND in channel: $Channel\n";

// 1. Send ORIGINAL message first
echo "📩 Sending ORIGINAL message...\n";

$originalText = "<code>$messageText</code>

━━━━━━━━━━━━━━━━━━━━━━
📨 ORIGINAL MESSAGE
━━━━━━━━━━━━━━━━━━━━━━

📍 Channel: @$Channel
🔍 Found Filter: $filterList

━━━━━━━━━━━━━━━━━━━━━━
⏱ PERFORMANCE STATS:
━━━━━━━━━━━━━━━━━━━━━━

⏳ Fetch Time: " . round($fetchTime, 2) . "s
⚙️ Parse Time: " . round($parseTime, 3) . "s
🔎 Filter Check: " . round($filterCheckTime, 2) . "ms

━━━━━━━━━━━━━━━━━━━━━━";

$originalSent = file_get_contents("https://api.telegram.org/bot$armpToken/SendMessage?chat_id=$armpUserID&parse_mode=HTML&text=" . urlencode($originalText));
if ($originalSent) {
echo "✅ Original Message Sent To TG\n";
}

// 2. Process with AI
echo "🤖 Processing message with AI...\n";

$aiStart = microtime(true);
$rewrittenMessage = rewriteWithAI($messageText, $groqApiKey);
$aiTime = (microtime(true) - $aiStart);

// 3. Send AI PROCESSED message
$aiText = "<code>$rewrittenMessage</code>

━━━━━━━━━━━━━━━━━━━━━━
🤖 AI PROCESSED MESSAGE
━━━━━━━━━━━━━━━━━━━━━━

📍 Channel: @$Channel
🔍 Found Filter: $filterList

━━━━━━━━━━━━━━━━━━━━━━
⏱ PERFORMANCE STATS:
━━━━━━━━━━━━━━━━━━━━━━

🤖 AI Processing: " . round($aiTime, 2) . "s

━━━━━━━━━━━━━━━━━━━━━━";

$aiText2 = "<code>$rewrittenMessage</code>

━━━━━━━━━━━━━━━━━━━━━━
🤖 AI PROCESSED MESSAGE
━━━━━━━━━━━━━━━━━━━━━━

📍 Coded By: @D_V_4

━━━━━━━━━━━━━━━━━━━━━━
⏱ PERFORMANCE STATS:
━━━━━━━━━━━━━━━━━━━━━━

🤖 AI Processing: " . round($aiTime, 2) . "s

━━━━━━━━━━━━━━━━━━━━━━";

$aiSent = file_get_contents("https://api.telegram.org/bot$armpToken/SendMessage?chat_id=$armpUserID&parse_mode=HTML&text=" . urlencode($aiText));
file_get_contents("https://api.telegram.org/bot$armpToken/SendMessage?chat_id=-1002345279256&parse_mode=HTML&text=" . urlencode($aiText2));

if ($aiSent) {
echo "✅ AI Message Sent To TG\n";
}

// 4. Make calls to all phone numbers
echo "📞 Making calls...\n";

$callReports = "";
foreach ($phoneNumbers as $phoneNumber) {
echo "Calling $phoneNumber...\n";
if (!file_exists("../.NoCall")) {
$callResult = makeCall($phoneNumber);
$callReports .= "━━━━━━━━━━━━━━━━━━━━━━\n";
$callReports .= "📱 Phone: $phoneNumber\n";
$callReports .= "━━━━━━━━━━━━━━━━━━━━━━\n";
$callReports .= $callResult . "\n\n";
}
else {
echo "⏸️  Call skipped (.NoCall file exists)\n";
$callReports .= "━━━━━━━━━━━━━━━━━━━━━━\n";
$callReports .= "📱 Phone: $phoneNumber\n";
$callReports .= "⏸️  Status: Skipped (.NoCall file exists)\n";
$callReports .= "━━━━━━━━━━━━━━━━━━━━━━\n\n";
}
}

// 5. Send CALL REPORT
$channelTotal = (microtime(true) - $channelStart);

$callReportText = "━━━━━━━━━━━━━━━━━━━━━━
📞 CALL ALERT REPORT
━━━━━━━━━━━━━━━━━━━━━━

📍 Channel: @$Channel
🔍 Found Filter: $filterList

━━━━━━━━━━━━━━━━━━━━━━
📞 CALL REPORTS:
━━━━━━━━━━━━━━━━━━━━━━

$callReports

━━━━━━━━━━━━━━━━━━━━━━
⏱ TOTAL TIME: " . round($channelTotal, 2) . "s
━━━━━━━━━━━━━━━━━━━━━━";

$callReportSent = file_get_contents("https://api.telegram.org/bot$armpToken/SendMessage?chat_id=$armpUserID&text=" . urlencode($callReportText));
if ($callReportSent) {
echo "✅ Call Report Sent To TG\n";
}

file_put_contents($channelFile, $messageText);

echo "🎉 Complete! Total time: " . round($channelTotal, 2) . "s\n\n";

}
else {
echo "Text Already Sent To TG for channel: $Channel.\n";
}
}
else {
echo "Message from $Channel is not important.\n";
}
}
}

echo "🚀 Starting continuous monitoring with AI + CALL ALERT...\n";
echo "━━━━━━━━━━━━━━━━━━━━━━\n";
echo "Check interval: $checkInterval seconds\n";
echo "📞 Phone numbers: " . implode(", ", $phoneNumbers) . "\n";
echo "🤖 AI Processing: Enabled (Groq)\n";
echo "━━━━━━━━━━━━━━━━━━━━━━\n\n";

$iteration = 0;
while (true) {
$iteration++;
$loopStart = microtime(true);

echo "🔄 Iteration #$iteration - " . date('Y-m-d H:i:s') . "\n";

$filtersFile = "../Filters2.txt";
if (file_exists($filtersFile)) {
$Filters = file($filtersFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$Filters = array_map('trim', $Filters);
}
else {
echo "⚠️ Filters2.txt not found, using empty filters.\n";
$Filters = array();
}

$channelsFile = "chs.txt";
if (file_exists($channelsFile)) {
$channels = file($channelsFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
}
else {
echo "⚠️ chs.txt not found, skipping this iteration.\n";
sleep($checkInterval);
continue;
}

if (!empty($channels) && !empty($Filters)) {
checkChannels($Filters, $channels, $armpToken, $armpUserID, $phoneNumbers, $groqApiKey);
}

$loopTime = microtime(true) - $loopStart;
echo "⏱️ Loop completed in " . round($loopTime, 2) . " seconds\n";
echo "💤 Sleeping for $checkInterval seconds...\n";
echo "━━━━━━━━━━━━━━━━━━━━━━\n\n";

sleep($checkInterval);
}
?>