baileys-idn 1.0.6 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/Utils/dashboard.d.ts +17 -7
- package/lib/Utils/dashboard.d.ts.map +1 -1
- package/lib/Utils/dashboard.js +310 -185
- package/lib/Utils/dashboard.js.map +1 -1
- package/package.json +1 -1
package/lib/Utils/dashboard.d.ts
CHANGED
|
@@ -2,21 +2,31 @@ export interface DashboardOptions {
|
|
|
2
2
|
port?: number;
|
|
3
3
|
title?: string;
|
|
4
4
|
}
|
|
5
|
-
export declare class
|
|
5
|
+
export declare class Dashboard {
|
|
6
6
|
private app;
|
|
7
7
|
private server;
|
|
8
8
|
private io;
|
|
9
9
|
private port;
|
|
10
|
+
private title;
|
|
11
|
+
private status;
|
|
10
12
|
private pairingCode;
|
|
11
|
-
private
|
|
13
|
+
private startTime;
|
|
14
|
+
private totalCommands;
|
|
15
|
+
private totalGroups;
|
|
12
16
|
constructor(options?: DashboardOptions);
|
|
13
|
-
private getSystemInfo;
|
|
14
|
-
private setupSockets;
|
|
15
17
|
private setupRoutes;
|
|
18
|
+
private setupSockets;
|
|
19
|
+
private getSystemMetrics;
|
|
20
|
+
updateStatus(status: 'ONLINE' | 'OFFLINE' | 'CONNECTING'): void;
|
|
16
21
|
updatePairingCode(code: string): void;
|
|
17
|
-
|
|
18
|
-
|
|
22
|
+
updateStats(stats: {
|
|
23
|
+
commands?: number;
|
|
24
|
+
groups?: number;
|
|
25
|
+
}): void;
|
|
26
|
+
incrementCommand(): void;
|
|
27
|
+
emitLog(message: string): void;
|
|
19
28
|
start(): void;
|
|
29
|
+
private renderHTML;
|
|
20
30
|
}
|
|
21
|
-
export declare
|
|
31
|
+
export declare const createDashboard: (options?: DashboardOptions) => Dashboard;
|
|
22
32
|
//# sourceMappingURL=dashboard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/Utils/dashboard.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/Utils/dashboard.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,gBAAgB;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,qBAAa,SAAS;IAClB,OAAO,CAAC,GAAG,CAAY;IACvB,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,IAAI,CAAQ;IACpB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,MAAM,CAAiD;IAC/D,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,WAAW,CAAY;gBAEnB,OAAO,GAAE,gBAAqB;IAO1C,OAAO,CAAC,WAAW;IAuBnB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,gBAAgB;IAuBjB,YAAY,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,YAAY;IAKxD,iBAAiB,CAAC,IAAI,EAAE,MAAM;IAS9B,WAAW,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAMzD,gBAAgB;IAKhB,OAAO,CAAC,OAAO,EAAE,MAAM;IAKvB,KAAK;IAMZ,OAAO,CAAC,UAAU;CAwOrB;AAED,eAAO,MAAM,eAAe,GAAI,UAAU,gBAAgB,cAA2B,CAAA"}
|
package/lib/Utils/dashboard.js
CHANGED
|
@@ -1,213 +1,338 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
|
-
import
|
|
3
|
-
import { Server
|
|
2
|
+
import { createServer } from 'http';
|
|
3
|
+
import { Server } from 'socket.io';
|
|
4
4
|
import os from 'os';
|
|
5
|
+
import dayjs from 'dayjs';
|
|
5
6
|
import { log } from './logger.js';
|
|
6
|
-
export class
|
|
7
|
+
export class Dashboard {
|
|
7
8
|
constructor(options = {}) {
|
|
8
9
|
this.app = express();
|
|
9
|
-
this.server =
|
|
10
|
-
this.io = new
|
|
10
|
+
this.server = createServer(this.app);
|
|
11
|
+
this.io = new Server(this.server);
|
|
12
|
+
this.status = 'OFFLINE';
|
|
11
13
|
this.pairingCode = '-';
|
|
12
|
-
this.
|
|
14
|
+
this.startTime = Date.now();
|
|
15
|
+
this.totalCommands = 0;
|
|
16
|
+
this.totalGroups = 0;
|
|
13
17
|
this.port = options.port || 3000;
|
|
14
|
-
this.
|
|
18
|
+
this.title = options.title || 'Baileys-IDN Control Center';
|
|
19
|
+
this.setupRoutes();
|
|
15
20
|
this.setupSockets();
|
|
16
21
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
22
|
+
setupRoutes() {
|
|
23
|
+
this.app.get('/', (req, res) => {
|
|
24
|
+
res.send(this.renderHTML());
|
|
25
|
+
});
|
|
26
|
+
// Endpoint API proxy untuk pencarian musik dari dashboard ke jerexd API
|
|
27
|
+
this.app.get('/api/play', async (req, res) => {
|
|
28
|
+
const query = req.query.q;
|
|
29
|
+
if (!query) {
|
|
30
|
+
return res.status(400).json({ status: false, message: 'Query parameter "q" is required' });
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const fetch = (await import('node-fetch')).default;
|
|
34
|
+
const apiUrl = `https://api.jerexd.my.id/api/downloader/play?apikey=XVsu1z4Fzd90UeD9&q=${encodeURIComponent(query)}`;
|
|
35
|
+
const response = await fetch(apiUrl);
|
|
36
|
+
const data = await response.json();
|
|
37
|
+
res.json(data);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
res.status(500).json({ status: false, message: error.message });
|
|
41
|
+
}
|
|
42
|
+
});
|
|
34
43
|
}
|
|
35
44
|
setupSockets() {
|
|
36
45
|
this.io.on('connection', (socket) => {
|
|
37
|
-
socket.emit('
|
|
38
|
-
socket.emit('pairing-update', this.pairingCode);
|
|
39
|
-
socket.emit('status-update', this.botStatus);
|
|
46
|
+
socket.emit('init-data', this.getSystemMetrics());
|
|
40
47
|
});
|
|
41
48
|
setInterval(() => {
|
|
42
|
-
this.io.emit('
|
|
43
|
-
},
|
|
49
|
+
this.io.emit('metrics-update', this.getSystemMetrics());
|
|
50
|
+
}, 3000);
|
|
44
51
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
.badge-offline { background: rgba(239, 68, 68, 0.15); color: #ef4444; border: 1px solid rgba(239, 68, 68, 0.3); }
|
|
70
|
-
|
|
71
|
-
/* Grid Metrics Card */
|
|
72
|
-
.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 16px; margin-bottom: 24px; }
|
|
73
|
-
.card { background: #18181b; border: 1px solid #27272a; padding: 18px; border-radius: 8px; position: relative; overflow: hidden; }
|
|
74
|
-
.card::before { content: ''; position: absolute; top: 0; left: 0; width: 4px; height: 100%; background: #3b82f6; }
|
|
75
|
-
.card.ram::before { background: #a855f7; }
|
|
76
|
-
.card.pairing::before { background: #f59e0b; }
|
|
77
|
-
.card.os::before { background: #10b981; }
|
|
78
|
-
|
|
79
|
-
.card-label { font-size: 0.75rem; font-weight: 600; color: #71717a; text-transform: uppercase; margin-bottom: 8px; letter-spacing: 0.5px; }
|
|
80
|
-
.card-value { font-size: 1.35rem; font-weight: 700; color: #f4f4f5; }
|
|
81
|
-
.card-sub { font-size: 0.75rem; color: #52525b; margin-top: 4px; }
|
|
82
|
-
|
|
83
|
-
/* Terminal / Live Console Window */
|
|
84
|
-
.console-wrapper { background: #09090b; border: 1px solid #27272a; border-radius: 8px; overflow: hidden; box-shadow: 0 10px 30px rgba(0,0,0,0.5); }
|
|
85
|
-
.console-header { background: #18181b; padding: 10px 16px; border-bottom: 1px solid #27272a; display: flex; align-items: center; justify-content: space-between; }
|
|
86
|
-
.console-title { font-size: 0.8rem; font-weight: 600; color: #71717a; text-transform: uppercase; }
|
|
87
|
-
.console-dots { display: flex; gap: 6px; }
|
|
88
|
-
.dot { width: 10px; height: 10px; border-radius: 50%; }
|
|
89
|
-
.dot-red { background: #ef4444; }
|
|
90
|
-
.dot-yellow { background: #f59e0b; }
|
|
91
|
-
.dot-green { background: #22c55e; }
|
|
92
|
-
|
|
93
|
-
#logs { padding: 16px; height: 320px; overflow-y: auto; font-size: 0.82rem; line-height: 1.6; color: #38bdf8; white-space: pre-wrap; font-family: 'JetBrains Mono', monospace; }
|
|
94
|
-
.log-entry { margin-bottom: 4px; word-break: break-all; }
|
|
95
|
-
.log-time { color: #52525b; margin-right: 8px; }
|
|
96
|
-
|
|
97
|
-
/* Custom Scrollbar */
|
|
98
|
-
::-webkit-scrollbar { width: 6px; }
|
|
99
|
-
::-webkit-scrollbar-track { background: #09090b; }
|
|
100
|
-
::-webkit-scrollbar-thumb { background: #27272a; border-radius: 3px; }
|
|
101
|
-
</style>
|
|
102
|
-
</head>
|
|
103
|
-
<body>
|
|
104
|
-
|
|
105
|
-
<!-- Top Navbar -->
|
|
106
|
-
<div class="header">
|
|
107
|
-
<div class="brand">
|
|
108
|
-
<div class="brand-logo">P</div>
|
|
109
|
-
<div class="brand-title">${title}</div>
|
|
110
|
-
</div>
|
|
111
|
-
<div id="status-badge" class="badge badge-offline">OFFLINE</div>
|
|
112
|
-
</div>
|
|
113
|
-
|
|
114
|
-
<!-- Metrics Grid -->
|
|
115
|
-
<div class="grid">
|
|
116
|
-
<div class="card os">
|
|
117
|
-
<div class="card-label">Operating System</div>
|
|
118
|
-
<div class="card-value" id="os-name">Linux</div>
|
|
119
|
-
<div class="card-sub" id="cpu-model">Architecture: x64</div>
|
|
120
|
-
</div>
|
|
121
|
-
<div class="card ram">
|
|
122
|
-
<div class="card-label">Memory Usage</div>
|
|
123
|
-
<div class="card-value" id="ram-usage">0 / 0 MB</div>
|
|
124
|
-
<div class="card-sub" id="ram-percent">0% utilized</div>
|
|
125
|
-
</div>
|
|
126
|
-
<div class="card pairing">
|
|
127
|
-
<div class="card-label">WhatsApp Pairing Code</div>
|
|
128
|
-
<div class="card-value" id="pairing-code" style="color:#f59e0b; letter-spacing: 2px;">-</div>
|
|
129
|
-
<div class="card-sub">Use code to link device</div>
|
|
130
|
-
</div>
|
|
131
|
-
<div class="card">
|
|
132
|
-
<div class="card-label">Uptime</div>
|
|
133
|
-
<div class="card-value" id="sys-uptime">0 mins</div>
|
|
134
|
-
<div class="card-sub">Node.js Environment</div>
|
|
135
|
-
</div>
|
|
136
|
-
</div>
|
|
137
|
-
|
|
138
|
-
<!-- Terminal Console -->
|
|
139
|
-
<div class="console-wrapper">
|
|
140
|
-
<div class="console-header">
|
|
141
|
-
<span class="console-title">Terminal / Live WhatsApp Logs</span>
|
|
142
|
-
<div class="console-dots">
|
|
143
|
-
<div class="dot dot-red"></div>
|
|
144
|
-
<div class="dot dot-yellow"></div>
|
|
145
|
-
<div class="dot dot-green"></div>
|
|
146
|
-
</div>
|
|
147
|
-
</div>
|
|
148
|
-
<div id="logs">
|
|
149
|
-
<div class="log-entry"><span class="log-time">[SYSTEM]</span> Pterodactyl-style console initialized. Listening for bot events...</div>
|
|
150
|
-
</div>
|
|
151
|
-
</div>
|
|
152
|
-
|
|
153
|
-
<script>
|
|
154
|
-
const socket = io();
|
|
155
|
-
const logsDiv = document.getElementById('logs');
|
|
156
|
-
|
|
157
|
-
socket.on('sys-update', (data) => {
|
|
158
|
-
document.getElementById('os-name').innerText = data.platform + ' (' + data.arch + ')';
|
|
159
|
-
document.getElementById('cpu-model').innerText = data.cpuModel;
|
|
160
|
-
document.getElementById('ram-usage').innerText = data.usedMem + ' / ' + data.totalMem;
|
|
161
|
-
document.getElementById('ram-percent').innerText = data.ramPercent + ' utilized';
|
|
162
|
-
document.getElementById('sys-uptime').innerText = data.uptime;
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
socket.on('pairing-update', (code) => {
|
|
166
|
-
document.getElementById('pairing-code').innerText = code || '-';
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
socket.on('status-update', (status) => {
|
|
170
|
-
const badge = document.getElementById('status-badge');
|
|
171
|
-
badge.innerText = status.toUpperCase();
|
|
172
|
-
if (status.toLowerCase().includes('connect') || status.toLowerCase().includes('open') || status.toLowerCase().includes('online')) {
|
|
173
|
-
badge.className = 'badge badge-online';
|
|
174
|
-
} else {
|
|
175
|
-
badge.className = 'badge badge-offline';
|
|
176
|
-
}
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
socket.on('log', (msg) => {
|
|
180
|
-
const entry = document.createElement('div');
|
|
181
|
-
entry.className = 'log-entry';
|
|
182
|
-
const timeStr = new Date().toLocaleTimeString();
|
|
183
|
-
entry.innerHTML = '<span class="log-time">[' + timeStr + ']</span> ' + msg;
|
|
184
|
-
logsDiv.appendChild(entry);
|
|
185
|
-
logsDiv.scrollTop = logsDiv.scrollHeight;
|
|
186
|
-
});
|
|
187
|
-
</script>
|
|
188
|
-
</body>
|
|
189
|
-
</html>
|
|
190
|
-
`);
|
|
191
|
-
});
|
|
52
|
+
getSystemMetrics() {
|
|
53
|
+
const totalMem = os.totalmem();
|
|
54
|
+
const freeMem = os.freemem();
|
|
55
|
+
const usedMem = totalMem - freeMem;
|
|
56
|
+
const cpus = os.cpus();
|
|
57
|
+
const cpuModel = (cpus.length > 0 && cpus[0]?.model) ? cpus[0].model : 'Unknown CPU';
|
|
58
|
+
const uptimeMins = Math.floor((Date.now() - this.startTime) / 60000);
|
|
59
|
+
return {
|
|
60
|
+
title: this.title,
|
|
61
|
+
status: this.status,
|
|
62
|
+
pairingCode: this.pairingCode,
|
|
63
|
+
os: `${os.type()} (${os.arch()})`,
|
|
64
|
+
cpu: cpuModel,
|
|
65
|
+
ramUsed: (usedMem / 1024 / 1024).toFixed(0),
|
|
66
|
+
ramTotal: (totalMem / 1024 / 1024).toFixed(0),
|
|
67
|
+
ramPercent: ((usedMem / totalMem) * 100).toFixed(1),
|
|
68
|
+
uptime: uptimeMins,
|
|
69
|
+
commands: this.totalCommands,
|
|
70
|
+
groups: this.totalGroups
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
updateStatus(status) {
|
|
74
|
+
this.status = status;
|
|
75
|
+
this.io.emit('status-update', status);
|
|
192
76
|
}
|
|
193
77
|
updatePairingCode(code) {
|
|
194
78
|
this.pairingCode = code;
|
|
195
79
|
this.io.emit('pairing-update', code);
|
|
80
|
+
const formattedLog = `🔑 PAIRING CODE: ${code}`;
|
|
81
|
+
log.info(formattedLog);
|
|
82
|
+
this.emitLog(formattedLog);
|
|
196
83
|
}
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
84
|
+
updateStats(stats) {
|
|
85
|
+
if (typeof stats.commands === 'number')
|
|
86
|
+
this.totalCommands = stats.commands;
|
|
87
|
+
if (typeof stats.groups === 'number')
|
|
88
|
+
this.totalGroups = stats.groups;
|
|
89
|
+
this.io.emit('stats-update', { commands: this.totalCommands, groups: this.totalGroups });
|
|
200
90
|
}
|
|
201
|
-
|
|
202
|
-
this.
|
|
91
|
+
incrementCommand() {
|
|
92
|
+
this.totalCommands++;
|
|
93
|
+
this.updateStats({ commands: this.totalCommands });
|
|
94
|
+
}
|
|
95
|
+
emitLog(message) {
|
|
96
|
+
const timestamp = dayjs().format('HH.mm.ss');
|
|
97
|
+
this.io.emit('log-entry', `[${timestamp}] ${message}`);
|
|
203
98
|
}
|
|
204
99
|
start() {
|
|
205
100
|
this.server.listen(this.port, () => {
|
|
206
|
-
log.
|
|
101
|
+
log.info(`Pterodactyl Web Dashboard berjalan di http://localhost:${this.port}`);
|
|
207
102
|
});
|
|
208
103
|
}
|
|
104
|
+
renderHTML() {
|
|
105
|
+
return `<!DOCTYPE html>
|
|
106
|
+
<html lang="id">
|
|
107
|
+
<head>
|
|
108
|
+
<meta charset="UTF-8">
|
|
109
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
110
|
+
<title>${this.title}</title>
|
|
111
|
+
<script src="/socket.io/socket.io.js"></script>
|
|
112
|
+
<style>
|
|
113
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
114
|
+
body { background-color: #0d1117; color: #c9d1d9; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; padding: 20px; display: flex; flex-direction: column; align-items: center; }
|
|
115
|
+
.container { width: 100%; max-width: 900px; }
|
|
116
|
+
.header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; padding-bottom: 12px; border-bottom: 1px solid #21262d; width: 100%; }
|
|
117
|
+
.header h1 { font-size: 1.25rem; font-weight: 600; color: #f0f6fc; display: flex; align-items: center; gap: 8px; }
|
|
118
|
+
.header h1::before { content: 'P'; background: #2563eb; color: #fff; width: 22px; height: 22px; display: inline-flex; align-items: center; justify-content: center; border-radius: 4px; font-size: 12px; font-weight: 800; }
|
|
119
|
+
.badge { padding: 4px 10px; border-radius: 12px; font-size: 0.75rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.5px; }
|
|
120
|
+
.badge.online { background: rgba(34, 197, 94, 0.15); color: #4ade80; border: 1px solid rgba(34, 197, 94, 0.3); }
|
|
121
|
+
.badge.offline { background: rgba(239, 68, 68, 0.15); color: #f87171; border: 1px solid rgba(239, 68, 68, 0.3); }
|
|
122
|
+
.badge.connecting { background: rgba(234, 179, 8, 0.15); color: #facc15; border: 1px solid rgba(234, 179, 8, 0.3); }
|
|
123
|
+
|
|
124
|
+
.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 14px; margin-bottom: 20px; width: 100%; }
|
|
125
|
+
.card { background: #161b22; border: 1px solid #30363d; border-radius: 6px; padding: 14px; position: relative; overflow: hidden; }
|
|
126
|
+
.card::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 3px; }
|
|
127
|
+
.card.blue::before { background: #3b82f6; }
|
|
128
|
+
.card.purple::before { background: #a855f7; }
|
|
129
|
+
.card.orange::before { background: #f97316; }
|
|
130
|
+
.card.green::before { background: #22c55e; }
|
|
131
|
+
.card .title { font-size: 0.7rem; text-transform: uppercase; font-weight: 700; color: #8b949e; letter-spacing: 0.5px; margin-bottom: 6px; }
|
|
132
|
+
.card .value { font-size: 1.1rem; font-weight: 700; color: #f0f6fc; }
|
|
133
|
+
.card .subtext { font-size: 0.75rem; color: #6e7681; margin-top: 4px; }
|
|
134
|
+
|
|
135
|
+
.terminal-card { background: #161b22; border: 1px solid #30363d; border-radius: 6px; overflow: hidden; margin-bottom: 20px; width: 100%; }
|
|
136
|
+
.terminal-header { background: #010409; padding: 10px 14px; font-size: 0.75rem; font-weight: 600; color: #8b949e; border-bottom: 1px solid #21262d; display: flex; justify-content: space-between; align-items: center; }
|
|
137
|
+
.dots { display: flex; gap: 6px; }
|
|
138
|
+
.dot { width: 10px; height: 10px; border-radius: 50%; }
|
|
139
|
+
.dot.red { background: #ef4444; }
|
|
140
|
+
.dot.yellow { background: #eab308; }
|
|
141
|
+
.dot.green { background: #22c55e; }
|
|
142
|
+
|
|
143
|
+
#logs { padding: 12px; height: 320px; overflow-y: auto; font-size: 0.8rem; color: #38bdf8; font-family: 'JetBrains Mono', monospace; display: flex; flex-direction: column; }
|
|
144
|
+
.log-entry { margin: 0 !important; padding: 0 !important; line-height: 1.15 !important; word-break: break-all; }
|
|
145
|
+
|
|
146
|
+
/* Music Search Player Style */
|
|
147
|
+
.music-card { background: #161b22; border: 1px solid #30363d; border-radius: 6px; padding: 14px 16px; display: flex; flex-direction: column; gap: 12px; width: 100%; }
|
|
148
|
+
.music-header { display: flex; justify-content: space-between; align-items: center; font-size: 0.75rem; font-weight: 700; color: #8b949e; text-transform: uppercase; letter-spacing: 0.5px; }
|
|
149
|
+
.search-box { display: flex; gap: 8px; width: 100%; }
|
|
150
|
+
.search-input { flex: 1; background: #0d1117; color: #c9d1d9; border: 1px solid #30363d; padding: 6px 10px; border-radius: 4px; font-size: 0.8rem; outline: none; }
|
|
151
|
+
.search-input:focus { border-color: #3b82f6; }
|
|
152
|
+
.btn-search { background: #238636; color: #fff; border: none; padding: 6px 14px; border-radius: 4px; font-size: 0.8rem; font-weight: 600; cursor: pointer; transition: 0.2s; }
|
|
153
|
+
.btn-search:hover { background: #2ea043; }
|
|
154
|
+
.music-body { display: flex; align-items: center; gap: 14px; background: #0d1117; padding: 10px; border-radius: 6px; border: 1px solid #21262d; }
|
|
155
|
+
.thumbnail { width: 50px; height: 50px; border-radius: 4px; object-fit: cover; background: #21262d; }
|
|
156
|
+
.music-controls { display: flex; align-items: center; gap: 10px; }
|
|
157
|
+
.btn-play { background: #2563eb; color: #fff; border: none; width: 36px; height: 36px; border-radius: 50%; font-size: 0.9rem; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: 0.2s; }
|
|
158
|
+
.btn-play:hover { background: #1d4ed8; transform: scale(1.05); }
|
|
159
|
+
.music-info { flex: 1; display: flex; flex-direction: column; gap: 3px; overflow: hidden; }
|
|
160
|
+
.music-title { font-size: 0.85rem; font-weight: 700; color: #f0f6fc; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
161
|
+
.music-artist { font-size: 0.7rem; color: #8b949e; }
|
|
162
|
+
.seek-bar { width: 100%; accent-color: #3b82f6; cursor: pointer; margin-top: 4px; }
|
|
163
|
+
</style>
|
|
164
|
+
</head>
|
|
165
|
+
<body>
|
|
166
|
+
<div class="container">
|
|
167
|
+
<div class="header">
|
|
168
|
+
<h1 id="dashboard-title">${this.title}</h1>
|
|
169
|
+
<span id="status-badge" class="badge ${this.status.toLowerCase()}">${this.status}</span>
|
|
170
|
+
</div>
|
|
171
|
+
|
|
172
|
+
<div class="grid">
|
|
173
|
+
<div class="card blue">
|
|
174
|
+
<div class="title">Operating System</div>
|
|
175
|
+
<div class="value" id="os-name">-</div>
|
|
176
|
+
<div class="subtext" id="cpu-name">-</div>
|
|
177
|
+
</div>
|
|
178
|
+
<div class="card purple">
|
|
179
|
+
<div class="title">Memory Usage</div>
|
|
180
|
+
<div class="value" id="ram-text">- / - MB</div>
|
|
181
|
+
<div class="subtext" id="ram-percent">- % utilized</div>
|
|
182
|
+
</div>
|
|
183
|
+
<div class="card orange">
|
|
184
|
+
<div class="title">Total Commands</div>
|
|
185
|
+
<div class="value" id="total-commands">0</div>
|
|
186
|
+
<div class="subtext">Executed commands</div>
|
|
187
|
+
</div>
|
|
188
|
+
<div class="card green">
|
|
189
|
+
<div class="title">Total Groups</div>
|
|
190
|
+
<div class="value" id="total-groups">0</div>
|
|
191
|
+
<div class="subtext">Active WhatsApp groups</div>
|
|
192
|
+
</div>
|
|
193
|
+
</div>
|
|
194
|
+
|
|
195
|
+
<div class="terminal-card">
|
|
196
|
+
<div class="terminal-header">
|
|
197
|
+
<span>TERMINAL / LIVE WHATSAPP LOGS</span>
|
|
198
|
+
<div class="dots">
|
|
199
|
+
<div class="dot red"></div>
|
|
200
|
+
<div class="dot yellow"></div>
|
|
201
|
+
<div class="dot green"></div>
|
|
202
|
+
</div>
|
|
203
|
+
</div>
|
|
204
|
+
<div id="logs">
|
|
205
|
+
<div class="log-entry" style="color: #6e7681;">[SYSTEM] Pterodactyl-style console initialized. Listening for bot events...</div>
|
|
206
|
+
</div>
|
|
207
|
+
</div>
|
|
208
|
+
|
|
209
|
+
<!-- Music Search & Player Widget -->
|
|
210
|
+
<div class="music-card">
|
|
211
|
+
<div class="music-header">
|
|
212
|
+
<span>🎧 YOUTUBE MUSIC SEARCH PLAYER</span>
|
|
213
|
+
<span id="player-status" style="color: #38bdf8; font-size: 0.7rem;">Ready</span>
|
|
214
|
+
</div>
|
|
215
|
+
<div class="search-box">
|
|
216
|
+
<input type="text" id="search-query" class="search-input" placeholder="Ketik judul lagu (cth: Ada Apa Dengan Cinta)..." onkeypress="if(event.key === 'Enter') searchMusic()">
|
|
217
|
+
<button class="btn-search" onclick="searchMusic()">Cari & Putar</button>
|
|
218
|
+
</div>
|
|
219
|
+
<div class="music-body">
|
|
220
|
+
<img id="track-thumb" class="thumbnail" src="https://via.placeholder.com/50" alt="Thumb">
|
|
221
|
+
<div class="music-controls">
|
|
222
|
+
<button class="btn-play" id="play-btn" onclick="togglePlay()">▶</button>
|
|
223
|
+
</div>
|
|
224
|
+
<div class="music-info">
|
|
225
|
+
<div class="music-title" id="track-title">Belum ada lagu diputar</div>
|
|
226
|
+
<div class="music-artist" id="track-channel">Ketik pencarian di atas...</div>
|
|
227
|
+
<input type="range" class="seek-bar" id="volume-bar" min="0" max="1" step="0.05" value="0.7" onchange="setVolume(this.value)">
|
|
228
|
+
</div>
|
|
229
|
+
</div>
|
|
230
|
+
<audio id="audio-player" preload="none"></audio>
|
|
231
|
+
</div>
|
|
232
|
+
</div>
|
|
233
|
+
|
|
234
|
+
<script>
|
|
235
|
+
const socket = io();
|
|
236
|
+
|
|
237
|
+
socket.on('init-data', (data) => {
|
|
238
|
+
updateMetrics(data);
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
socket.on('metrics-update', (data) => {
|
|
242
|
+
updateMetrics(data);
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
socket.on('status-update', (status) => {
|
|
246
|
+
const badge = document.getElementById('status-badge');
|
|
247
|
+
badge.innerText = status;
|
|
248
|
+
badge.className = 'badge ' + status.toLowerCase();
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
socket.on('stats-update', (stats) => {
|
|
252
|
+
if (stats.commands !== undefined) document.getElementById('total-commands').innerText = stats.commands;
|
|
253
|
+
if (stats.groups !== undefined) document.getElementById('total-groups').innerText = stats.groups;
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
socket.on('log-entry', (msg) => {
|
|
257
|
+
const logsDiv = document.getElementById('logs');
|
|
258
|
+
const entry = document.createElement('div');
|
|
259
|
+
entry.className = 'log-entry';
|
|
260
|
+
entry.innerText = msg;
|
|
261
|
+
logsDiv.appendChild(entry);
|
|
262
|
+
logsDiv.scrollTop = logsDiv.scrollHeight;
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
function updateMetrics(data) {
|
|
266
|
+
document.getElementById('dashboard-title').innerText = data.title;
|
|
267
|
+
document.getElementById('os-name').innerText = data.os;
|
|
268
|
+
document.getElementById('cpu-name').innerText = data.cpu;
|
|
269
|
+
document.getElementById('ram-text').innerText = data.ramUsed + ' MB / ' + data.ramTotal + ' MB';
|
|
270
|
+
document.getElementById('ram-percent').innerText = data.ramPercent + '% utilized';
|
|
271
|
+
document.getElementById('total-commands').innerText = data.commands;
|
|
272
|
+
document.getElementById('total-groups').innerText = data.groups;
|
|
273
|
+
|
|
274
|
+
const badge = document.getElementById('status-badge');
|
|
275
|
+
badge.innerText = data.status;
|
|
276
|
+
badge.className = 'badge ' + data.status.toLowerCase();
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// Music Player & Search Controller
|
|
280
|
+
const audio = document.getElementById('audio-player');
|
|
281
|
+
const playBtn = document.getElementById('play-btn');
|
|
282
|
+
const trackTitle = document.getElementById('track-title');
|
|
283
|
+
const trackChannel = document.getElementById('track-channel');
|
|
284
|
+
const trackThumb = document.getElementById('track-thumb');
|
|
285
|
+
const playerStatus = document.getElementById('player-status');
|
|
286
|
+
const searchQuery = document.getElementById('search-query');
|
|
287
|
+
|
|
288
|
+
async function searchMusic() {
|
|
289
|
+
const query = searchQuery.value.trim();
|
|
290
|
+
if (!query) return;
|
|
291
|
+
|
|
292
|
+
playerStatus.innerText = 'Mencari...';
|
|
293
|
+
try {
|
|
294
|
+
const res = await fetch('/api/play?q=' + encodeURIComponent(query));
|
|
295
|
+
const json = await res.json();
|
|
296
|
+
|
|
297
|
+
if (json.status && json.result) {
|
|
298
|
+
const data = json.result;
|
|
299
|
+
trackTitle.innerText = data.title;
|
|
300
|
+
trackChannel.innerText = data.channel + ' (' + data.duration + ')';
|
|
301
|
+
trackThumb.src = data.thumbnail;
|
|
302
|
+
audio.src = data.download || data.downloadUrl || data.download_url;
|
|
303
|
+
|
|
304
|
+
audio.play();
|
|
305
|
+
playBtn.innerText = '❚❚';
|
|
306
|
+
playerStatus.innerText = 'Memutar';
|
|
307
|
+
} else {
|
|
308
|
+
playerStatus.innerText = 'Gagal ditemukan';
|
|
309
|
+
}
|
|
310
|
+
} catch (err) {
|
|
311
|
+
playerStatus.innerText = 'Error API';
|
|
312
|
+
console.error(err);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
function togglePlay() {
|
|
317
|
+
if (!audio.src) return;
|
|
318
|
+
if (audio.paused) {
|
|
319
|
+
audio.play();
|
|
320
|
+
playBtn.innerText = '❚❚';
|
|
321
|
+
playerStatus.innerText = 'Memutar';
|
|
322
|
+
} else {
|
|
323
|
+
audio.pause();
|
|
324
|
+
playBtn.innerText = '▶';
|
|
325
|
+
playerStatus.innerText = 'Dijeda';
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
function setVolume(val) {
|
|
330
|
+
audio.volume = val;
|
|
331
|
+
}
|
|
332
|
+
</script>
|
|
333
|
+
</body>
|
|
334
|
+
</html>`;
|
|
335
|
+
}
|
|
209
336
|
}
|
|
210
|
-
export
|
|
211
|
-
return new BotDashboard(options);
|
|
212
|
-
}
|
|
337
|
+
export const createDashboard = (options) => new Dashboard(options);
|
|
213
338
|
//# sourceMappingURL=dashboard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/Utils/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAA;AAC7B,OAAO,
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/Utils/dashboard.ts"],"names":[],"mappings":"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"}
|