query($sqlData); $apiKeys = $stmtData->fetchAll(PDO::FETCH_COLUMN); if (!empty($apiKeys)) { foreach ($apiKeys as $keyapi) { $pdo->beginTransaction(); // --- CEK LOG APIKEY --- $sql1 = "SELECT chat_count, update_time FROM chat_log_apikey WHERE apikey_whatsapp = :apiKey LIMIT 1"; $stmt = $pdo->prepare($sql1); $stmt->execute([':apiKey' => $keyapi]); $log = $stmt->fetch(PDO::FETCH_ASSOC); $chatCount = $log ? (int)$log['chat_count'] : 0; $updateTime = $log ? strtotime($log['update_time']) : 0; $now = time(); // Kalau sudah lebih dari 200, cek jeda 10 menit if ($chatCount >= 200) { if ($now < $updateTime + (10 * 60)) { // Masih dalam masa jeda, skip API key ini $pdo->commit(); echo "[PAUSE] API {$keyapi} ditunda sampai " . date('Y-m-d H:i:s', $updateTime + 300) . "\n"; continue; } else { // Reset counter karena sudah lewat 10 menit $chatCount = 0; } } // --- AMBIL PESAN PENDING --- $sql = " SELECT * FROM master_pesan WHERE api_key = :apiKey AND status = 'PENDING' ORDER BY id ASC LIMIT 1 FOR UPDATE "; $stmt = $pdo->prepare($sql); $stmt->execute([':apiKey' => $keyapi]); $data = $stmt->fetch(PDO::FETCH_ASSOC); if ($data) { // Lock pesan jadi PROCESSING $updateProcessing = $pdo->prepare(" UPDATE master_pesan SET status = 'PROCESSING' WHERE id = :id AND status = 'PENDING' "); $updateProcessing->execute([':id' => $data['id']]); $pdo->commit(); // --- KIRIM PESAN --- $jenis = $data['jenis_pesan']; $apiurl = $data['api_url']; $datapost = ''; if ($jenis === "sendMessage") { $datapost = http_build_query([ 'apiKey' => $data['api_key'], 'phone' => $data['nomor'], 'message' => $data['pesan'] ]); } elseif ($jenis === "sendMediaFromUrl") { $datapost = http_build_query([ 'apiKey' => $data['api_key'], 'phone' => $data['nomor'], 'url_file' => $data['url_file'], 'as_document' => '0', 'caption' => $data['pesan'] ]); } else { error_log("[INVALID JENIS] Jenis pesan tidak valid: {$jenis} untuk ID {$data['id']}"); $pdo->prepare("UPDATE master_pesan SET status = 'GAGAL' WHERE id = :id") ->execute([':id' => $data['id']]); continue; } $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => $apiurl . $jenis, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $datapost, CURLOPT_HTTPHEADER => [ 'Content-Type: application/x-www-form-urlencoded', 'Content-Length: ' . strlen($datapost) ], ]); $response = curl_exec($curl); $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); if (curl_errno($curl) || $httpCode >= 400) { error_log("[CURL ERROR] ID {$data['id']}: " . curl_error($curl)); $status = 'GAGAL'; } else { $rdata = json_decode($response, true); $status = ($rdata && $rdata['code'] == 200) ? 'TERKIRIM' : 'GAGAL'; } curl_close($curl); // Update status pesan $pdo->prepare("UPDATE master_pesan SET status = :status WHERE id = :id") ->execute([':status' => $status, ':id' => $data['id']]); // Update log apikey $newCount = ($status === 'TERKIRIM') ? $chatCount + 1 : $chatCount; $sqlLog = " INSERT INTO chat_log_apikey (apikey_whatsapp, chat_count, update_time) VALUES (:apiKey, :chatCount, NOW()) ON DUPLICATE KEY UPDATE chat_count = :chatCount, update_time = NOW() "; $pdo->prepare($sqlLog)->execute([ ':apiKey' => $keyapi, ':chatCount' => $newCount ]); echo "[{$status}] ID {$data['id']} untuk API {$keyapi}, count={$newCount}\n"; } else { $pdo->commit(); // tidak ada pesan untuk API key ini } } } else { echo "[INFO] Tidak ada API Key aktif untuk Whatsapp Gateway\n"; } } catch (PDOException $e) { $pdo->rollBack(); error_log("[DB ERROR] " . $e->getMessage()); echo "[DB ERROR] " . $e->getMessage() . "\n"; } catch (Exception $e) { $pdo->rollBack(); error_log("[GENERAL ERROR] " . $e->getMessage()); echo "[ERROR] " . $e->getMessage() . "\n"; } ?>