Trigger82 commited on
Commit
ea2968b
Β·
verified Β·
1 Parent(s): 235e839

Update public/script.js

Browse files
Files changed (1) hide show
  1. public/script.js +67 -240
public/script.js CHANGED
@@ -1,269 +1,96 @@
1
- // ─────────────────────────────────────────────────────────────────────────────
2
- // Frontend Logic
3
- // ─────────────────────────────────────────────────────────────────────────────
4
-
5
  const socket = io();
6
- let currentUserId = null;
7
  let isAdmin = false;
8
 
9
- // ─────────────────────────────────────────────────────────────────────────────
10
- // 1) AUTHENTICATION (Register, Login, Logout)
11
- // ─────────────────────────────────────────────────────────────────────────────
12
-
13
- function doRegister() {
14
- const username = document.getElementById('username').value.trim();
15
- const password = document.getElementById('password').value.trim();
16
- const clientId = document.getElementById('clientId').value.trim();
17
- if (!username || !password || !clientId) {
18
- showAuthMessage('All fields required for register.');
19
- return;
20
- }
21
- socket.emit('register', { username, password, clientId });
22
- }
23
-
24
- function doLogin() {
25
  const username = document.getElementById('username').value.trim();
26
  const password = document.getElementById('password').value.trim();
27
- if (!username || !password) {
28
- showAuthMessage('Username & password required.');
29
- return;
30
- }
31
  socket.emit('login', { username, password });
32
- }
33
-
34
- function doLogout() {
35
- location.reload(); // Full refresh to clear session
36
- }
37
-
38
- // Handle auth responses
39
- socket.on('registerResponse', (res) => {
40
- const msgEl = document.getElementById('authMessage');
41
- if (res.success) {
42
- msgEl.style.color = 'green';
43
- msgEl.innerText = `Registered! Your ID: ${res.userId}`;
44
- } else {
45
- msgEl.style.color = 'red';
46
- msgEl.innerText = res.message;
47
- }
48
  });
49
 
50
- socket.on('loginResponse', (res) => {
51
- const msgEl = document.getElementById('authMessage');
52
- if (res.success) {
53
- currentUserId = res.userId;
54
- isAdmin = res.isAdmin;
55
- msgEl.innerText = '';
56
- showMainPanel();
 
 
 
57
  } else {
58
- msgEl.style.color = 'red';
59
- msgEl.innerText = res.message;
60
  }
61
  });
62
 
63
- // ─────────────────────────────────────────────────────────────────────────────
64
- // 2) SHOW MAIN PANEL AFTER LOGIN
65
- // ─────────────────────────────────────────────────────────────────────────────
 
 
 
 
66
 
67
- function showMainPanel() {
68
- document.getElementById('authCard').style.display = 'none';
69
- document.getElementById('mainPanel').style.display = 'block';
70
- document.getElementById('displayUserId').innerText = currentUserId;
71
- if (isAdmin) {
72
- document.getElementById('adminBadge').style.display = 'inline-block';
73
- document.getElementById('adminPanel').style.display = 'block';
74
- fetchUsers();
75
- }
76
- // Start periodic stats & keep-alive ping
77
- requestLiveStats();
78
- startPing();
79
  }
80
 
81
- // ─────────────────────────────────────────────────────────────────────────────
82
- // 3) LIVE STATS (uptime, system status, user counts)
83
- // ─────────────────────────────────────────────────────────────────────────────
84
-
85
- socket.on('serverRuntime', (uptimeStr) => {
86
- document.getElementById('uptime').innerText = uptimeStr;
87
- });
88
-
89
- socket.on('systemStatus', (stats) => {
90
- document.getElementById('cpu').innerText = stats.cpu + '%';
91
- document.getElementById('mem').innerText = stats.memory + '%';
92
- document.getElementById('disk').innerText = stats.disk + '%';
93
  });
94
 
95
- socket.on('userStats', (uStats) => {
96
- document.getElementById('totalUsers').innerText = uStats.total;
97
- document.getElementById('activeUsers').innerText = uStats.active;
98
- document.getElementById('bannedUsers').innerText = uStats.banned;
 
 
 
 
 
 
99
  });
100
 
