baileys-idn 1.0.9 → 1.0.10
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 +14 -0
- package/lib/Utils/dashboard.d.ts.map +1 -1
- package/lib/Utils/dashboard.js +220 -79
- package/lib/Utils/dashboard.js.map +1 -1
- package/package.json +1 -1
package/lib/Utils/dashboard.d.ts
CHANGED
|
@@ -1,6 +1,18 @@
|
|
|
1
|
+
export interface ThemeOptions {
|
|
2
|
+
accentColor?: string;
|
|
3
|
+
opacity?: number;
|
|
4
|
+
bgImage?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface WidgetOptions {
|
|
7
|
+
showMetrics?: boolean;
|
|
8
|
+
showTerminal?: boolean;
|
|
9
|
+
showMusicPlayer?: boolean;
|
|
10
|
+
}
|
|
1
11
|
export interface DashboardOptions {
|
|
2
12
|
port?: number;
|
|
3
13
|
title?: string;
|
|
14
|
+
theme?: ThemeOptions;
|
|
15
|
+
widgets?: WidgetOptions;
|
|
4
16
|
}
|
|
5
17
|
export declare class Dashboard {
|
|
6
18
|
private app;
|
|
@@ -8,6 +20,8 @@ export declare class Dashboard {
|
|
|
8
20
|
private io;
|
|
9
21
|
private port;
|
|
10
22
|
private title;
|
|
23
|
+
private theme;
|
|
24
|
+
private widgets;
|
|
11
25
|
private status;
|
|
12
26
|
private pairingCode;
|
|
13
27
|
private startTime;
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/Utils/dashboard.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,YAAY;IACzB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,aAAa;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,eAAe,CAAC,EAAE,OAAO,CAAA;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB,OAAO,CAAC,EAAE,aAAa,CAAA;CAC1B;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,KAAK,CAAc;IAC3B,OAAO,CAAC,OAAO,CAAe;IAC9B,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;IAoB1C,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;CA6WrB;AAED,eAAO,MAAM,eAAe,GAAI,UAAU,gBAAgB,cAA2B,CAAA"}
|
package/lib/Utils/dashboard.js
CHANGED
|
@@ -15,17 +15,25 @@ export class Dashboard {
|
|
|
15
15
|
this.totalCommands = 0;
|
|
16
16
|
this.totalGroups = 0;
|
|
17
17
|
this.port = options.port || 3000;
|
|
18
|
-
this.title = options.title || '
|
|
18
|
+
this.title = options.title || 'Shiina-MD Control Center';
|
|
19
|
+
this.theme = {
|
|
20
|
+
accentColor: options.theme?.accentColor || '#2563eb',
|
|
21
|
+
opacity: options.theme?.opacity !== undefined ? options.theme.opacity : 0.85,
|
|
22
|
+
bgImage: options.theme?.bgImage || ''
|
|
23
|
+
};
|
|
24
|
+
this.widgets = {
|
|
25
|
+
showMetrics: options.widgets?.showMetrics !== false,
|
|
26
|
+
showTerminal: options.widgets?.showTerminal !== false,
|
|
27
|
+
showMusicPlayer: options.widgets?.showMusicPlayer !== false
|
|
28
|
+
};
|
|
19
29
|
this.setupRoutes();
|
|
20
30
|
this.setupSockets();
|
|
21
31
|
}
|
|
22
32
|
setupRoutes() {
|
|
23
|
-
// Mencegah browser menyimpan cache halaman HTML
|
|
24
33
|
this.app.get('/', (req, res) => {
|
|
25
34
|
res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, private');
|
|
26
35
|
res.send(this.renderHTML());
|
|
27
36
|
});
|
|
28
|
-
// Endpoint API pencarian musik via Jerexd API
|
|
29
37
|
this.app.get('/api/play', async (req, res) => {
|
|
30
38
|
const query = req.query.q;
|
|
31
39
|
if (!query) {
|
|
@@ -104,6 +112,9 @@ export class Dashboard {
|
|
|
104
112
|
});
|
|
105
113
|
}
|
|
106
114
|
renderHTML() {
|
|
115
|
+
const bgStyle = this.theme.bgImage
|
|
116
|
+
? `background: url('${this.theme.bgImage}') no-repeat center center fixed; background-size: cover;`
|
|
117
|
+
: `background-color: #0d1117;`;
|
|
107
118
|
return `<!DOCTYPE html>
|
|
108
119
|
<html lang="id">
|
|
109
120
|
<head>
|
|
@@ -113,66 +124,117 @@ export class Dashboard {
|
|
|
113
124
|
<script src="/socket.io/socket.io.js"></script>
|
|
114
125
|
<style>
|
|
115
126
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
116
|
-
body {
|
|
127
|
+
body { id="body-bg"; ${bgStyle} color: #c9d1d9; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; padding: 16px; display: flex; flex-direction: column; align-items: center; min-height: 100vh; }
|
|
117
128
|
.container { width: 100%; max-width: 900px; }
|
|
118
|
-
|
|
129
|
+
|
|
130
|
+
.header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px; padding: 10px 14px; background: rgba(22, 27, 34, ${this.theme.opacity}); backdrop-filter: blur(10px); border: 1px solid #30363d; border-radius: 6px; width: 100%; }
|
|
131
|
+
.header-title { display: flex; align-items: center; gap: 8px; }
|
|
119
132
|
.header h1 { font-size: 1.15rem; font-weight: 600; color: #f0f6fc; display: flex; align-items: center; gap: 8px; }
|
|
120
|
-
.header h1::before { content: 'P'; background:
|
|
133
|
+
.header h1::before { content: 'P'; background: ${this.theme.accentColor}; color: #fff; width: 20px; height: 20px; display: inline-flex; align-items: center; justify-content: center; border-radius: 4px; font-size: 11px; font-weight: 800; }
|
|
134
|
+
.header-actions { display: flex; align-items: center; gap: 10px; }
|
|
135
|
+
|
|
136
|
+
.btn-settings { background: #21262d; color: #f0f6fc; border: 1px solid #30363d; padding: 5px 10px; border-radius: 6px; font-size: 0.75rem; font-weight: 600; cursor: pointer; transition: 0.2s; }
|
|
137
|
+
.btn-settings:hover { background: #30363d; }
|
|
138
|
+
|
|
121
139
|
.badge { padding: 4px 10px; border-radius: 12px; font-size: 0.7rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.5px; }
|
|
122
140
|
.badge.online { background: rgba(34, 197, 94, 0.15); color: #4ade80; border: 1px solid rgba(34, 197, 94, 0.3); }
|
|
123
141
|
.badge.offline { background: rgba(239, 68, 68, 0.15); color: #f87171; border: 1px solid rgba(239, 68, 68, 0.3); }
|
|
124
142
|
.badge.connecting { background: rgba(234, 179, 8, 0.15); color: #facc15; border: 1px solid rgba(234, 179, 8, 0.3); }
|
|
125
143
|
|
|
126
|
-
.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(
|
|
127
|
-
.card { background:
|
|
144
|
+
.grid { display: ${this.widgets.showMetrics ? 'grid' : 'none'}; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 12px; margin-bottom: 16px; width: 100%; }
|
|
145
|
+
.card { background: rgba(22, 27, 34, ${this.theme.opacity}); backdrop-filter: blur(10px); border: 1px solid #30363d; border-radius: 6px; padding: 12px; position: relative; overflow: hidden; }
|
|
128
146
|
.card::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 3px; }
|
|
129
|
-
.card.blue::before { background:
|
|
147
|
+
.card.blue::before { background: ${this.theme.accentColor}; }
|
|
130
148
|
.card.purple::before { background: #a855f7; }
|
|
131
149
|
.card.orange::before { background: #f97316; }
|
|
132
150
|
.card.green::before { background: #22c55e; }
|
|
151
|
+
.card.cyan::before { background: #06b6d4; }
|
|
133
152
|
.card .title { font-size: 0.65rem; text-transform: uppercase; font-weight: 700; color: #8b949e; letter-spacing: 0.5px; margin-bottom: 4px; }
|
|
134
153
|
.card .value { font-size: 1rem; font-weight: 700; color: #f0f6fc; }
|
|
135
154
|
.card .subtext { font-size: 0.7rem; color: #6e7681; margin-top: 2px; }
|
|
136
155
|
|
|
137
|
-
.
|
|
138
|
-
|
|
156
|
+
.pairing-highlight { color: #38bdf8 !important; font-family: 'JetBrains Mono', monospace; font-size: 1.05rem !important; letter-spacing: 1px; }
|
|
157
|
+
|
|
158
|
+
.terminal-card { display: ${this.widgets.showTerminal ? 'block' : 'none'}; background: rgba(22, 27, 34, ${this.theme.opacity}); backdrop-filter: blur(10px); border: 1px solid #30363d; border-radius: 6px; overflow: hidden; margin-bottom: 16px; width: 100%; }
|
|
159
|
+
.terminal-header { background: rgba(1, 4, 9, 0.8); padding: 8px 12px; font-size: 0.7rem; font-weight: 600; color: #8b949e; border-bottom: 1px solid #21262d; display: flex; justify-content: space-between; align-items: center; }
|
|
139
160
|
.dots { display: flex; gap: 5px; }
|
|
140
161
|
.dot { width: 9px; height: 9px; border-radius: 50%; }
|
|
141
162
|
.dot.red { background: #ef4444; }
|
|
142
163
|
.dot.yellow { background: #eab308; }
|
|
143
164
|
.dot.green { background: #22c55e; }
|
|
144
165
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
.
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
+
#logs {
|
|
167
|
+
padding: 8px 12px;
|
|
168
|
+
height: 280px;
|
|
169
|
+
overflow-y: auto;
|
|
170
|
+
background: rgba(13, 17, 23, 0.75);
|
|
171
|
+
color: #38bdf8;
|
|
172
|
+
font-family: 'JetBrains Mono', 'Fira Code', monospace;
|
|
173
|
+
font-size: 0.76rem;
|
|
174
|
+
line-height: 1.15;
|
|
175
|
+
margin: 0;
|
|
176
|
+
white-space: pre-wrap;
|
|
177
|
+
word-break: break-all;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.player-card {
|
|
181
|
+
display: ${this.widgets.showMusicPlayer ? 'flex' : 'none'};
|
|
182
|
+
background: rgba(0, 0, 0, ${this.theme.opacity});
|
|
183
|
+
backdrop-filter: blur(12px);
|
|
184
|
+
border: 1px solid #30363d;
|
|
185
|
+
border-radius: 8px;
|
|
186
|
+
padding: 16px;
|
|
187
|
+
flex-direction: column;
|
|
188
|
+
align-items: center;
|
|
189
|
+
gap: 14px;
|
|
190
|
+
width: 100%;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
.player-search-bar { display: flex; align-items: center; background: #ffffff; border-radius: 6px; width: 100%; padding: 2px 8px; }
|
|
194
|
+
.player-search-input { flex: 1; border: none; outline: none; background: transparent; padding: 8px 10px; font-size: 0.85rem; color: #000000; font-weight: 500; }
|
|
195
|
+
.player-search-btn { background: transparent; border: none; cursor: pointer; font-size: 1.1rem; padding: 4px 8px; color: #000000; }
|
|
196
|
+
.song-details { display: flex; align-items: center; gap: 12px; width: 100%; }
|
|
197
|
+
.song-thumb { width: 44px; height: 44px; border-radius: 6px; object-fit: cover; background: #21262d; }
|
|
198
|
+
.song-info { display: flex; flex-direction: column; overflow: hidden; flex: 1; }
|
|
199
|
+
.song-title { font-size: 0.85rem; font-weight: 700; color: #ffffff; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
200
|
+
.song-artist { font-size: 0.72rem; color: #8b949e; }
|
|
201
|
+
.seek-container { width: 100%; display: flex; flex-direction: column; gap: 6px; }
|
|
202
|
+
.seek-slider { width: 100%; height: 4px; border-radius: 2px; accent-color: #ffffff; cursor: pointer; background: #333333; }
|
|
203
|
+
.time-labels { display: flex; justify-content: space-between; width: 100%; font-size: 0.72rem; font-weight: 600; color: #ffffff; font-family: 'JetBrains Mono', monospace; }
|
|
204
|
+
.play-btn-circle { background: #ffffff; color: #000000; border: none; width: 48px; height: 48px; border-radius: 50%; font-size: 1.1rem; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: transform 0.2s; }
|
|
205
|
+
.play-btn-circle:hover { transform: scale(1.08); }
|
|
206
|
+
|
|
207
|
+
/* Modal Settings Overlay */
|
|
208
|
+
.modal-overlay { display: none; position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.7); backdrop-filter: blur(5px); z-index: 1000; align-items: center; justify-content: center; padding: 16px; }
|
|
209
|
+
.modal-content { background: #161b22; border: 1px solid #30363d; border-radius: 8px; width: 100%; max-width: 450px; padding: 20px; display: flex; flex-direction: column; gap: 14px; }
|
|
210
|
+
.modal-header { display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid #21262d; padding-bottom: 10px; }
|
|
211
|
+
.modal-header h2 { font-size: 1rem; color: #f0f6fc; }
|
|
212
|
+
.modal-close { background: transparent; border: none; color: #8b949e; font-size: 1.2rem; cursor: pointer; }
|
|
213
|
+
.form-group { display: flex; flex-direction: column; gap: 6px; }
|
|
214
|
+
.form-group label { font-size: 0.75rem; font-weight: 600; color: #8b949e; }
|
|
215
|
+
.form-control { background: #0d1117; border: 1px solid #30363d; color: #c9d1d9; padding: 8px; border-radius: 4px; font-size: 0.8rem; outline: none; }
|
|
216
|
+
.checkbox-group { display: flex; align-items: center; gap: 8px; font-size: 0.8rem; color: #c9d1d9; cursor: pointer; }
|
|
217
|
+
.btn-save { background: #238636; color: #fff; border: none; padding: 8px; border-radius: 4px; font-weight: 600; cursor: pointer; margin-top: 6px; }
|
|
166
218
|
</style>
|
|
167
219
|
</head>
|
|
168
220
|
<body>
|
|
169
221
|
<div class="container">
|
|
170
222
|
<div class="header">
|
|
171
|
-
<
|
|
172
|
-
|
|
223
|
+
<div class="header-title">
|
|
224
|
+
<h1 id="dashboard-title">${this.title}</h1>
|
|
225
|
+
</div>
|
|
226
|
+
<div class="header-actions">
|
|
227
|
+
<button class="btn-settings" onclick="openModal()">⚙️ SETTINGS</button>
|
|
228
|
+
<span id="status-badge" class="badge ${this.status.toLowerCase()}">${this.status}</span>
|
|
229
|
+
</div>
|
|
173
230
|
</div>
|
|
174
231
|
|
|
175
|
-
<div class="grid">
|
|
232
|
+
<div class="grid" id="metrics-grid">
|
|
233
|
+
<div class="card cyan">
|
|
234
|
+
<div class="title">WhatsApp Pairing Code</div>
|
|
235
|
+
<div class="value pairing-highlight" id="pairing-code">-</div>
|
|
236
|
+
<div class="subtext">Kode tautan perangkat</div>
|
|
237
|
+
</div>
|
|
176
238
|
<div class="card blue">
|
|
177
239
|
<div class="title">Operating System</div>
|
|
178
240
|
<div class="value" id="os-name">-</div>
|
|
@@ -195,7 +257,7 @@ export class Dashboard {
|
|
|
195
257
|
</div>
|
|
196
258
|
</div>
|
|
197
259
|
|
|
198
|
-
<div class="terminal-card">
|
|
260
|
+
<div class="terminal-card" id="terminal-card">
|
|
199
261
|
<div class="terminal-header">
|
|
200
262
|
<span>TERMINAL / LIVE WHATSAPP LOGS</span>
|
|
201
263
|
<div class="dots">
|
|
@@ -204,44 +266,70 @@ export class Dashboard {
|
|
|
204
266
|
<div class="dot green"></div>
|
|
205
267
|
</div>
|
|
206
268
|
</div>
|
|
207
|
-
<
|
|
269
|
+
<pre id="logs">[SYSTEM] Pterodactyl-style console initialized. Listening for bot events... </pre>
|
|
208
270
|
</div>
|
|
209
271
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
<
|
|
214
|
-
<span id="player-status" style="color: #38bdf8; font-size: 0.68rem;">Ready</span>
|
|
215
|
-
</div>
|
|
216
|
-
<div class="search-box">
|
|
217
|
-
<input type="text" id="search-query" class="search-input" placeholder="Ketik judul lagu (cth: Ada Apa Dengan Cinta)..." onkeypress="if(event.key === 'Enter') searchMusic()">
|
|
218
|
-
<button class="btn-search" onclick="searchMusic()">Cari & Putar</button>
|
|
272
|
+
<div class="player-card" id="player-card">
|
|
273
|
+
<div class="player-search-bar">
|
|
274
|
+
<input type="text" id="search-query" class="player-search-input" placeholder="Cari musik / judul lagu..." onkeypress="if(event.key === 'Enter') searchMusic()">
|
|
275
|
+
<button class="player-search-btn" onclick="searchMusic()">🔍</button>
|
|
219
276
|
</div>
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
<
|
|
223
|
-
|
|
277
|
+
|
|
278
|
+
<div class="song-details">
|
|
279
|
+
<img id="track-thumb" class="song-thumb" src="https://via.placeholder.com/44/161b22/8b949e?text=🎵" alt="Thumb">
|
|
280
|
+
<div class="song-info">
|
|
281
|
+
<div class="song-title" id="track-title">Belum ada lagu diputar</div>
|
|
282
|
+
<div class="song-artist" id="track-channel">Ketik lagu lalu klik cari...</div>
|
|
224
283
|
</div>
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
284
|
+
</div>
|
|
285
|
+
|
|
286
|
+
<div class="seek-container">
|
|
287
|
+
<input type="range" class="seek-slider" id="seek-bar" min="0" value="0" step="1" oninput="seekAudio(this.value)">
|
|
288
|
+
<div class="time-labels">
|
|
289
|
+
<span id="current-time">0:00</span>
|
|
290
|
+
<span id="remaining-time">-0:00</span>
|
|
229
291
|
</div>
|
|
230
292
|
</div>
|
|
293
|
+
|
|
294
|
+
<button class="play-btn-circle" id="play-btn" onclick="togglePlay()">▶</button>
|
|
231
295
|
<audio id="audio-player" preload="none"></audio>
|
|
232
296
|
</div>
|
|
233
297
|
</div>
|
|
234
298
|
|
|
299
|
+
<!-- Modal Web Customization Settings -->
|
|
300
|
+
<div class="modal-overlay" id="settings-modal">
|
|
301
|
+
<div class="modal-content">
|
|
302
|
+
<div class="modal-header">
|
|
303
|
+
<h2>⚙️ Customize Dashboard UI</h2>
|
|
304
|
+
<button class="modal-close" onclick="closeModal()">✖</button>
|
|
305
|
+
</div>
|
|
306
|
+
<div class="form-group">
|
|
307
|
+
<label>Transparansi / Opacity (<span id="opacity-val">85</span>%)</label>
|
|
308
|
+
<input type="range" class="form-control" id="cfg-opacity" min="0.1" max="1" step="0.05" value="${this.theme.opacity}" oninput="updateOpacityLabel(this.value)">
|
|
309
|
+
</div>
|
|
310
|
+
<div class="form-group">
|
|
311
|
+
<label>URL Wallpaper Background</label>
|
|
312
|
+
<input type="text" class="form-control" id="cfg-bg" placeholder="https://..." value="${this.theme.bgImage}">
|
|
313
|
+
</div>
|
|
314
|
+
<div class="form-group">
|
|
315
|
+
<label>Warna Aksen Utama</label>
|
|
316
|
+
<input type="color" class="form-control" id="cfg-color" value="${this.theme.accentColor}">
|
|
317
|
+
</div>
|
|
318
|
+
<div class="form-group">
|
|
319
|
+
<label>Toggle Widgets Visibility</label>
|
|
320
|
+
<label class="checkbox-group"><input type="checkbox" id="cfg-w-metrics" ${this.widgets.showMetrics ? 'checked' : ''}> Tampilkan Status & Pairing Code Metrics</label>
|
|
321
|
+
<label class="checkbox-group"><input type="checkbox" id="cfg-w-terminal" ${this.widgets.showTerminal ? 'checked' : ''}> Tampilkan Terminal Log Console</label>
|
|
322
|
+
<label class="checkbox-group"><input type="checkbox" id="cfg-w-music" ${this.widgets.showMusicPlayer ? 'checked' : ''}> Tampilkan Music Player Widget</label>
|
|
323
|
+
</div>
|
|
324
|
+
<button class="btn-save" onclick="saveSettings()">Terapkan Pengaturan</button>
|
|
325
|
+
</div>
|
|
326
|
+
</div>
|
|
327
|
+
|
|
235
328
|
<script>
|
|
236
329
|
const socket = io();
|
|
237
330
|
|
|
238
|
-
socket.on('init-data', (data) =>
|
|
239
|
-
|
|
240
|
-
});
|
|
241
|
-
|
|
242
|
-
socket.on('metrics-update', (data) => {
|
|
243
|
-
updateMetrics(data);
|
|
244
|
-
});
|
|
331
|
+
socket.on('init-data', (data) => updateMetrics(data));
|
|
332
|
+
socket.on('metrics-update', (data) => updateMetrics(data));
|
|
245
333
|
|
|
246
334
|
socket.on('status-update', (status) => {
|
|
247
335
|
const badge = document.getElementById('status-badge');
|
|
@@ -249,18 +337,19 @@ export class Dashboard {
|
|
|
249
337
|
badge.className = 'badge ' + status.toLowerCase();
|
|
250
338
|
});
|
|
251
339
|
|
|
340
|
+
socket.on('pairing-update', (code) => {
|
|
341
|
+
document.getElementById('pairing-code').innerText = code;
|
|
342
|
+
});
|
|
343
|
+
|
|
252
344
|
socket.on('stats-update', (stats) => {
|
|
253
345
|
if (stats.commands !== undefined) document.getElementById('total-commands').innerText = stats.commands;
|
|
254
346
|
if (stats.groups !== undefined) document.getElementById('total-groups').innerText = stats.groups;
|
|
255
347
|
});
|
|
256
348
|
|
|
257
349
|
socket.on('log-entry', (msg) => {
|
|
258
|
-
const
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
entry.innerText = msg + '\\n';
|
|
262
|
-
logsDiv.appendChild(entry);
|
|
263
|
-
logsDiv.scrollTop = logsDiv.scrollHeight;
|
|
350
|
+
const logsPre = document.getElementById('logs');
|
|
351
|
+
logsPre.appendChild(document.createTextNode(msg + '\\n'));
|
|
352
|
+
logsPre.scrollTop = logsPre.scrollHeight;
|
|
264
353
|
});
|
|
265
354
|
|
|
266
355
|
function updateMetrics(data) {
|
|
@@ -271,26 +360,60 @@ export class Dashboard {
|
|
|
271
360
|
document.getElementById('ram-percent').innerText = data.ramPercent + '% utilized';
|
|
272
361
|
document.getElementById('total-commands').innerText = data.commands;
|
|
273
362
|
document.getElementById('total-groups').innerText = data.groups;
|
|
363
|
+
document.getElementById('pairing-code').innerText = data.pairingCode || '-';
|
|
274
364
|
|
|
275
365
|
const badge = document.getElementById('status-badge');
|
|
276
366
|
badge.innerText = data.status;
|
|
277
367
|
badge.className = 'badge ' + data.status.toLowerCase();
|
|
278
368
|
}
|
|
279
369
|
|
|
280
|
-
//
|
|
370
|
+
// Web Modal & Customization Script
|
|
371
|
+
function openModal() { document.getElementById('settings-modal').style.display = 'flex'; }
|
|
372
|
+
function closeModal() { document.getElementById('settings-modal').style.display = 'none'; }
|
|
373
|
+
function updateOpacityLabel(val) { document.getElementById('opacity-val').innerText = Math.round(val * 100); }
|
|
374
|
+
|
|
375
|
+
function saveSettings() {
|
|
376
|
+
const opacity = document.getElementById('cfg-opacity').value;
|
|
377
|
+
const bg = document.getElementById('cfg-bg').value;
|
|
378
|
+
const color = document.getElementById('cfg-color').value;
|
|
379
|
+
const showMetrics = document.getElementById('cfg-w-metrics').checked;
|
|
380
|
+
const showTerminal = document.getElementById('cfg-w-terminal').checked;
|
|
381
|
+
const showMusic = document.getElementById('cfg-w-music').checked;
|
|
382
|
+
|
|
383
|
+
// Apply directly into DOM
|
|
384
|
+
document.querySelectorAll('.card, .header, .terminal-card').forEach(el => {
|
|
385
|
+
el.style.background = 'rgba(22, 27, 34, ' + opacity + ')';
|
|
386
|
+
});
|
|
387
|
+
document.querySelector('.player-card').style.background = 'rgba(0, 0, 0, ' + opacity + ')';
|
|
388
|
+
|
|
389
|
+
if (bg) {
|
|
390
|
+
document.body.style.background = "url('" + bg + "') no-repeat center center fixed";
|
|
391
|
+
document.body.style.backgroundSize = "cover";
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
document.getElementById('metrics-grid').style.display = showMetrics ? 'grid' : 'none';
|
|
395
|
+
document.getElementById('terminal-card').style.display = showTerminal ? 'block' : 'none';
|
|
396
|
+
document.getElementById('player-card').style.display = showMusic ? 'flex' : 'none';
|
|
397
|
+
|
|
398
|
+
closeModal();
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// Audio Player Controller
|
|
281
402
|
const audio = document.getElementById('audio-player');
|
|
282
403
|
const playBtn = document.getElementById('play-btn');
|
|
283
404
|
const trackTitle = document.getElementById('track-title');
|
|
284
405
|
const trackChannel = document.getElementById('track-channel');
|
|
285
406
|
const trackThumb = document.getElementById('track-thumb');
|
|
286
|
-
const playerStatus = document.getElementById('player-status');
|
|
287
407
|
const searchQuery = document.getElementById('search-query');
|
|
408
|
+
const seekBar = document.getElementById('seek-bar');
|
|
409
|
+
const currentTimeLabel = document.getElementById('current-time');
|
|
410
|
+
const remainingTimeLabel = document.getElementById('remaining-time');
|
|
288
411
|
|
|
289
412
|
async function searchMusic() {
|
|
290
413
|
const query = searchQuery.value.trim();
|
|
291
414
|
if (!query) return;
|
|
292
415
|
|
|
293
|
-
|
|
416
|
+
trackTitle.innerText = 'Mencari lagu...';
|
|
294
417
|
try {
|
|
295
418
|
const res = await fetch('/api/play?q=' + encodeURIComponent(query));
|
|
296
419
|
const json = await res.json();
|
|
@@ -298,19 +421,17 @@ export class Dashboard {
|
|
|
298
421
|
if (json.status && json.result) {
|
|
299
422
|
const data = json.result;
|
|
300
423
|
trackTitle.innerText = data.title;
|
|
301
|
-
trackChannel.innerText = data.channel
|
|
424
|
+
trackChannel.innerText = data.channel;
|
|
302
425
|
trackThumb.src = data.thumbnail;
|
|
303
426
|
audio.src = data.download || data.downloadUrl || data.download_url;
|
|
304
427
|
|
|
305
428
|
audio.play();
|
|
306
429
|
playBtn.innerText = '❚❚';
|
|
307
|
-
playerStatus.innerText = 'Memutar';
|
|
308
430
|
} else {
|
|
309
|
-
|
|
431
|
+
trackTitle.innerText = 'Lagu tidak ditemukan';
|
|
310
432
|
}
|
|
311
433
|
} catch (err) {
|
|
312
|
-
|
|
313
|
-
console.error(err);
|
|
434
|
+
trackTitle.innerText = 'Gagal memanggil API';
|
|
314
435
|
}
|
|
315
436
|
}
|
|
316
437
|
|
|
@@ -319,17 +440,37 @@ export class Dashboard {
|
|
|
319
440
|
if (audio.paused) {
|
|
320
441
|
audio.play();
|
|
321
442
|
playBtn.innerText = '❚❚';
|
|
322
|
-
playerStatus.innerText = 'Memutar';
|
|
323
443
|
} else {
|
|
324
444
|
audio.pause();
|
|
325
445
|
playBtn.innerText = '▶';
|
|
326
|
-
playerStatus.innerText = 'Dijeda';
|
|
327
446
|
}
|
|
328
447
|
}
|
|
329
448
|
|
|
330
|
-
function
|
|
331
|
-
audio.
|
|
449
|
+
function seekAudio(val) {
|
|
450
|
+
if (audio.duration) audio.currentTime = val;
|
|
332
451
|
}
|
|
452
|
+
|
|
453
|
+
audio.addEventListener('timeupdate', () => {
|
|
454
|
+
if (audio.duration) {
|
|
455
|
+
seekBar.max = Math.floor(audio.duration);
|
|
456
|
+
seekBar.value = Math.floor(audio.currentTime);
|
|
457
|
+
|
|
458
|
+
const curMins = Math.floor(audio.currentTime / 60);
|
|
459
|
+
const curSecs = Math.floor(audio.currentTime % 60);
|
|
460
|
+
currentTimeLabel.innerText = curMins + ':' + (curSecs < 10 ? '0' : '') + curSecs;
|
|
461
|
+
|
|
462
|
+
const remSecsTotal = Math.floor(audio.duration - audio.currentTime);
|
|
463
|
+
const remMins = Math.floor(remSecsTotal / 60);
|
|
464
|
+
const remSecs = Math.floor(remSecsTotal % 60);
|
|
465
|
+
remainingTimeLabel.innerText = '-' + remMins + ':' + (remSecs < 10 ? '0' : '') + remSecs;
|
|
466
|
+
}
|
|
467
|
+
});
|
|
468
|
+
|
|
469
|
+
audio.addEventListener('ended', () => {
|
|
470
|
+
playBtn.innerText = '▶';
|
|
471
|
+
seekBar.value = 0;
|
|
472
|
+
currentTimeLabel.innerText = '0:00';
|
|
473
|
+
});
|
|
333
474
|
</script>
|
|
334
475
|
</body>
|
|
335
476
|
</html>`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/Utils/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAA;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAA;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAClC,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/Utils/dashboard.ts"],"names":[],"mappings":"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"}
|