143 lines
15 KiB
HTML
Executable File
143 lines
15 KiB
HTML
Executable File
<?php include_once("/opt/wevads-arsenal/public/api/wevads-metrics.php"); ?>
|
||
<?php
|
||
@$_db=new PDO("pgsql:host=localhost;dbname=adx_system","admin","admin123");$_db->exec("SET search_path TO admin");
|
||
$_total=(int)$_db->query("SELECT COUNT(*) FROM brain_send_configs")->fetchColumn();
|
||
$_tested=(int)$_db->query("SELECT COUNT(*) FROM brain_send_configs WHERE total_sent>0")->fetchColumn();
|
||
$_winners=(int)$_db->query("SELECT COUNT(*) FROM brain_send_configs WHERE inbox_rate>70 AND total_sent>0")->fetchColumn();
|
||
$_methods=$_db->query("SELECT send_method, COUNT(*) as cnt, ROUND(AVG(NULLIF(inbox_rate,0))::numeric,1) as avg_inbox, SUM(total_sent) as total_sent FROM brain_send_configs GROUP BY send_method ORDER BY cnt DESC")->fetchAll(PDO::FETCH_ASSOC);
|
||
$_isps=$_db->query("SELECT isp_target as isp, COUNT(*) as cnt, ROUND(AVG(NULLIF(inbox_rate,0))::numeric,1) as avg_inbox, SUM(total_sent) as total_sent FROM brain_send_configs WHERE isp_target IS NOT NULL AND isp_target!='' GROUP BY isp_target ORDER BY cnt DESC LIMIT 12")->fetchAll(PDO::FETCH_ASSOC);
|
||
$_top=$_db->query("SELECT id, send_method, isp_target, from_domain, inbox_rate, total_sent, total_inbox, status FROM brain_send_configs WHERE total_sent>0 ORDER BY inbox_rate DESC LIMIT 10")->fetchAll(PDO::FETCH_ASSOC);
|
||
$_worst=$_db->query("SELECT id, send_method, isp_target, from_domain, inbox_rate, total_sent, status FROM brain_send_configs WHERE total_sent>0 AND inbox_rate<30 ORDER BY inbox_rate ASC LIMIT 5")->fetchAll(PDO::FETCH_ASSOC);
|
||
$_untested=(int)$_db->query("SELECT COUNT(*) FROM brain_send_configs WHERE status='untested' OR total_sent=0")->fetchColumn();
|
||
$_avgInbox=$_db->query("SELECT ROUND(AVG(NULLIF(inbox_rate,0))::numeric,1) FROM brain_send_configs WHERE total_sent>0")->fetchColumn();
|
||
$_totalSent=(int)$_db->query("SELECT COALESCE(SUM(total_sent),0) FROM brain_send_configs")->fetchColumn();
|
||
?>
|
||
<!DOCTYPE html><html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
||
<title>WEVADS - Dark Slot</title>
|
||
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet">
|
||
<style>
|
||
:root{--bg:#060a14;--s:#0c1220;--s2:#111827;--b:#1e293b;--t:#e2e8f0;--d:#64748b;--cy:#22d3ee;--gn:#34d399;--am:#fbbf24;--rd:#f87171;--pu:#a78bfa;--bl:#60a5fa;--pk:#f472b6}
|
||
*{margin:0;padding:0;box-sizing:border-box}body{background:var(--bg);color:var(--t);font-family:'DM Sans',sans-serif;font-size:12px}
|
||
.mono{font-family:'JetBrains Mono',monospace}
|
||
.hdr{background:var(--s);border-bottom:1px solid var(--b);padding:14px 20px;display:flex;justify-content:space-between;align-items:center}
|
||
.hdr h1{font-size:18px;font-weight:700;margin-left:80px}.hdr h1 span{color:var(--pu)}
|
||
.wrap{padding:16px 20px;max-width:1500px;margin:0 auto}
|
||
.stats{display:grid;grid-template-columns:repeat(6,1fr);gap:10px;margin-bottom:16px}
|
||
.sc{background:var(--s);border:1px solid var(--b);border-radius:10px;padding:14px;text-align:center;cursor:pointer;transition:all .2s}
|
||
.sc:hover{transform:translateY(-2px);box-shadow:0 8px 24px rgba(0,0,0,.3);border-color:var(--pu)}
|
||
.sc .n{font-family:'JetBrains Mono',monospace;font-size:22px;font-weight:700}.sc .l{font-size:9px;text-transform:uppercase;color:var(--d);margin-top:4px}.sc .delta{font-size:9px;margin-top:3px}
|
||
.g2{display:grid;grid-template-columns:1fr 1fr;gap:12px}.cd{background:var(--s);border:1px solid var(--b);border-radius:10px;padding:14px}
|
||
table{width:100%;border-collapse:collapse;font-size:11px}th{text-align:left;color:var(--d);text-transform:uppercase;font-size:9px;padding:6px 8px;border-bottom:1px solid var(--b)}td{padding:6px 8px;border-bottom:1px solid rgba(30,41,59,.3)}
|
||
.badge{font-size:8px;padding:2px 6px;border-radius:3px;font-weight:600}.badge-gn{background:rgba(52,211,153,.15);color:var(--gn)}.badge-rd{background:rgba(248,113,113,.15);color:var(--rd)}.badge-am{background:rgba(251,191,36,.15);color:var(--am)}.badge-cy{background:rgba(34,211,238,.15);color:var(--cy)}.badge-pu{background:rgba(167,139,250,.15);color:var(--pu)}
|
||
.btn{padding:8px 16px;border-radius:6px;border:1px solid var(--b);background:var(--s2);color:var(--t);cursor:pointer;font-size:10px;font-weight:600;transition:all .2s;text-decoration:none}.btn:hover{border-color:var(--pu);transform:translateY(-1px)}
|
||
.tabs{display:flex;gap:2px;margin-bottom:14px;border-bottom:1px solid var(--b)}.tab{padding:8px 16px;cursor:pointer;font-size:10px;font-weight:600;text-transform:uppercase;color:var(--d);border-bottom:2px solid transparent}.tab:hover{color:var(--t)}.tab.active{color:var(--pu);border-color:var(--pu)}
|
||
.panel{display:none}.panel.active{display:block}
|
||
.modal{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.75);z-index:9999;justify-content:center;align-items:center}.modal-box{background:var(--s);border:1px solid var(--b);border-radius:12px;padding:20px;max-width:900px;width:92%;max-height:82vh;overflow-y:auto}
|
||
.bar{height:8px;border-radius:4px;background:var(--s2);overflow:hidden;margin-top:4px}.bar-fill{height:100%;border-radius:4px}
|
||
.slot{background:var(--s2);border:1px solid var(--b);border-radius:10px;padding:12px;margin-bottom:8px;display:flex;align-items:center;gap:12px;transition:.2s;cursor:pointer}
|
||
.slot:hover{border-color:var(--pu);transform:translateX(4px)}
|
||
.slot .rank{font-family:'JetBrains Mono',monospace;font-size:18px;font-weight:700;color:var(--pu);width:32px;text-align:center}
|
||
.slot .info{flex:1}.slot .info .name{font-weight:600;font-size:12px}.slot .info .meta{font-size:10px;color:var(--d)}
|
||
.slot .score{font-family:'JetBrains Mono',monospace;font-size:16px;font-weight:700}
|
||
@media(max-width:900px){.stats{grid-template-columns:repeat(3,1fr)}.g2{grid-template-columns:1fr}}
|
||
</style>
|
||
<link rel="stylesheet" href="wevads-global.css?v1770777318">
|
||
</head><body>
|
||
<div class="hdr"><div><h1>🎰 <span>Dark Slot</span></h1><div style="color:var(--d);font-size:11px;margin-top:4px">Send method optimization — config testing — inbox rate analysis — ISP × method combos</div></div><div style="display:flex;gap:8px;align-items:center"><span class="badge badge-pu">● SLOT ENGINE</span><a href="menu.html" class="btn">Menu</a><a href="operations-overview.html" class="btn">← Overview</a></div></div>
|
||
<div class="wrap">
|
||
<div class="stats">
|
||
<div class="sc" onclick="drill('configs')"><div class="n" style="color:var(--pu)"><?=$_total?></div><div class="l">Total Configs ▼</div><div class="delta"><?=$_tested?> tested</div></div>
|
||
<div class="sc" onclick="drill('winners')"><div class="n" style="color:var(--gn)"><?=$_winners?></div><div class="l">Winners ▼</div><div class="delta" style="color:var(--gn)">inbox >70%</div></div>
|
||
<div class="sc" onclick="drill('inbox')"><div class="n" style="color:var(--cy)"><?=$_avgInbox?>%</div><div class="l">Avg Inbox ▼</div><div class="delta">across tested</div></div>
|
||
<div class="sc" onclick="drill('sent')"><div class="n" style="color:var(--am)"><?=number_format($_totalSent)?></div><div class="l">Total Sent ▼</div><div class="delta">all configs</div></div>
|
||
<div class="sc" onclick="drill('untested')"><div class="n" style="color:var(--rd)"><?=$_untested?></div><div class="l">Untested ▼</div><div class="delta">need testing</div></div>
|
||
<div class="sc" onclick="drill('methods')"><div class="n" style="color:var(--bl)"><?=count($_methods)?></div><div class="l">Methods ▼</div><div class="delta">send methods</div></div>
|
||
</div>
|
||
<div class="tabs">
|
||
<div class="tab active" onclick="showTab('ranking')">🏆 Ranking</div>
|
||
<div class="tab" onclick="showTab('methods')">Methods</div>
|
||
<div class="tab" onclick="showTab('isps')">ISP Perf</div>
|
||
<div class="tab" onclick="showTab('worst')">⚠️ Worst</div>
|
||
</div>
|
||
<!-- RANKING -->
|
||
<div class="panel active" id="tab-ranking">
|
||
<div class="cd">
|
||
<h3 style="font-size:13px;margin-bottom:12px;color:var(--gn)">🏆 Top Performers (by Inbox Rate)</h3>
|
||
<?php foreach($_top as $i=>$c): $col=$c['inbox_rate']>80?'var(--gn)':($c['inbox_rate']>50?'var(--am)':'var(--rd)'); ?>
|
||
<div class="slot" onclick="drill('detail',<?=$c['id']?>)">
|
||
<div class="rank">#<?=$i+1?></div>
|
||
<div class="info"><div class="name"><?=htmlspecialchars($c['send_method'])?> → <?=htmlspecialchars($c['isp_target']??'—')?></div><div class="meta"><?=htmlspecialchars($c['from_domain']??'—')?> · <?=number_format($c['total_sent'])?> sent · <span class="badge badge-<?=$c['status']==='winner'?'gn':($c['status']==='testing'?'am':'cy')?>"><?=strtoupper($c['status']??'?')?></span></div></div>
|
||
<div class="score" style="color:<?=$col?>"><?=$c['inbox_rate']?>%</div>
|
||
</div>
|
||
<?php endforeach; if(empty($_top)):?><div style="text-align:center;padding:30px;color:var(--d)">No tested configs yet</div><?php endif;?>
|
||
</div>
|
||
</div>
|
||
<!-- METHODS -->
|
||
<div class="panel" id="tab-methods">
|
||
<div class="cd">
|
||
<h3 style="font-size:13px;margin-bottom:10px;color:var(--pu)">📡 Send Methods Performance</h3>
|
||
<table><thead><tr><th>Method</th><th>Configs</th><th>Avg Inbox</th><th>Total Sent</th><th>Performance</th></tr></thead><tbody>
|
||
<?php foreach($_methods as $m): $col=($m['avg_inbox']??0)>70?'var(--gn)':(($m['avg_inbox']??0)>40?'var(--am)':'var(--rd)'); $w=min(($m['avg_inbox']??0),100); ?>
|
||
<tr><td style="font-weight:600"><?=htmlspecialchars($m['send_method'])?></td><td class="mono"><?=$m['cnt']?></td><td class="mono" style="color:<?=$col?>"><?=$m['avg_inbox']??0?>%</td><td class="mono"><?=number_format($m['total_sent'])?></td><td><div class="bar" style="width:100px"><div class="bar-fill" style="width:<?=$w?>%;background:<?=$col?>"></div></div></td></tr>
|
||
<?php endforeach; ?>
|
||
</tbody></table>
|
||
</div>
|
||
</div>
|
||
<!-- ISP PERF -->
|
||
<div class="panel" id="tab-isps">
|
||
<div class="cd">
|
||
<h3 style="font-size:13px;margin-bottom:10px;color:var(--cy)">📧 ISP Target Performance</h3>
|
||
<table><thead><tr><th>ISP</th><th>Configs</th><th>Avg Inbox</th><th>Total Sent</th><th>Performance</th></tr></thead><tbody>
|
||
<?php foreach($_isps as $i): $col=($i['avg_inbox']??0)>70?'var(--gn)':(($i['avg_inbox']??0)>40?'var(--am)':'var(--rd)'); $w=min(($i['avg_inbox']??0),100); ?>
|
||
<tr><td style="font-weight:600"><?=htmlspecialchars($i['isp'])?></td><td class="mono"><?=$i['cnt']?></td><td class="mono" style="color:<?=$col?>"><?=$i['avg_inbox']??0?>%</td><td class="mono"><?=number_format($i['total_sent'])?></td><td><div class="bar" style="width:100px"><div class="bar-fill" style="width:<?=$w?>%;background:<?=$col?>"></div></div></td></tr>
|
||
<?php endforeach; ?>
|
||
</tbody></table>
|
||
</div>
|
||
</div>
|
||
<!-- WORST -->
|
||
<div class="panel" id="tab-worst">
|
||
<div class="cd">
|
||
<h3 style="font-size:13px;margin-bottom:10px;color:var(--rd)">⚠️ Worst Performers (inbox <30%)</h3>
|
||
<table><thead><tr><th>ID</th><th>Method</th><th>ISP</th><th>Domain</th><th>Inbox</th><th>Sent</th><th>Status</th></tr></thead><tbody>
|
||
<?php foreach($_worst as $w): ?>
|
||
<tr><td>#<?=$w['id']?></td><td><?=htmlspecialchars($w['send_method'])?></td><td><?=htmlspecialchars($w['isp_target']??'—')?></td><td style="font-size:10px"><?=htmlspecialchars($w['from_domain']??'—')?></td><td class="mono" style="color:var(--rd)"><?=$w['inbox_rate']?>%</td><td class="mono"><?=number_format($w['total_sent'])?></td><td><span class="badge badge-rd"><?=strtoupper($w['status']??'?')?></span></td></tr>
|
||
<?php endforeach; if(empty($_worst)):?><tr><td colspan="7" style="text-align:center;color:var(--d);padding:20px">No bad performers</td></tr><?php endif;?>
|
||
</tbody></table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="modal" id="drillModal" onclick="if(event.target===this)this.style.display='none'"><div class="modal-box"><div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:14px"><h3 id="drillTitle" style="font-size:14px;color:var(--pu)"></h3><button onclick="document.getElementById('drillModal').style.display='none'" style="background:none;border:none;color:var(--rd);font-size:18px;cursor:pointer">✕</button></div><div id="drillContent" style="font-size:11px"></div></div></div>
|
||
<script>
|
||
function showTab(id){document.querySelectorAll('.tab').forEach(function(t){t.classList.remove('active')});document.querySelectorAll('.panel').forEach(function(p){p.classList.remove('active')});document.getElementById('tab-'+id).classList.add('active');event.target.classList.add('active')}
|
||
async function drill(type){
|
||
var m=document.getElementById('drillModal'),tt=document.getElementById('drillTitle'),ct=document.getElementById('drillContent');
|
||
m.style.display='flex';ct.innerHTML='<div style="text-align:center;padding:40px;color:var(--d)">Loading...</div>';
|
||
try{var html='';var r,d;
|
||
r=await fetch('/api/harvest-manager.php?action=stats');d=(await r.json()).data||{};
|
||
var total=d.total||<?=$_total?>;
|
||
if(type==='configs'||type==='winners'||type==='inbox'||type==='sent'||type==='untested'||type==='methods'){
|
||
var titles={configs:'🎰 All Configs',winners:'🏆 Winners (>70%)',inbox:'📊 Inbox Analysis',sent:'📤 Send Volume',untested:'❓ Untested Configs',methods:'📡 Methods Breakdown'};
|
||
tt.textContent=titles[type];
|
||
html+='<div style="display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:14px">';
|
||
html+='<div class="cd" style="text-align:center"><div style="font-size:20px;font-weight:700;color:var(--pu)"><?=$_total?></div><div class="l">Total Configs</div></div>';
|
||
html+='<div class="cd" style="text-align:center"><div style="font-size:20px;font-weight:700;color:var(--gn)"><?=$_winners?></div><div class="l">Winners</div></div>';
|
||
html+='<div class="cd" style="text-align:center"><div style="font-size:20px;font-weight:700;color:var(--cy)"><?=$_avgInbox?>%</div><div class="l">Avg Inbox</div></div></div>';
|
||
html+='<h4 style="margin:10px 0 8px;color:var(--d)">By Send Method</h4><table><thead><tr><th>Method</th><th>Configs</th><th>Avg Inbox</th><th>Total Sent</th></tr></thead><tbody>';
|
||
<?php foreach($_methods as $m):?>html+='<tr><td style="font-weight:600"><?=addslashes($m['send_method'])?></td><td class="mono"><?=$m['cnt']?></td><td class="mono"><?=$m['avg_inbox']??0?>%</td><td class="mono"><?=number_format($m['total_sent'])?></td></tr>';<?php endforeach;?>
|
||
html+='</tbody></table>';
|
||
html+='<h4 style="margin:12px 0 8px;color:var(--d)">By ISP Target</h4><table><thead><tr><th>ISP</th><th>Configs</th><th>Avg Inbox</th></tr></thead><tbody>';
|
||
<?php foreach($_isps as $i):?>html+='<tr><td style="font-weight:600"><?=addslashes($i['isp'])?></td><td class="mono"><?=$i['cnt']?></td><td class="mono"><?=$i['avg_inbox']??0?>%</td></tr>';<?php endforeach;?>
|
||
html+='</tbody></table>';
|
||
} else if(type==='detail'){
|
||
var cid=arguments[1]||0;
|
||
tt.textContent='⚙️ Config #'+cid+' Detail';
|
||
html+='<div class="cd" style="color:var(--d)">Config ID: <strong>'+cid+'</strong> — detailed performance metrics would be loaded here from brain_send_configs API.</div>';
|
||
}
|
||
ct.innerHTML=html;
|
||
}catch(e){ct.innerHTML='<div style="color:var(--rd)">'+e.message+'</div>';}
|
||
}
|
||
</script>
|
||
<script src="arsenal-common.js?v1770778169"></script>
|
||
<?php include("/opt/wevads-arsenal/public/universal-drill.html"); ?>
|
||
</body></html>
|