101
- function requestLiveStats() {
102
- socket.emit('getServerRuntime');
103
- socket.emit('getSystemStatus');
104
- socket.emit('getUserStats');
105
- setTimeout(requestLiveStats, 5000);
106
- }
107
-
108
- // Keep-alive ping every 10 seconds to prevent HF from killing idle socket
109
- function startPing() {
110
- setInterval(() => {
111
- socket.emit('ping');
112
- }, 10000);
113
- }
114
-
115
- // ─────────────────────────────────────────────────────────────────────────────
116
- // 4) ADMIN DASHBOARD (Fetch/list users, Ban/Unban/Delete/MakeAdmin/RemoveAdmin)
117
- // ─────────────────────────────────────────────────────────────────────────────
118
-
119
- function fetchUsers() {
120
  socket.emit('adminGetUsers');
121
- }
122
-
123
  socket.on('adminUserList', (data) => {
124
- const container = document.getElementById('adminUserList');
125
  container.innerHTML = '';
126
- if (!data.users.length) {
127
- container.innerText = 'No users found.';
128
- return;
129
- }
130
  data.users.forEach((u) => {
131
- const row = document.createElement('div');
132
- row.className = 'user-row';
133
- row.innerHTML = `
134
- <span><b>${u.username}</b> (ID: ${u.id}) ${u.isAdmin ? '[Admin]' : ''}</span>
135
- <button onclick="adminBan('${u.id}')">Ban</button>
136
- <button onclick="adminUnban('${u.id}')">Unban</button>
137
- <button onclick="adminDelete('${u.id}')">Delete</button>
138
- <button onclick="adminMakeAdmin('${u.id}')">Make Admin</button>
139
- <button onclick="adminRemoveAdmin('${u.id}')">Remove Admin</button>
140
- `;
141
- container.appendChild(row);
142
  });
143
  });
144
 
145
- socket.on('adminBanResponse', (res) => {
146
- showAdminMessage(res.message, res.success);
147
- fetchUsers();
148
- });
149
- socket.on('adminUnbanResponse', (res) => {
150
- showAdminMessage(res.message, res.success);
151
- fetchUsers();
152
- });
153
- socket.on('adminDeleteUserResponse', (res) => {
154
- showAdminMessage(res.message, res.success);
155
- fetchUsers();
156
- });
157
- socket.on('adminMakeAdminResponse', (res) => {
158
- showAdminMessage(res.message, res.success);
159
- fetchUsers();
160
  });
161
- socket.on('adminRemoveAdminResponse', (res) => {
162
- showAdminMessage(res.message, res.success);
163
- fetchUsers();
164
- });
165
-
166
- function adminBan(userId) {
167
- socket.emit('adminBanUser', userId);
168
- }
169
- function adminUnban(userId) {
170
- socket.emit('adminUnbanUser', userId);
171
- }
172
- function adminDelete(userId) {
173
- socket.emit('adminDeleteUser', userId);
174
- }
175
- function adminMakeAdmin(userId) {
176
- socket.emit('adminMakeAdmin', userId);
177
- }
178
- function adminRemoveAdmin(userId) {
179
- socket.emit('adminRemoveAdmin', userId);
180
- }
181
-
182
- function showAdminMessage(msg, success) {
183
- const el = document.getElementById('adminMessage');
184
- el.style.color = success ? 'green' : 'red';
185
- el.innerText = msg;
186
- }
187
-
188
- // ─────────────────────────────────────────────────────────────────────────────
189
- // 5) USER CONSOLE (Start session, send commands, display output)
190
- // ──────────────────���──────────────────────────────────────────────────────────
191
-
192
- function startSession() {
193
- if (!currentUserId) return;
194
- socket.emit('start', currentUserId);
195
- }
196
-
197
- function sendCommand() {
198
- const cmd = document.getElementById('commandInput').value.trim();
199
- if (!cmd) return;
200
- appendOutput(`> ${cmd}`);
201
- socket.emit('command', { userId: currentUserId, message: cmd });
202
- document.getElementById('commandInput').value = '';
203
- }
204
-
205
- socket.on('message', (data) => {
206
- if (typeof data === 'string') {
207
- appendOutput(data);
208
- } else {
209
- appendOutput(JSON.stringify(data, null, 2));
210
- }
211
- });
212
-
213
- function appendOutput(text) {
214
- const out = document.getElementById('consoleOutput');
215
- out.innerText += text + '\n';
216
- out.scrollTop = out.scrollHeight;
217
- }
218
-
219
- // ─────────────────────────────────────────────────────────────────────────────
220
- // 6) PASSWORD RESET (Request token, submit reset)
221
- // ─────────────────────────────────────────────────────────────────────────────
222
-
223
- function requestReset() {
224
- const clientId = document.getElementById('resetClientId').value.trim();
225
- if (!clientId) {
226
- showResetMessage('Enter your Device ID first.', false);
227
- return;
228
- }
229
- socket.emit('forgotPassword', clientId);
230
- }
231
-
232
- socket.on('resetTokenGenerated', ({ username, resetToken }) => {
233
- showResetMessage(`Token generated for ${username}: ${resetToken}`, true);
234
- });
235
-
236
- socket.on('resetTokenError', (msg) => {
237
- showResetMessage(msg, false);
238
- });
239
-
240
- function submitReset() {
241
- const token = document.getElementById('resetToken').value.trim();
242
- const newPass = document.getElementById('newPassword').value.trim();
243
- if (!token || !newPass) {
244
- showResetMessage('Token & new password are required.', false);
245
- return;
246
- }
247
- socket.emit('resetPassword', { resetToken: token, newPassword: newPass });
248
- }
249
-
250
- socket.on('passwordResetSuccess', (msg) => {
251
- showResetMessage(msg, true);
252
- });
253
- socket.on('passwordResetError', (msg) => {
254
- showResetMessage(msg, false);
255
  });
