baileys-idn 1.0.8 → 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 +228 -86
- 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,15 +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
33
|
this.app.get('/', (req, res) => {
|
|
34
|
+
res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, private');
|
|
24
35
|
res.send(this.renderHTML());
|
|
25
36
|
});
|
|
26
|
-
// Endpoint API proxy untuk pencarian musik dari dashboard ke jerexd API
|
|
27
37
|
this.app.get('/api/play', async (req, res) => {
|
|
28
38
|
const query = req.query.q;
|
|
29
39
|
if (!query) {
|
|
@@ -102,6 +112,9 @@ export class Dashboard {
|
|
|
102
112
|
});
|
|
103
113
|
}
|
|
104
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;`;
|
|
105
118
|
return `<!DOCTYPE html>
|
|
106
119
|
<html lang="id">
|
|
107
120
|
<head>
|
|
@@ -111,65 +124,117 @@ export class Dashboard {
|
|
|
111
124
|
<script src="/socket.io/socket.io.js"></script>
|
|
112
125
|
<style>
|
|
113
126
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
114
|
-
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; }
|
|
115
128
|
.container { width: 100%; max-width: 900px; }
|
|
116
|
-
|
|
117
|
-
.header
|
|
118
|
-
.header
|
|
119
|
-
.
|
|
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; }
|
|
132
|
+
.header h1 { font-size: 1.15rem; font-weight: 600; color: #f0f6fc; display: flex; align-items: center; gap: 8px; }
|
|
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
|
+
|
|
139
|
+
.badge { padding: 4px 10px; border-radius: 12px; font-size: 0.7rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.5px; }
|
|
120
140
|
.badge.online { background: rgba(34, 197, 94, 0.15); color: #4ade80; border: 1px solid rgba(34, 197, 94, 0.3); }
|
|
121
141
|
.badge.offline { background: rgba(239, 68, 68, 0.15); color: #f87171; border: 1px solid rgba(239, 68, 68, 0.3); }
|
|
122
142
|
.badge.connecting { background: rgba(234, 179, 8, 0.15); color: #facc15; border: 1px solid rgba(234, 179, 8, 0.3); }
|
|
123
143
|
|
|
124
|
-
.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(
|
|
125
|
-
.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; }
|
|
126
146
|
.card::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 3px; }
|
|
127
|
-
.card.blue::before { background:
|
|
147
|
+
.card.blue::before { background: ${this.theme.accentColor}; }
|
|
128
148
|
.card.purple::before { background: #a855f7; }
|
|
129
149
|
.card.orange::before { background: #f97316; }
|
|
130
150
|
.card.green::before { background: #22c55e; }
|
|
131
|
-
.card
|
|
132
|
-
.card .
|
|
133
|
-
.card .
|
|
151
|
+
.card.cyan::before { background: #06b6d4; }
|
|
152
|
+
.card .title { font-size: 0.65rem; text-transform: uppercase; font-weight: 700; color: #8b949e; letter-spacing: 0.5px; margin-bottom: 4px; }
|
|
153
|
+
.card .value { font-size: 1rem; font-weight: 700; color: #f0f6fc; }
|
|
154
|
+
.card .subtext { font-size: 0.7rem; color: #6e7681; margin-top: 2px; }
|
|
134
155
|
|
|
135
|
-
.
|
|
136
|
-
|
|
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; }
|
|
160
|
+
.dots { display: flex; gap: 5px; }
|
|
161
|
+
.dot { width: 9px; height: 9px; border-radius: 50%; }
|
|
139
162
|
.dot.red { background: #ef4444; }
|
|
140
163
|
.dot.yellow { background: #eab308; }
|
|
141
164
|
.dot.green { background: #22c55e; }
|
|
142
165
|
|
|
143
|
-
#logs {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
.
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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; }
|
|
163
218
|
</style>
|
|
164
219
|
</head>
|
|
165
220
|
<body>
|
|
166
221
|
<div class="container">
|
|
167
222
|
<div class="header">
|
|
168
|
-
<
|
|
169
|
-
|
|
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>
|
|
170
230
|
</div>
|
|
171
231
|
|
|
172
|
-
<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>
|
|
173
238
|
<div class="card blue">
|
|
174
239
|
<div class="title">Operating System</div>
|
|
175
240
|
<div class="value" id="os-name">-</div>
|
|
@@ -192,7 +257,7 @@ export class Dashboard {
|
|
|
192
257
|
</div>
|
|
193
258
|
</div>
|
|
194
259
|
|
|
195
|
-
<div class="terminal-card">
|
|
260
|
+
<div class="terminal-card" id="terminal-card">
|
|
196
261
|
<div class="terminal-header">
|
|
197
262
|
<span>TERMINAL / LIVE WHATSAPP LOGS</span>
|
|
198
263
|
<div class="dots">
|
|
@@ -201,46 +266,70 @@ export class Dashboard {
|
|
|
201
266
|
<div class="dot green"></div>
|
|
202
267
|
</div>
|
|
203
268
|
</div>
|
|
204
|
-
<
|
|
205
|
-
<div class="log-entry" style="color: #6e7681;">[SYSTEM] Pterodactyl-style console initialized. Listening for bot events...</div>
|
|
206
|
-
</div>
|
|
269
|
+
<pre id="logs">[SYSTEM] Pterodactyl-style console initialized. Listening for bot events... </pre>
|
|
207
270
|
</div>
|
|
208
271
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
<
|
|
213
|
-
<span id="player-status" style="color: #38bdf8; font-size: 0.7rem;">Ready</span>
|
|
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>
|
|
214
276
|
</div>
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
<
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
<div class="music-controls">
|
|
222
|
-
<button class="btn-play" id="play-btn" onclick="togglePlay()">▶</button>
|
|
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>
|
|
223
283
|
</div>
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
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>
|
|
228
291
|
</div>
|
|
229
292
|
</div>
|
|
293
|
+
|
|
294
|
+
<button class="play-btn-circle" id="play-btn" onclick="togglePlay()">▶</button>
|
|
230
295
|
<audio id="audio-player" preload="none"></audio>
|
|
231
296
|
</div>
|
|
232
297
|
</div>
|
|
233
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
|
+
|
|
234
328
|
<script>
|
|
235
329
|
const socket = io();
|
|
236
330
|
|
|
237
|
-
socket.on('init-data', (data) =>
|
|
238
|
-
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
socket.on('metrics-update', (data) => {
|
|
242
|
-
updateMetrics(data);
|
|
243
|
-
});
|
|
331
|
+
socket.on('init-data', (data) => updateMetrics(data));
|
|
332
|
+
socket.on('metrics-update', (data) => updateMetrics(data));
|
|
244
333
|
|
|
245
334
|
socket.on('status-update', (status) => {
|
|
246
335
|
const badge = document.getElementById('status-badge');
|
|
@@ -248,18 +337,19 @@ export class Dashboard {
|
|
|
248
337
|
badge.className = 'badge ' + status.toLowerCase();
|
|
249
338
|
});
|
|
250
339
|
|
|
340
|
+
socket.on('pairing-update', (code) => {
|
|
341
|
+
document.getElementById('pairing-code').innerText = code;
|
|
342
|
+
});
|
|
343
|
+
|
|
251
344
|
socket.on('stats-update', (stats) => {
|
|
252
345
|
if (stats.commands !== undefined) document.getElementById('total-commands').innerText = stats.commands;
|
|
253
346
|
if (stats.groups !== undefined) document.getElementById('total-groups').innerText = stats.groups;
|
|
254
347
|
});
|
|
255
348
|
|
|
256
349
|
socket.on('log-entry', (msg) => {
|
|
257
|
-
const
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
entry.innerText = msg;
|
|
261
|
-
logsDiv.appendChild(entry);
|
|
262
|
-
logsDiv.scrollTop = logsDiv.scrollHeight;
|
|
350
|
+
const logsPre = document.getElementById('logs');
|
|
351
|
+
logsPre.appendChild(document.createTextNode(msg + '\\n'));
|
|
352
|
+
logsPre.scrollTop = logsPre.scrollHeight;
|
|
263
353
|
});
|
|
264
354
|
|
|
265
355
|
function updateMetrics(data) {
|
|
@@ -270,26 +360,60 @@ export class Dashboard {
|
|
|
270
360
|
document.getElementById('ram-percent').innerText = data.ramPercent + '% utilized';
|
|
271
361
|
document.getElementById('total-commands').innerText = data.commands;
|
|
272
362
|
document.getElementById('total-groups').innerText = data.groups;
|
|
363
|
+
document.getElementById('pairing-code').innerText = data.pairingCode || '-';
|
|
273
364
|
|
|
274
365
|
const badge = document.getElementById('status-badge');
|
|
275
366
|
badge.innerText = data.status;
|
|
276
367
|
badge.className = 'badge ' + data.status.toLowerCase();
|
|
277
368
|
}
|
|
278
369
|
|
|
279
|
-
//
|
|
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
|
|
280
402
|
const audio = document.getElementById('audio-player');
|
|
281
403
|
const playBtn = document.getElementById('play-btn');
|
|
282
404
|
const trackTitle = document.getElementById('track-title');
|
|
283
405
|
const trackChannel = document.getElementById('track-channel');
|
|
284
406
|
const trackThumb = document.getElementById('track-thumb');
|
|
285
|
-
const playerStatus = document.getElementById('player-status');
|
|
286
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');
|
|
287
411
|
|
|
288
412
|
async function searchMusic() {
|
|
289
413
|
const query = searchQuery.value.trim();
|
|
290
414
|
if (!query) return;
|
|
291
415
|
|
|
292
|
-
|
|
416
|
+
trackTitle.innerText = 'Mencari lagu...';
|
|
293
417
|
try {
|
|
294
418
|
const res = await fetch('/api/play?q=' + encodeURIComponent(query));
|
|
295
419
|
const json = await res.json();
|
|
@@ -297,19 +421,17 @@ export class Dashboard {
|
|
|
297
421
|
if (json.status && json.result) {
|
|
298
422
|
const data = json.result;
|
|
299
423
|
trackTitle.innerText = data.title;
|
|
300
|
-
trackChannel.innerText = data.channel
|
|
424
|
+
trackChannel.innerText = data.channel;
|
|
301
425
|
trackThumb.src = data.thumbnail;
|
|
302
426
|
audio.src = data.download || data.downloadUrl || data.download_url;
|
|
303
427
|
|
|
304
428
|
audio.play();
|
|
305
429
|
playBtn.innerText = '❚❚';
|
|
306
|
-
playerStatus.innerText = 'Memutar';
|
|
307
430
|
} else {
|
|
308
|
-
|
|
431
|
+
trackTitle.innerText = 'Lagu tidak ditemukan';
|
|
309
432
|
}
|
|
310
433
|
} catch (err) {
|
|
311
|
-
|
|
312
|
-
console.error(err);
|
|
434
|
+
trackTitle.innerText = 'Gagal memanggil API';
|
|
313
435
|
}
|
|
314
436
|
}
|
|
315
437
|
|
|
@@ -318,17 +440,37 @@ export class Dashboard {
|
|
|
318
440
|
if (audio.paused) {
|
|
319
441
|
audio.play();
|
|
320
442
|
playBtn.innerText = '❚❚';
|
|
321
|
-
playerStatus.innerText = 'Memutar';
|
|
322
443
|
} else {
|
|
323
444
|
audio.pause();
|
|
324
445
|
playBtn.innerText = '▶';
|
|
325
|
-
playerStatus.innerText = 'Dijeda';
|
|
326
446
|
}
|
|
327
447
|
}
|
|
328
448
|
|
|
329
|
-
function
|
|
330
|
-
audio.
|
|
449
|
+
function seekAudio(val) {
|
|
450
|
+
if (audio.duration) audio.currentTime = val;
|
|
331
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
|
+
});
|
|
332
474
|
</script>
|
|
333
475
|
</body>
|
|
334
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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"}
|