Update static/index.html

#1
Files changed (1) hide show
  1. static/index.html +58 -9
static/index.html CHANGED
@@ -28,6 +28,18 @@ body{background:#0d0d0d;font-family:"Courier New",monospace;color:#c8a84b}
28
  .model-dot{width:6px;height:6px;background:#44aa99;border-radius:50%;flex-shrink:0}
29
  .model-dot.glm{background:#c8a84b}
30
  .model-name{font-size:11px;color:#c8a84b}
 
 
 
 
 
 
 
 
 
 
 
 
31
  .tank-section{background:#1a1200;border:1px solid #3a2a00;padding:1.5rem;margin-bottom:2rem}
32
  .tank-title{font-size:14px;color:#cc0000;letter-spacing:3px;margin-bottom:1rem;font-weight:bold}
33
  .tank-row{display:flex;gap:1rem;margin-bottom:8px;align-items:center}
@@ -57,7 +69,7 @@ body{background:#0d0d0d;font-family:"Courier New",monospace;color:#c8a84b}
57
  <div class="status-row">
58
  <div class="status-card"><div class="val online">&#9679; ONLINE</div><div class="lbl">PROXY STATUS</div></div>
59
  <div class="status-card"><div class="val">24</div><div class="lbl">MODELOS ACTIVOS</div></div>
60
- <div class="status-card"><div class="val">FREE</div><div class="lbl">API KEY</div></div>
61
  </div>
62
  <div class="section-label">// PUNTO DE ACCESO</div>
63
  <div class="url-box">
@@ -76,6 +88,19 @@ body{background:#0d0d0d;font-family:"Courier New",monospace;color:#c8a84b}
76
  <div class="model-item"><div class="model-dot glm"></div><div class="model-name">glm-5</div></div>
77
  <div class="model-item"><div class="model-dot glm"></div><div class="model-name">glm-5-thinking</div></div>
78
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  <div class="section-label">// RAMA SOVIETICA — GUERRA FRIA</div>
80
  <div class="tank-section">
81
  <div class="tank-title">&#9733; BLINDADOS SOVIETICOS 1960-1985</div>
@@ -89,25 +114,49 @@ body{background:#0d0d0d;font-family:"Courier New",monospace;color:#c8a84b}
89
  </div>
90
  <div class="footer"><span class="classified">&#9733; CLASIFICADO &#9733;</span> &mdash; ROW-PROXY v1.0 &mdash; CCCP AI GATEWAY &mdash; <span class="classified">&#9733; CLASIFICADO &#9733;</span></div>
91
  <script>
 
 
92
  function loadStats() {
93
  fetch('/stats')
94
- .then(r => r.json())
95
- .then(data => {
 
 
 
96
  var keys = Object.values(data.keys || {});
97
- keys.sort(function(a,b){ return b.requests - a.requests; });
 
 
 
 
 
98
  var grid = document.getElementById('users-grid');
 
 
99
  if (keys.length === 0) {
100
  grid.innerHTML = '<div class="commander-card"><div class="cmd-name">Sin usuarios aun</div><div class="cmd-trait">SE EL PRIMERO EN USAR LA PROXY</div></div>';
101
  return;
102
  }
103
- grid.innerHTML = keys.slice(0,4).map(function(k){
104
- return '<div class="commander-card"><div class="cmd-name">' + k.name + '</div><div class="cmd-trait">SOLICITUDES: ' + k.requests + ' // TOKENS: ' + k.tokens + '</div></div>';
 
 
 
 
 
 
 
 
 
 
 
105
  }).join('');
106
- var freeEl = document.getElementById('free-count');
107
- if (freeEl) freeEl.textContent = (data.free_reqs || 0) + '/340';
108
  })
109
- .catch(function(){ });
 
 
110
  }
 
111
  loadStats();
112
  setInterval(loadStats, 30000);
113
  </script>
 
28
  .model-dot{width:6px;height:6px;background:#44aa99;border-radius:50%;flex-shrink:0}
29
  .model-dot.glm{background:#c8a84b}
30
  .model-name{font-size:11px;color:#c8a84b}
31
+
32
+ /* TOP USUARIOS */
33
+ .top-section{background:#1a1200;border:1px solid #3a2a00;padding:1.5rem;margin-bottom:2rem}
34
+ .top-title{font-size:14px;color:#c8a84b;letter-spacing:3px;margin-bottom:1rem;font-weight:bold}
35
+ .users-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px}
36
+ .commander-card{background:#0d0d0d;border:1px solid #2a1e00;border-left:3px solid #cc0000;padding:10px 14px}
37
+ .cmd-rank{font-size:10px;color:#cc0000;letter-spacing:2px;margin-bottom:4px}
38
+ .cmd-name{font-size:13px;color:#e8c86b;font-weight:bold;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
39
+ .cmd-trait{font-size:10px;color:#7a6228;letter-spacing:1px}
40
+ .cmd-bar-wrap{margin-top:6px;background:#0a0a0a;height:4px;border:1px solid #2a1e00}
41
+ .cmd-bar{height:100%;background:#cc0000;transition:width 0.5s}
42
+
43
  .tank-section{background:#1a1200;border:1px solid #3a2a00;padding:1.5rem;margin-bottom:2rem}
44
  .tank-title{font-size:14px;color:#cc0000;letter-spacing:3px;margin-bottom:1rem;font-weight:bold}
45
  .tank-row{display:flex;gap:1rem;margin-bottom:8px;align-items:center}
 
69
  <div class="status-row">
70
  <div class="status-card"><div class="val online">&#9679; ONLINE</div><div class="lbl">PROXY STATUS</div></div>
71
  <div class="status-card"><div class="val">24</div><div class="lbl">MODELOS ACTIVOS</div></div>
72
+ <div class="status-card"><div class="val"><span id="free-count">0/340</span></div><div class="lbl">FREE REQUESTS</div></div>
73
  </div>
74
  <div class="section-label">// PUNTO DE ACCESO</div>
75
  <div class="url-box">
 
88
  <div class="model-item"><div class="model-dot glm"></div><div class="model-name">glm-5</div></div>
89
  <div class="model-item"><div class="model-dot glm"></div><div class="model-name">glm-5-thinking</div></div>
90
  </div>
91
+
92
+ <!-- SECCION TOP USUARIOS — ANTES FALTABA COMPLETAMENTE -->
93
+ <div class="section-label">// TOP COMANDANTES — RANKING DE CONSUMO</div>
94
+ <div class="top-section">
95
+ <div class="top-title">&#9733; OPERADORES MAS ACTIVOS</div>
96
+ <div class="users-grid" id="users-grid">
97
+ <div class="commander-card">
98
+ <div class="cmd-name" style="color:#7a6228">Cargando datos...</div>
99
+ <div class="cmd-trait">CONSULTANDO SERVIDOR</div>
100
+ </div>
101
+ </div>
102
+ </div>
103
+
104
  <div class="section-label">// RAMA SOVIETICA — GUERRA FRIA</div>
105
  <div class="tank-section">
106
  <div class="tank-title">&#9733; BLINDADOS SOVIETICOS 1960-1985</div>
 
114
  </div>
115
  <div class="footer"><span class="classified">&#9733; CLASIFICADO &#9733;</span> &mdash; ROW-PROXY v1.0 &mdash; CCCP AI GATEWAY &mdash; <span class="classified">&#9733; CLASIFICADO &#9733;</span></div>
116
  <script>
117
+ var RANKS = ['&#9733;&#9733;&#9733;','&#9733;&#9733;','&#9733;','&#8901;'];
118
+
119
  function loadStats() {
120
  fetch('/stats')
121
+ .then(function(r){ return r.json(); })
122
+ .then(function(data) {
123
+ var freeEl = document.getElementById('free-count');
124
+ if (freeEl) freeEl.textContent = (data.free_reqs || 0) + '/340';
125
+
126
  var keys = Object.values(data.keys || {});
127
+ keys.sort(function(a, b){
128
+ var tokDiff = (b.tokens || 0) - (a.tokens || 0);
129
+ if (tokDiff !== 0) return tokDiff;
130
+ return (b.requests || 0) - (a.requests || 0);
131
+ });
132
+
133
  var grid = document.getElementById('users-grid');
134
+ if (!grid) return;
135
+
136
  if (keys.length === 0) {
137
  grid.innerHTML = '<div class="commander-card"><div class="cmd-name">Sin usuarios aun</div><div class="cmd-trait">SE EL PRIMERO EN USAR LA PROXY</div></div>';
138
  return;
139
  }
140
+
141
+ var maxTokens = keys[0].tokens || keys[0].requests || 1;
142
+
143
+ grid.innerHTML = keys.slice(0, 4).map(function(k, i){
144
+ var pct = Math.round(((k.tokens || k.requests || 0) / maxTokens) * 100);
145
+ var tokens = (k.tokens || 0).toLocaleString();
146
+ var reqs = (k.requests || 0);
147
+ return '<div class="commander-card">'
148
+ + '<div class="cmd-rank">' + (RANKS[i] || '&#8901;') + ' RANGO ' + (i+1) + '</div>'
149
+ + '<div class="cmd-name">' + (k.name || k.key || 'Agente') + '</div>'
150
+ + '<div class="cmd-trait">REQS: ' + reqs + ' // TOKENS: ' + tokens + '</div>'
151
+ + '<div class="cmd-bar-wrap"><div class="cmd-bar" style="width:' + pct + '%"></div></div>'
152
+ + '</div>';
153
  }).join('');
 
 
154
  })
155
+ .catch(function(err){
156
+ console.warn('Stats no disponibles:', err);
157
+ });
158
  }
159
+
160
  loadStats();
161
  setInterval(loadStats, 30000);
162
  </script>