256
 
257
- function showResetMessage(msg, success) {
258
- const el = document.getElementById('resetMessage');
259
- el.style.color = success ? 'green' : 'red';
260
- el.innerText = msg;
261
- }
262
-
263
- // ─────────────────────────────────────────────────────────────────────────────
264
- // 7) HANDLE DISCONNECTS (optional cleanup)
265
- // ─────────────────────────────────────────────────────────────────────────────
266
-
267
- socket.on('disconnect', () => {
268
- appendOutput('πŸ“΄ Disconnected from server.');
269
- });
 
 
 
 
 
1
  const socket = io();
2
+ let userId = '';
3
  let isAdmin = false;
4
 
5
+ // Login flow
6
+ document.getElementById('login-btn').addEventListener('click', () => {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  const username = document.getElementById('username').value.trim();
8
  const password = document.getElementById('password').value.trim();
 
 
 
 
9
  socket.emit('login', { username, password });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  });
11
 
12
+ socket.on('loginResponse', (data) => {
13
+ if (data.success) {
14
+ userId = data.userId;
15
+ isAdmin = data.isAdmin;
16
+ document.getElementById('login-screen').style.display = 'none';
17
+ document.getElementById('panel').style.display = 'block';
18
+ document.getElementById('userId-display').textContent = userId;
19
+ if (isAdmin) {
20
+ document.getElementById('admin-panel').style.display = 'block';
21
+ }
22
  } else {
23
+ document.getElementById('login-message').innerText = data.message;
 
24
  }
25
  });
26
 
27
+ // Start session
28
+ document.getElementById('start-btn').addEventListener('click', () => {
29
+ if (!userId) return;
30
+ socket.emit('start', userId);
31
+ document.getElementById('chat-container').style.display = 'block';
32
+ startKeepAlive();
33
+ });
34
 
35
+ function appendMessage(msg) {
36
+ const div = document.createElement('div');
37
+ div.innerText = msg;
38
+ document.getElementById('messages').appendChild(div);
39
+ document.getElementById('messages').scrollTop = document.getElementById('messages').scrollHeight;
 
 
 
 
 
 
 
40
  }
41
 
42
+ // Command flow
43
+ document.getElementById('send-btn').addEventListener('click', () => {
44
+ const message = document.getElementById('input').value.trim();
45
+ if (!message) return;
46
+ appendMessage('🟒 You: ' + message);
47
+ socket.emit('command', { userId, message });
48
+ document.getElementById('input').value = '';
 
 
 
 
 
49
  });
50
 
51
+ socket.on('message', (msg) => {
52
+ // If it's JSON for space usage, parse and format
53
+ try {
54
+ const obj = JSON.parse(msg);
55
+ if (obj.type === 'spaceUsage') {
56
+ appendMessage(`πŸ“¦ Storage Used: ${obj.usage}`);
57
+ return;
58
+ }
59
+ } catch {}
60
+ appendMessage('πŸ”΅ ' + msg);
61
  });
62
 
63
+ // Admin: Get all users
64
+ document.getElementById('get-users-btn').addEventListener('click', () => {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  socket.emit('adminGetUsers');
66
+ });
 
67
  socket.on('adminUserList', (data) => {
68
+ const container = document.getElementById('user-list');
69
  container.innerHTML = '';
 
 
 
 
70
  data.users.forEach((u) => {
71
+ const div = document.createElement('div');
72
+ div.innerText = `${u.username} (${u.id}) - Admin: ${u.isAdmin ? 'Yes' : 'No'}`;
73
+ container.appendChild(div);
 
 
 
 
 
 
 
 
74
  });
75
  });
76
 
77
+ // Admin: Get banned users
78
+ document.getElementById('get-banned-btn').addEventListener('click', () => {
79
+ socket.emit('adminGetBanned');
 
 
 
 
 
 
 
 
 
 
 
 
80
  });
81
+ socket.on('adminBannedList', (banned) => {
82
+ const container = document.getElementById('banned-list');
83
+ container.innerHTML = '';
84
+ banned.forEach((id) => {
85
+ const div = document.createElement('div');
86
+ div.innerText = id;
87
+ container.appendChild(div);
88
+ });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
  });
90
 
91
+ // Keep-alive ping every 10s
92
+ function startKeepAlive() {
93
+ setInterval(() => {
94
+ socket.emit('ping');
95
+ }, 10000);
96
+ }