Moge-Row commited on
Commit
35597fa
Β·
1 Parent(s): 66bbf83

restore full html soviet theme IS-2

Browse files
Files changed (1) hide show
  1. internal/handler/index.html +163 -85
internal/handler/index.html CHANGED
@@ -1,95 +1,173 @@
1
  <!DOCTYPE html>
2
- <html lang='es'>
3
  <head>
4
- <meta charset='UTF-8'>
5
- <title>ROW-PROXY // FRENTE ORIENTAL</title>
6
- <style>
7
- body { background: #0d0d0c; color: #d4d4d4; font-family: 'Courier New', monospace; padding: 20px; line-height: 1.2; }
8
- .monitor { max-width: 1000px; margin: auto; }
9
- .section-header { color: #7a6228; font-size: 12px; letter-spacing: 4px; margin: 20px 0 10px 0; border-bottom: 1px solid #2a2a1f; padding-bottom: 5px; }
10
- .box { background: rgba(26, 18, 0, 0.4); border: 1px solid #3a2a00; padding: 20px; margin-bottom: 20px; position: relative; }
11
- h2 { color: #ff3333; font-size: 14px; letter-spacing: 2px; margin-bottom: 15px; font-weight: bold; }
12
- h2::before { content: 'β˜… '; }
13
- .ranking-row { display: flex; align-items: center; gap: 15px; margin-bottom: 10px; }
14
- .name { color: #daa520; width: 120px; font-size: 13px; font-weight: bold; flex-shrink: 0; }
15
- .bar-container { flex-grow: 1; background: #080808; height: 14px; border: 1px solid #222; }
16
- .bar { background: #cc0000; height: 100%; transition: width 0.8s ease-out; }
17
- .tokens { color: #7a6228; width: 100px; text-align: right; font-size: 11px; }
18
- .focus-tree { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 15px; }
19
- .focus-node { border: 1px solid #ff3333; color: #ff3333; padding: 5px 10px; font-size: 10px; text-transform: uppercase; background: rgba(255,0,0,0.05); }
20
- .quote { border-left: 3px solid #ff3333; background: rgba(255, 0, 0, 0.03); padding: 15px; margin-top: 20px; font-style: italic; color: #888; }
21
- .url-display { color: #e8c86b; font-size: 14px; border-left: 3px solid #cc0000; padding-left: 15px; }
22
- </style>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
  </head>
24
  <body>
25
- <div class='monitor'>
26
- <div class='section-header'>// HOI4 - NO STEP BACK - FRENTE ORIENTAL</div>
27
- <div class='box'>
28
- <h2>TOP USUARIOS (COMANDANTES)</h2>
29
- <div id='ranking-frente'>
30
- <div style='color:#7a6228; text-align:center; padding:10px;'>CONECTANDO AL SERVIDOR CENTRAL...</div>
31
- </div>
32
- </div>
33
- <div class='box'>
34
- <h2>ARBOL DE ENFOQUE SOVIETICO</h2>
35
- <div class='focus-tree'>
36
- <div class='focus-node'>INDUSTRIA DE GUERRA</div>
37
- <div class='focus-node'>COLLECTIVIZACION</div>
38
- <div class='focus-node'>PURGA MILITAR</div>
39
- <div class='focus-node'>LEND-LEASE</div>
40
- <div class='focus-node'>PACTO RIBBENTROP</div>
41
- <div class='focus-node'>DEFENSA EN PROFUNDIDAD</div>
42
- <div class='focus-node'>FRENTE POPULAR</div>
43
- </div>
44
- </div>
45
- <div class='quote'>
46
- "La victoria es para aquellos que no retroceden. Ni un paso atras."<br>
47
- β€” Orden No. 227, Stalin β€” 1942 β€” NO STEP BACK
48
- </div>
49
- <div class='section-header'>// PUNTO DE ACCESO</div>
50
- <div class='url-display'>BASE URL: https://moge-row-row-proxy.hf.space/v1</div>
 
 
 
51
  </div>
52
- <script>
53
- async function updateStats() {
54
- try {
55
- const r = await fetch(window.location.origin + '/stats');
56
- const data = await r.json();
57
- const container = document.getElementById('ranking-frente');
58
- const entries = Object.entries(data.keys || {}).map(([name, info]) => ({
59
- name: name,
60
- tokens: info.tokens || 0
61
- })).sort((a, b) => b.tokens - a.tokens);
62
- if (entries.length === 0) return;
63
- const maxTokens = Math.max(...entries.map(e => e.tokens), 5000);
64
- container.innerHTML = entries.map(u => `
65
- <div class='ranking-row'>
66
- <div class='name'>${u.name.toUpperCase()}</div>
67
- <div class='bar-container'><div class='bar' style='width:${Math.min((u.tokens/maxTokens)*100, 100)}%'></div></div>
68
- <div class='tokens'>${u.tokens.toLocaleString()} TKNS</div>
69
- </div>`).join('');
70
- } catch(e) { console.error(e); }
71
- }
72
- setInterval(updateStats, 5000); updateStats();
73
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
  <script>
 
 
 
 
 
 
 
75
  function loadStats() {
76
- fetch('/stats')
77
- .then(r => r.json())
78
- .then(data => {
79
- var keys = Object.values(data.keys || {});
80
- keys.sort(function(a,b){ return b.requests - a.requests; });
81
- var grid = document.getElementById('users-grid');
82
- if (keys.length === 0) {
83
- 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>';
84
- return;
85
- }
86
- grid.innerHTML = keys.slice(0,4).map(function(k){
87
- return '<div class="commander-card"><div class="cmd-name">' + k.name + '</div><div class="cmd-trait">SOLICITUDES: ' + k.requests + ' // TOKENS: ' + k.tokens + '</div></div>';
88
- }).join('');
89
- var freeEl = document.getElementById('free-count');
90
- if (freeEl) freeEl.textContent = (data.free_reqs || 0) + '/340';
91
- })
92
- .catch(function(){ });
93
  }
94
  loadStats();
95
  setInterval(loadStats, 30000);
 
1
  <!DOCTYPE html>
2
+ <html lang="es">
3
  <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>ROW-PROXY // CCCP</title>
7
+ <style>
8
+ *{box-sizing:border-box;margin:0;padding:0}
9
+ body{background:#0d0d0d;font-family:"Courier New",monospace;color:#c8a84b}
10
+ .header{background:#1a1200;border-bottom:2px solid #c8a84b;padding:1.5rem 2rem;display:flex;align-items:center;gap:1rem}
11
+ .star{color:#cc0000;font-size:28px}
12
+ .header-title{font-size:22px;font-weight:bold;letter-spacing:4px;color:#c8a84b}
13
+ .header-sub{font-size:11px;letter-spacing:3px;color:#7a6228;margin-top:2px}
14
+ .red-bar{height:4px;background:#cc0000}
15
+ .content{padding:2rem;max-width:900px;margin:0 auto}
16
+ .section-label{font-size:10px;letter-spacing:4px;color:#7a6228;border-bottom:1px solid #3a2a00;padding-bottom:6px;margin-bottom:1rem;margin-top:1.5rem}
17
+ .status-row{display:flex;gap:1rem;margin-bottom:1rem}
18
+ .status-card{flex:1;background:#1a1200;border:1px solid #3a2a00;border-left:3px solid #c8a84b;padding:1rem}
19
+ .status-card .val{font-size:18px;color:#c8a84b;font-weight:bold;margin-bottom:2px}
20
+ .status-card .lbl{font-size:10px;color:#7a6228;letter-spacing:2px}
21
+ .online{color:#44aa99}
22
+ .url-box{background:#111;border:1px solid #3a2a00;border-left:3px solid #cc0000;padding:1rem 1.25rem;margin-bottom:1rem}
23
+ .url-label{font-size:10px;color:#7a6228;letter-spacing:3px;margin-bottom:6px}
24
+ .url-val{font-size:13px;color:#e8c86b;word-break:break-all}
25
+ .key-row{display:flex;align-items:center;gap:8px;margin-top:6px}
26
+ .key-val{font-size:12px;color:#c8a84b;font-family:monospace}
27
+ .reveal-btn{background:#2a1e00;border:1px solid #c8a84b;color:#c8a84b;font-size:10px;padding:3px 10px;cursor:pointer;letter-spacing:2px;font-family:"Courier New"}
28
+ .reveal-btn:hover{background:#3a2a00}
29
+ .models-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:1rem}
30
+ .model-item{background:#1a1200;border:1px solid #2a1e00;padding:8px 12px;display:flex;align-items:center;gap:8px}
31
+ .model-dot{width:6px;height:6px;background:#44aa99;border-radius:50%;flex-shrink:0}
32
+ .model-dot.glm{background:#c8a84b}
33
+ .model-name{font-size:11px;color:#c8a84b}
34
+ .tank-section{background:#1a1200;border:1px solid #3a2a00;padding:1.5rem;margin-bottom:1rem}
35
+ .tank-title{font-size:13px;color:#cc0000;letter-spacing:3px;margin-bottom:1rem;font-weight:bold}
36
+ .tank-row{display:flex;gap:1rem;margin-bottom:8px;align-items:center}
37
+ .tank-name{font-size:12px;color:#e8c86b;width:100px;flex-shrink:0}
38
+ .tank-bar-wrap{flex:1;background:#0d0d0d;height:14px}
39
+ .tank-bar{height:100%;background:#cc0000}
40
+ .tank-era{font-size:10px;color:#7a6228;width:100px;text-align:right;flex-shrink:0}
41
+ .soviet-section{background:#1a1200;border:1px solid #3a2a00;padding:1.5rem;margin-bottom:1rem}
42
+ .blueprint{color:#cc0000;font-size:10px;line-height:1.4;margin:0.5rem 0;font-family:"Courier New"}
43
+ .soviet-pills{display:flex;flex-wrap:wrap;gap:6px;margin-top:1rem}
44
+ .soviet-pill{background:#2a1000;border:1px solid #cc0000;color:#cc0000;font-size:9px;padding:3px 8px;letter-spacing:1px}
45
+ .commander-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:1rem}
46
+ .commander-card{background:#0d0d0d;border:1px solid #2a1e00;padding:8px 12px}
47
+ .cmd-name{font-size:12px;color:#e8c86b;font-weight:bold}
48
+ .cmd-trait{font-size:10px;color:#7a6228;margin-top:2px;letter-spacing:1px}
49
+ .quote-box{background:#0d0d0d;border-left:3px solid #cc0000;padding:0.75rem 1rem;margin-top:1rem;font-size:11px;color:#7a6228;font-style:italic}
50
+ .footer{border-top:1px solid #3a2a00;padding:1rem 2rem;text-align:center;font-size:10px;color:#4a3a10;letter-spacing:3px;margin-top:1rem}
51
+ .classified{color:#cc0000}
52
+ </style>
53
  </head>
54
  <body>
55
+ <div class="header">
56
+ <div class="star">&#9733;</div>
57
+ <div>
58
+ <div class="header-title">ROW-PROXY // CCCP</div>
59
+ <div class="header-sub">&#9733; SOVIET ARMORED DIVISION β€” AI GATEWAY β€” НИ ШАГУ НАЗАД β€” 1941-1985 &#9733;</div>
60
+ </div>
61
+ <div style="margin-left:auto;text-align:right">
62
+ <div style="font-size:10px;color:#44aa99;letter-spacing:2px">&#9679; SISTEMA ACTIVO</div>
63
+ <div style="font-size:10px;color:#7a6228;margin-top:2px">HF DEPLOY // GO v1.23</div>
64
+ </div>
65
+ </div>
66
+ <div class="red-bar"></div>
67
+ <div class="content">
68
+
69
+ <div class="section-label">// ESTADO DEL SISTEMA</div>
70
+ <div class="status-row">
71
+ <div class="status-card"><div class="val online">&#9679; ONLINE</div><div class="lbl">PROXY STATUS</div></div>
72
+ <div class="status-card"><div class="val">24</div><div class="lbl">MODELOS ACTIVOS</div></div>
73
+ <div class="status-card"><div class="val">GLM-4.7</div><div class="lbl">MOTOR PRINCIPAL</div></div>
74
+ </div>
75
+
76
+ <div class="section-label">// PUNTO DE ACCESO β€” CLASIFICADO</div>
77
+ <div class="url-box">
78
+ <div class="url-label">BASE URL β€” PRODUCCION</div>
79
+ <div class="url-val">https://moge-row-row-proxy.hf.space/v1</div>
80
+ <div class="key-row">
81
+ <span class="key-val">API KEY: </span>
82
+ <span class="key-val" id="keyval">&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;</span>
83
+ <button class="reveal-btn" onclick="toggleKey()">REVELAR</button>
84
  </div>
85
+ </div>
86
+
87
+ <div class="section-label">// MODELOS DISPONIBLES</div>
88
+ <div class="models-grid">
89
+ <div class="model-item"><div class="model-dot"></div><div class="model-name">claude-sonnet-4-6</div></div>
90
+ <div class="model-item"><div class="model-dot"></div><div class="model-name">claude-haiku-4-5</div></div>
91
+ <div class="model-item"><div class="model-dot"></div><div class="model-name">claude-opus-4-6</div></div>
92
+ <div class="model-item"><div class="model-dot"></div><div class="model-name">claude-3-5-sonnet</div></div>
93
+ <div class="model-item"><div class="model-dot glm"></div><div class="model-name">glm-4.7-thinking</div></div>
94
+ <div class="model-item"><div class="model-dot glm"></div><div class="model-name">glm-5</div></div>
95
+ <div class="model-item"><div class="model-dot glm"></div><div class="model-name">glm-5-thinking</div></div>
96
+ <div class="model-item"><div class="model-dot glm"></div><div class="model-name">glm-4.5-air</div></div>
97
+ </div>
98
+
99
+ <div class="section-label">// MODELOS MAS USADOS</div>
100
+ <div class="tank-section">
101
+ <div class="tank-title">&#9733; USO DE MODELOS EN TIEMPO REAL</div>
102
+ <div id="model-stats">
103
+ <div class="tank-row"><div class="tank-name">claude-sonnet</div><div class="tank-bar-wrap"><div class="tank-bar" style="width:0%" id="bar-claude"></div></div><div class="tank-era" id="tok-claude">0 tokens</div></div>
104
+ <div class="tank-row"><div class="tank-name">glm-4.7</div><div class="tank-bar-wrap"><div class="tank-bar" style="width:0%" id="bar-glm47"></div></div><div class="tank-era" id="tok-glm47">0 tokens</div></div>
105
+ <div class="tank-row"><div class="tank-name">glm-5</div><div class="tank-bar-wrap"><div class="tank-bar" style="width:0%" id="bar-glm5"></div></div><div class="tank-era" id="tok-glm5">0 tokens</div></div>
106
+ </div>
107
+ </div>
108
+
109
+ <div class="section-label">&#9733; UNION SOVIETICA β€” FRENTE ORIENTAL</div>
110
+ <div class="soviet-section">
111
+ <div class="tank-title">&#9733; ESQUEMA TECNICO β€” IS-2 STALIN</div>
112
+ <pre class="blueprint">
113
+ ___________
114
+ | IS-2 &#9733; |
115
+ _____|___________|_____
116
+ | [==] STALIN [==] |
117
+ |_______________________|
118
+ || O O ||
119
+ ||_______________||
120
+ / 122mm D-25T /________________________ | BLINDAJE: 120mm FRENTE |
121
+ | MOTOR: V-2-IS 520HP |
122
+ | VELOCIDAD: 37 km/h |
123
+ | TRIPULACION: 4 hombres |
124
+ |_________________________|
125
+ </pre>
126
+ <div class="soviet-pills">
127
+ <div class="soviet-pill">&#9733; ACERO SOVIETICO</div>
128
+ <div class="soviet-pill">&#9733; 122MM D-25T</div>
129
+ <div class="soviet-pill">&#9733; BLINDAJE 120MM</div>
130
+ <div class="soviet-pill">&#9733; V-2-IS 520HP</div>
131
+ <div class="soviet-pill">&#9733; KURSK 1943</div>
132
+ <div class="soviet-pill">&#9733; BERLIN 1945</div>
133
+ </div>
134
+
135
+ <div class="tank-title" style="margin-top:1rem">&#9733; TOP COMANDANTES</div>
136
+ <div class="commander-grid" id="users-grid">
137
+ <div class="commander-card"><div class="cmd-name">Cargando...</div><div class="cmd-trait">CONECTANDO AL SERVIDOR</div></div>
138
+ </div>
139
+
140
+ <div class="quote-box">
141
+ &ldquo;La victoria es para aquellos que no retroceden. Ni un paso atras.&rdquo;<br>
142
+ <span style="color:#c8a84b;font-style:normal">β€” Orden No. 227, Stalin β€” 1942 β€” &#9733; НИ ШАГУ НАЗАД</span>
143
+ </div>
144
+ </div>
145
+
146
+ </div>
147
+ <div class="footer">
148
+ <span class="classified">&#9733; CLASIFICADO &#9733;</span> &mdash; ROW-PROXY v1.0 &mdash; CCCP AI GATEWAY &mdash; НИ ШАГУ НАЗАД &mdash; <span class="classified">&#9733; CLASIFICADO &#9733;</span>
149
+ </div>
150
  <script>
151
+ var revealed = false;
152
+ var key = "free";
153
+ function toggleKey() {
154
+ revealed = !revealed;
155
+ document.getElementById("keyval").textContent = revealed ? key : "β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ";
156
+ document.querySelector(".reveal-btn").textContent = revealed ? "OCULTAR" : "REVELAR";
157
+ }
158
  function loadStats() {
159
+ fetch("/stats").then(r=>r.json()).then(data=>{
160
+ var keys = Object.values(data.keys || {});
161
+ keys.sort(function(a,b){ return b.tokens - a.tokens; });
162
+ var grid = document.getElementById("users-grid");
163
+ if(keys.length===0){
164
+ grid.innerHTML = "<div class="commander-card"><div class="cmd-name">Sin usuarios</div><div class="cmd-trait">SE EL PRIMERO</div></div>";
165
+ return;
166
+ }
167
+ grid.innerHTML = keys.slice(0,4).map(function(k){
168
+ return "<div class="commander-card"><div class="cmd-name">"+(k.name||"?")+("</div><div class="cmd-trait">SOLICITUDES: "+k.requests+" // TOKENS: "+k.tokens+"</div></div>");
169
+ }).join("");
170
+ }).catch(function(){});
 
 
 
 
 
171
  }
172
  loadStats();
173
  setInterval(loadStats, 30000);