PDO::ERRMODE_EXCEPTION]); } return $pdo; } function ensureTables() { $pdo = getDB(); $pdo->exec("CREATE TABLE IF NOT EXISTS admin.telegram_config (id SERIAL PRIMARY KEY, bot_token VARCHAR(255), chat_id VARCHAR(100), is_active BOOLEAN DEFAULT true)"); $pdo->exec("CREATE TABLE IF NOT EXISTS admin.ai_config (id SERIAL PRIMARY KEY, provider VARCHAR(50), api_key VARCHAR(500), model VARCHAR(100), is_active BOOLEAN DEFAULT true)"); $pdo->exec("CREATE TABLE IF NOT EXISTS admin.imap_checkers (id SERIAL PRIMARY KEY, name VARCHAR(255), email VARCHAR(255), password VARCHAR(255), imap_host VARCHAR(255), imap_port INTEGER DEFAULT 993, spam_folder VARCHAR(100) DEFAULT 'Junk', last_check TIMESTAMP, inbox_count INTEGER DEFAULT 0, spam_count INTEGER DEFAULT 0, is_active BOOLEAN DEFAULT true)"); $pdo->exec("CREATE TABLE IF NOT EXISTS admin.wevads_config (id SERIAL PRIMARY KEY, api_url VARCHAR(500) DEFAULT 'http://api.weval.digital:58081', username VARCHAR(255), password VARCHAR(255), auth_cookie TEXT, is_active BOOLEAN DEFAULT true)"); } class TelegramBot { private $token, $chatId; public function __construct() { $pdo = getDB(); $config = $pdo->query("SELECT * FROM admin.telegram_config WHERE is_active = true LIMIT 1")->fetch(PDO::FETCH_ASSOC); if ($config) { $this->token = $config['bot_token']; $this->chatId = $config['chat_id']; } } public function send($message, $parseMode = 'HTML') { if (!$this->token || !$this->chatId) return false; $ch = curl_init("https://api.telegram.org/bot{$this->token}/sendMessage"); curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => ['chat_id' => $this->chatId, 'text' => $message, 'parse_mode' => $parseMode]]); $result = curl_exec($ch); curl_close($ch); return json_decode($result, true); } public function alert($title, $msg, $sev = 'info') { $emoji = ['info' => 'ā¹ļø', 'warning' => 'ā ļø', 'error' => 'šØ', 'success' => 'ā ']; return $this->send("{$emoji[$sev]} {$title}\n\n{$msg}\n\nš " . date('Y-m-d H:i:s')); } } class AIHelper { private $provider, $apiKey, $model; public function __construct() { $pdo = getDB(); $config = $pdo->query("SELECT * FROM admin.ai_config WHERE is_active = true LIMIT 1")->fetch(PDO::FETCH_ASSOC); if ($config) { $this->provider = $config['provider']; $this->apiKey = $config['api_key']; $this->model = $config['model']; } } public function generate($prompt) { if (!$this->apiKey) return ['success' => false, 'error' => 'No API key configured']; switch ($this->provider) { case 'anthropic': return $this->claude($prompt); case 'openai': return $this->openai($prompt); case 'groq': return $this->groq($prompt); case 'deepseek': return $this->deepseek($prompt); default: return ['success' => false, 'error' => 'Unknown provider']; } } private function claude($prompt) { $ch = curl_init('https://api.anthropic.com/v1/messages'); curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'x-api-key: ' . $this->apiKey, 'anthropic-version: 2023-06-01'], CURLOPT_POSTFIELDS => json_encode(['model' => $this->model ?: 'claude-3-haiku-20240307', 'max_tokens' => 1024, 'messages' => [['role' => 'user', 'content' => $prompt]]])]); $r = json_decode(curl_exec($ch), true); curl_close($ch); return isset($r['content'][0]['text']) ? ['success' => true, 'text' => $r['content'][0]['text']] : ['success' => false, 'error' => $r['error']['message'] ?? 'Error']; } private function openai($prompt) { $ch = curl_init('https://api.openai.com/v1/chat/completions'); curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'Authorization: Bearer ' . $this->apiKey], CURLOPT_POSTFIELDS => json_encode(['model' => $this->model ?: 'gpt-3.5-turbo', 'messages' => [['role' => 'user', 'content' => $prompt]], 'max_tokens' => 1024])]); $r = json_decode(curl_exec($ch), true); curl_close($ch); return isset($r['choices'][0]['message']['content']) ? ['success' => true, 'text' => $r['choices'][0]['message']['content']] : ['success' => false, 'error' => $r['error']['message'] ?? 'Error']; } private function groq($prompt) { $ch = curl_init('https://api.groq.com/openai/v1/chat/completions'); curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'Authorization: Bearer ' . $this->apiKey], CURLOPT_POSTFIELDS => json_encode(['model' => $this->model ?: 'llama3-8b-8192', 'messages' => [['role' => 'user', 'content' => $prompt]], 'max_tokens' => 1024])]); $r = json_decode(curl_exec($ch), true); curl_close($ch); return isset($r['choices'][0]['message']['content']) ? ['success' => true, 'text' => $r['choices'][0]['message']['content']] : ['success' => false, 'error' => $r['error']['message'] ?? 'Error']; } private function deepseek($prompt) { $ch = curl_init('https://api.deepseek.com/v1/chat/completions'); curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'Authorization: Bearer ' . $this->apiKey], CURLOPT_POSTFIELDS => json_encode(['model' => $this->model ?: 'deepseek-chat', 'messages' => [['role' => 'user', 'content' => $prompt]], 'max_tokens' => 1024])]); $r = json_decode(curl_exec($ch), true); curl_close($ch); return isset($r['choices'][0]['message']['content']) ? ['success' => true, 'text' => $r['choices'][0]['message']['content']] : ['success' => false, 'error' => $r['error']['message'] ?? 'Error']; } } class InboxChecker { public static function check($acc) { $mailbox = "{" . $acc['imap_host'] . ":" . $acc['imap_port'] . "/imap/ssl/novalidate-cert}"; $result = ['success' => false, 'inbox' => 0, 'spam' => 0, 'recent' => []]; $imap = @imap_open($mailbox . "INBOX", $acc['email'], $acc['password'], 0, 1); if (!$imap) return ['success' => false, 'error' => imap_last_error()]; $info = imap_check($imap); $result['inbox'] = $info->Nmsgs ?? 0; if ($result['inbox'] > 0) { $start = max(1, $result['inbox'] - 10); $emails = imap_fetch_overview($imap, "$start:{$result['inbox']}"); foreach ($emails as $e) $result['recent'][] = ['subject' => imap_utf8($e->subject ?? ''), 'from' => imap_utf8($e->from ?? ''), 'date' => $e->date ?? '']; } imap_close($imap); $imapSpam = @imap_open($mailbox . ($acc['spam_folder'] ?: 'Junk'), $acc['email'], $acc['password'], 0, 1); if ($imapSpam) { $spamInfo = imap_check($imapSpam); $result['spam'] = $spamInfo->Nmsgs ?? 0; imap_close($imapSpam); } $result['success'] = true; return $result; } } class WevadsAPI { private $baseUrl, $cookie; public function __construct() { $pdo = getDB(); $config = $pdo->query("SELECT * FROM admin.wevads_config WHERE is_active = true LIMIT 1")->fetch(PDO::FETCH_ASSOC); if ($config) { $this->baseUrl = $config['api_url']; $this->cookie = $config['auth_cookie']; } } public function request($endpoint, $method = 'GET', $data = null) { $ch = curl_init($this->baseUrl . $endpoint); curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_COOKIE => $this->cookie, CURLOPT_CUSTOMREQUEST => $method, CURLOPT_TIMEOUT => 30]); if ($data) { curl_setopt($ch, CURLOPT_POSTFIELDS, is_array($data) ? http_build_query($data) : $data); } $response = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); return ['code' => $code, 'data' => json_decode($response, true) ?: $response]; } public function getServers() { return $this->request('/api/servers'); } public function getVMTAs() { return $this->request('/api/vmtas'); } public function sendTest($params) { return $this->request('/api/send/test', 'POST', $params); } } if (isset($_GET['action']) || isset($_POST['action'])) { header('Content-Type: application/json'); ensureTables(); $action = $_GET['action'] ?? $_POST['action']; $pdo = getDB(); try { switch ($action) { case 'stats': $stats = [ 'campaigns' => ['total' => $pdo->query("SELECT COUNT(*) FROM admin.campaigns")->fetchColumn(), 'running' => $pdo->query("SELECT COUNT(*) FROM admin.campaigns WHERE status = 'running'")->fetchColumn(), 'completed' => $pdo->query("SELECT COUNT(*) FROM admin.campaigns WHERE status = 'completed'")->fetchColumn()], 'warmup' => ['accounts' => $pdo->query("SELECT COUNT(*) FROM admin.warmup_accounts")->fetchColumn(), 'active' => $pdo->query("SELECT COUNT(*) FROM admin.warmup_accounts WHERE status = 'active'")->fetchColumn(), 'sent_today' => $pdo->query("SELECT COALESCE(SUM(emails_sent_today), 0) FROM admin.warmup_accounts")->fetchColumn()], 'pmta' => ['servers' => $pdo->query("SELECT COUNT(*) FROM admin.pmta_servers")->fetchColumn(), 'queued' => $pdo->query("SELECT COALESCE(SUM(queued_emails), 0) FROM admin.pmta_servers")->fetchColumn()], 'cloud' => ['huawei' => $pdo->query("SELECT COUNT(*) FROM admin.huawei_accounts")->fetchColumn(), 'scaleway' => $pdo->query("SELECT COUNT(*) FROM admin.scaleway_accounts")->fetchColumn()], 'dns' => ['cloudflare' => $pdo->query("SELECT COUNT(*) FROM admin.cloudflare_zones")->fetchColumn(), 'freedns' => $pdo->query("SELECT COUNT(*) FROM admin.freedns_domains")->fetchColumn()], 'alerts' => $pdo->query("SELECT COUNT(*) FROM admin.monitoring_alerts WHERE acknowledged = false")->fetchColumn() ]; echo json_encode(['success' => true, 'stats' => $stats]); break; case 'tg_get': echo json_encode(['success' => true, 'config' => $pdo->query("SELECT bot_token, chat_id FROM admin.telegram_config LIMIT 1")->fetch(PDO::FETCH_ASSOC)]); break; case 'tg_save': $pdo->exec("DELETE FROM admin.telegram_config"); $stmt = $pdo->prepare("INSERT INTO admin.telegram_config (bot_token, chat_id) VALUES (?, ?)"); $stmt->execute([$_POST['bot_token'], $_POST['chat_id']]); echo json_encode(['success' => true]); break; case 'tg_test': $bot = new TelegramBot(); $r = $bot->alert('Test Alert', 'WEVAL SEND Dashboard is working!', 'success'); echo json_encode(['success' => isset($r['ok']) && $r['ok']]); break; case 'tg_send': $bot = new TelegramBot(); $r = $bot->send($_POST['message']); echo json_encode(['success' => isset($r['ok']) && $r['ok']]); break; case 'ai_get': echo json_encode(['success' => true, 'config' => $pdo->query("SELECT provider, model FROM admin.ai_config LIMIT 1")->fetch(PDO::FETCH_ASSOC)]); break; case 'ai_save': $pdo->exec("DELETE FROM admin.ai_config"); $stmt = $pdo->prepare("INSERT INTO admin.ai_config (provider, api_key, model) VALUES (?, ?, ?)"); $stmt->execute([$_POST['provider'], $_POST['api_key'], $_POST['model']]); echo json_encode(['success' => true]); break; case 'ai_generate': $ai = new AIHelper(); echo json_encode($ai->generate($_POST['prompt'])); break; case 'ai_email': $ai = new AIHelper(); $prompt = "Generate email marketing subject line and from name for:\nOffer: {$_POST['offer']}\nSponsor: {$_POST['sponsor']}\n\nFormat:\nSUBJECT: [subject]\nFROM: [from name]"; echo json_encode($ai->generate($prompt)); break; case 'imap_list': echo json_encode(['success' => true, 'checkers' => $pdo->query("SELECT id, name, email, imap_host, last_check, inbox_count, spam_count FROM admin.imap_checkers ORDER BY id")->fetchAll(PDO::FETCH_ASSOC)]); break; case 'imap_add': $stmt = $pdo->prepare("INSERT INTO admin.imap_checkers (name, email, password, imap_host, imap_port, spam_folder) VALUES (?, ?, ?, ?, ?, ?)"); $stmt->execute([$_POST['name'], $_POST['email'], $_POST['password'], $_POST['imap_host'], $_POST['imap_port'] ?? 993, $_POST['spam_folder'] ?? 'Junk']); echo json_encode(['success' => true]); break; case 'imap_check': $stmt = $pdo->prepare("SELECT * FROM admin.imap_checkers WHERE id = ?"); $stmt->execute([$_POST['id']]); $acc = $stmt->fetch(PDO::FETCH_ASSOC); $r = InboxChecker::check($acc); if ($r['success']) $pdo->exec("UPDATE admin.imap_checkers SET inbox_count = {$r['inbox']}, spam_count = {$r['spam']}, last_check = NOW() WHERE id = {$acc['id']}"); echo json_encode($r); break; case 'imap_delete': $pdo->exec("DELETE FROM admin.imap_checkers WHERE id = " . intval($_POST['id'])); echo json_encode(['success' => true]); break; case 'wevads_get': echo json_encode(['success' => true, 'config' => $pdo->query("SELECT api_url FROM admin.wevads_config LIMIT 1")->fetch(PDO::FETCH_ASSOC)]); break; case 'wevads_save': $pdo->exec("DELETE FROM admin.wevads_config"); $stmt = $pdo->prepare("INSERT INTO admin.wevads_config (api_url, username, password) VALUES (?, ?, ?)"); $stmt->execute([$_POST['api_url'], $_POST['username'], $_POST['password']]); echo json_encode(['success' => true]); break; case 'activity': $activity = $pdo->query("SELECT 'campaign' as type, name as title, status, created_at FROM admin.campaigns UNION ALL SELECT 'alert', title, severity, created_at FROM admin.monitoring_alerts ORDER BY created_at DESC LIMIT 15")->fetchAll(PDO::FETCH_ASSOC); echo json_encode(['success' => true, 'activity' => $activity]); break; default: echo json_encode(['success' => false, 'error' => 'Unknown action']); } } catch (Exception $e) { echo json_encode(['success' => false, 'error' => $e->getMessage()]); } exit; } ensureTables(); ?>
| Name | Inbox | Spam | Actions |
|---|