'token'])); $rf = '/tmp/wevads_send_rate_' . date('YmdH'); $rate = file_exists($rf) ? (int)file_get_contents($rf) : 0; $MX = 100; try { $db = new PDO('pgsql:host=10.1.0.3;port=5432;dbname=adx_system','admin',weval_secret('WEVAL_PG_ADMIN_PASS'),[PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_TIMEOUT=>5]); $db->exec("SET search_path TO admin"); } catch(Exception $e) { die(json_encode(['error'=>$e->getMessage()])); } function v2e_send($to, $subject, $html, $method, $from_name, $from_email='') { $ch = curl_init('http://127.0.0.1/api/wevads-v2-engine.php?action=send_test&token=WEVADS2026'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query(['to'=>$to,'subject'=>$subject,'html'=>$html,'method'=>$method,'from_name'=>$from_name,'from'=>$from_email]), CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10, ]); $r = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if (!$r) return ['status'=>'error','error'=>'V2E unreachable']; $j = json_decode($r, true); return $j ?: ['status'=>'error','error'=>'Invalid V2E response']; } switch($action) { case 'status': $gs=(int)$db->query("SELECT COUNT(*) FROM graph_accounts WHERE can_send=true")->fetchColumn(); $st=(int)$db->query("SELECT COUNT(*) FROM brain_seeds")->fetchColumn(); $ls=$db->query("SELECT MAX(created_at) FROM graph_send_log")->fetchColumn(); $ts=(int)$db->query("SELECT COUNT(*) FROM graph_send_log")->fetchColumn(); $td=(int)$db->query("SELECT COUNT(*) FROM graph_send_log WHERE created_at::date=CURRENT_DATE")->fetchColumn(); $cp=(int)$db->query("SELECT COUNT(*) FROM campaigns WHERE status='paused'")->fetchColumn(); $ca=(int)$db->query("SELECT COUNT(*) FROM campaigns WHERE status='active'")->fetchColumn(); $sq=(int)$db->query("SELECT COUNT(*) FROM send_queue")->fetchColumn(); echo json_encode(['ok'=>1,'controller'=>'v1.0','auto_mode'=>file_exists('/tmp/wevads_auto_mode'),'safety'=>['rate_this_hour'=>$rate,'max_per_hour'=>$MX,'dangerous_crons_disabled'=>true],'graph'=>['senders_available'=>$gs,'seeds_total'=>$st,'total_sent_alltime'=>$ts,'sent_today'=>$td,'last_send'=>$ls],'campaigns'=>['active'=>$ca,'paused'=>$cp,'queue'=>$sq],'pmta'=>true]); break; case 'seed_test': if($rate>=$MX)die(json_encode(['error'=>"Rate: $rate/$MX"])); $to=$_POST['to']??$_GET['to']??''; $su=$_POST['subject']??$_GET['subject']??'Test '.date('H:i'); $ht=$_POST['html']??$_GET['html']??'
Test
'; $fn=$_POST['from_name']??$_GET['from_name']??'WEVAL'; $me=$_POST['method']??$_GET['method']??'PMTA_Direct'; $li=min((int)($_POST['limit']??$_GET['limit']??1),10); if(!$to)die(json_encode(['error'=>'to required'])); $rcpts=array_slice(array_map('trim',explode(',',$to)),0,$li); $res=[]; foreach($rcpts as $r) { $sr = v2e_send($r, $su, $ht, $me, $fn, $fe); $ok = !empty($sr['sent']) || !empty($sr['ok']); $res[] = ['to'=>$r,'method'=>$me,'status'=>$ok?'sent':'error','tracking_id'=>$sr['tracking_id']??'','response'=>$sr['detail']['response']??($sr['error']??'')]; if($ok) file_put_contents($rf, ++$rate); } echo json_encode(['ok'=>1,'method'=>$me,'results'=>$res,'rate'=>"$rate/$MX"]); break; case 'seed_check': $rc=[];foreach($db->query("SELECT sender_email,recipient_email,recipient_isp,subject,status,created_at FROM graph_send_log ORDER BY created_at DESC LIMIT 10") as $r)$rc[]=$r; echo json_encode(['ok'=>1,'recent'=>$rc]);break; case 'campaign_pause': $id=(int)($_POST['campaign_id']??$_GET['campaign_id']??0); if($id)$db->prepare("UPDATE campaigns SET status='paused' WHERE id=?")->execute([$id]); else $db->exec("UPDATE campaigns SET status='paused' WHERE status IN('sending','active')"); echo json_encode(['ok'=>1,'paused'=>true]);break; case 'campaign_resume': $id=(int)($_POST['campaign_id']??$_GET['campaign_id']??0); if(!$id)die(json_encode(['error'=>'id'])); $db->prepare("UPDATE campaigns SET status='active' WHERE id=?")->execute([$id]); echo json_encode(['ok'=>1,'resumed'=>$id]);break; case 'campaigns_list': $c=[];foreach($db->query("SELECT id,name,status,created_at FROM campaigns ORDER BY id DESC LIMIT 30") as $r)$c[]=$r; echo json_encode(['ok'=>1,'campaigns'=>$c]);break; case 'auto_toggle': $f='/tmp/wevads_auto_mode'; if(file_exists($f)){unlink($f);echo json_encode(['ok'=>1,'auto_mode'=>false]);} else{file_put_contents($f,date('c'));echo json_encode(['ok'=>1,'auto_mode'=>true]);} break; default: echo json_encode(['actions'=>['status','seed_test','seed_check','campaign_pause','campaign_resume','campaigns_list','auto_toggle']]); }