reaper-arcade-hub 1.1.1 → 1.1.2

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/js/app.js CHANGED
@@ -105,14 +105,21 @@ class ReaperHubApp {
105
105
  window.reaperFirebase.listenBannedUsers((bannedList) => {
106
106
  this.bannedUsers = bannedList || [];
107
107
  this.renderBannedUsersList();
108
- if (this.currentUser.rank !== 'owner' && this.bannedUsers.includes(this.currentUser.username)) {
108
+ const currentNameLower = (this.currentUser.username || '').toLowerCase();
109
+ const isBannedOnServer = this.bannedUsers.some(u => u.toLowerCase() === currentNameLower);
110
+
111
+ if (this.currentUser.rank !== 'owner' && isBannedOnServer) {
109
112
  this.currentUser.isBanned = true;
110
113
  localStorage.setItem('reaper_is_banned', 'true');
111
- localStorage.removeItem('reaper_verified_token');
112
- localStorage.removeItem('reaper_token_expires');
113
- localStorage.removeItem('reaper_gateway_verified');
114
- localStorage.removeItem('reaper_playtime_' + this.currentUser.username);
115
114
  this.renderBanScreen("Your account has been permanently blacklisted and all recorded progress has been purged.");
115
+ } else {
116
+ // If unbanned!
117
+ if (this.currentUser.isBanned || document.getElementById('ban-screen-overlay')) {
118
+ this.currentUser.isBanned = false;
119
+ localStorage.removeItem('reaper_is_banned');
120
+ this.removeBanScreen();
121
+ this.showToast("Your account was UNBANNED by an Administrator!");
122
+ }
116
123
  }
117
124
  });
118
125
  window.reaperFirebase.listenShutdownMode((isShutdown) => {
@@ -2122,7 +2129,17 @@ class ReaperHubApp {
2122
2129
  }
2123
2130
 
2124
2131
  renderBanScreen(customReason) {
2125
- document.body.innerHTML = `
2132
+ let overlay = document.getElementById('ban-screen-overlay');
2133
+ if (!overlay) {
2134
+ overlay = document.createElement('div');
2135
+ overlay.id = 'ban-screen-overlay';
2136
+ overlay.style.position = 'fixed';
2137
+ overlay.style.inset = '0';
2138
+ overlay.style.zIndex = '9999999';
2139
+ overlay.style.background = '#000';
2140
+ document.body.appendChild(overlay);
2141
+ }
2142
+ overlay.innerHTML = `
2126
2143
  <div style="display: flex; height: 100vh; width: 100vw; background: #000; color: #ff2a2a; font-family: var(--font-mono); align-items: center; justify-content: center; text-align: center; padding: 2rem;">
2127
2144
  <div style="border: 2px solid #ff2a2a; padding: 3rem 2rem; max-width: 540px; background: #0c0202; border-radius: 10px; box-shadow: 0 0 40px rgba(255, 42, 42, 0.4);">
2128
2145
  <h1 style="font-size: 2.2rem; margin-bottom: 1rem; color: #ff3333;">[PERMANENT BAN]</h1>
@@ -2135,6 +2152,14 @@ class ReaperHubApp {
2135
2152
  </div>
2136
2153
  </div>
2137
2154
  `;
2155
+ overlay.style.display = 'block';
2156
+ }
2157
+
2158
+ removeBanScreen() {
2159
+ const overlay = document.getElementById('ban-screen-overlay');
2160
+ if (overlay) {
2161
+ overlay.remove();
2162
+ }
2138
2163
  }
2139
2164
 
2140
2165
  renderPermanentShutdownScreen() {
@@ -2345,12 +2370,21 @@ class ReaperHubApp {
2345
2370
  }
2346
2371
 
2347
2372
  async unbanUser(username) {
2348
- this.bannedUsers = this.bannedUsers.filter(u => u !== username);
2373
+ if (!username) return;
2374
+ const cleanUser = username.trim();
2375
+ this.bannedUsers = this.bannedUsers.filter(u => u.toLowerCase() !== cleanUser.toLowerCase());
2349
2376
  localStorage.setItem('reaper_banned_users', JSON.stringify(this.bannedUsers));
2377
+
2378
+ if ((this.currentUser.username || '').toLowerCase() === cleanUser.toLowerCase()) {
2379
+ this.currentUser.isBanned = false;
2380
+ localStorage.removeItem('reaper_is_banned');
2381
+ this.removeBanScreen();
2382
+ }
2383
+
2350
2384
  if (window.reaperFirebase) {
2351
- await window.reaperFirebase.unbanUser(username);
2385
+ await window.reaperFirebase.unbanUser(cleanUser);
2352
2386
  }
2353
- this.showToast(`User ${username} Unbanned.`);
2387
+ this.showToast(`User ${cleanUser} UNBANNED.`);
2354
2388
  this.renderBannedUsersList();
2355
2389
  }
2356
2390
 
@@ -257,16 +257,17 @@ class FirebaseService {
257
257
 
258
258
  async banUser(username) {
259
259
  if (!username || username === 'owner') return;
260
+ const cleanUser = username.trim();
260
261
 
261
262
  if (this.db) {
262
263
  try {
263
- await this.db.ref(`reaperBannedUsers/${username}`).set(true);
264
- await this.db.ref(`reaperPlaytime/${username}`).remove();
264
+ await this.db.ref(`reaperBannedUsers/${cleanUser}`).set(true);
265
+ await this.db.ref(`reaperPlaytime/${cleanUser}`).remove();
265
266
  const chatSnap = await this.db.ref('reaperChat').once('value');
266
267
  if (chatSnap.exists()) {
267
268
  const chats = chatSnap.val();
268
269
  for (const msgId of Object.keys(chats)) {
269
- if (chats[msgId].username === username) {
270
+ if (chats[msgId].username && chats[msgId].username.toLowerCase() === cleanUser.toLowerCase()) {
270
271
  await this.db.ref(`reaperChat/${msgId}`).remove();
271
272
  }
272
273
  }
@@ -277,21 +278,34 @@ class FirebaseService {
277
278
  }
278
279
 
279
280
  const localBans = JSON.parse(localStorage.getItem('reaper_banned_users') || '[]');
280
- if (!localBans.includes(username)) {
281
- localBans.push(username);
281
+ if (!localBans.some(u => u.toLowerCase() === cleanUser.toLowerCase())) {
282
+ localBans.push(cleanUser);
282
283
  localStorage.setItem('reaper_banned_users', JSON.stringify(localBans));
283
284
  }
284
285
  }
285
286
 
286
287
  async unbanUser(username) {
288
+ if (!username) return;
289
+ const cleanUser = username.trim();
290
+
287
291
  if (this.db) {
288
292
  try {
289
- await this.db.ref(`reaperBannedUsers/${username}`).remove();
293
+ await this.db.ref(`reaperBannedUsers/${cleanUser}`).remove();
294
+ const snap = await this.db.ref('reaperBannedUsers').once('value');
295
+ if (snap.exists()) {
296
+ const bans = snap.val();
297
+ for (const k of Object.keys(bans)) {
298
+ if (k.toLowerCase() === cleanUser.toLowerCase()) {
299
+ await this.db.ref(`reaperBannedUsers/${k}`).remove();
300
+ }
301
+ }
302
+ }
290
303
  } catch (e) {
291
304
  console.warn("Error unbanning user on Firebase:", e);
292
305
  }
293
306
  }
294
- const localBans = JSON.parse(localStorage.getItem('reaper_banned_users') || '[]').filter(u => u !== username);
307
+
308
+ const localBans = JSON.parse(localStorage.getItem('reaper_banned_users') || '[]').filter(u => u.toLowerCase() !== cleanUser.toLowerCase());
295
309
  localStorage.setItem('reaper_banned_users', JSON.stringify(localBans));
296
310
  }
297
311
 
package/main/js/app.js CHANGED
@@ -105,14 +105,21 @@ class ReaperHubApp {
105
105
  window.reaperFirebase.listenBannedUsers((bannedList) => {
106
106
  this.bannedUsers = bannedList || [];
107
107
  this.renderBannedUsersList();
108
- if (this.currentUser.rank !== 'owner' && this.bannedUsers.includes(this.currentUser.username)) {
108
+ const currentNameLower = (this.currentUser.username || '').toLowerCase();
109
+ const isBannedOnServer = this.bannedUsers.some(u => u.toLowerCase() === currentNameLower);
110
+
111
+ if (this.currentUser.rank !== 'owner' && isBannedOnServer) {
109
112
  this.currentUser.isBanned = true;
110
113
  localStorage.setItem('reaper_is_banned', 'true');
111
- localStorage.removeItem('reaper_verified_token');
112
- localStorage.removeItem('reaper_token_expires');
113
- localStorage.removeItem('reaper_gateway_verified');
114
- localStorage.removeItem('reaper_playtime_' + this.currentUser.username);
115
114
  this.renderBanScreen("Your account has been permanently blacklisted and all recorded progress has been purged.");
115
+ } else {
116
+ // If unbanned!
117
+ if (this.currentUser.isBanned || document.getElementById('ban-screen-overlay')) {
118
+ this.currentUser.isBanned = false;
119
+ localStorage.removeItem('reaper_is_banned');
120
+ this.removeBanScreen();
121
+ this.showToast("Your account was UNBANNED by an Administrator!");
122
+ }
116
123
  }
117
124
  });
118
125
  window.reaperFirebase.listenShutdownMode((isShutdown) => {
@@ -2122,7 +2129,17 @@ class ReaperHubApp {
2122
2129
  }
2123
2130
 
2124
2131
  renderBanScreen(customReason) {
2125
- document.body.innerHTML = `
2132
+ let overlay = document.getElementById('ban-screen-overlay');
2133
+ if (!overlay) {
2134
+ overlay = document.createElement('div');
2135
+ overlay.id = 'ban-screen-overlay';
2136
+ overlay.style.position = 'fixed';
2137
+ overlay.style.inset = '0';
2138
+ overlay.style.zIndex = '9999999';
2139
+ overlay.style.background = '#000';
2140
+ document.body.appendChild(overlay);
2141
+ }
2142
+ overlay.innerHTML = `
2126
2143
  <div style="display: flex; height: 100vh; width: 100vw; background: #000; color: #ff2a2a; font-family: var(--font-mono); align-items: center; justify-content: center; text-align: center; padding: 2rem;">
2127
2144
  <div style="border: 2px solid #ff2a2a; padding: 3rem 2rem; max-width: 540px; background: #0c0202; border-radius: 10px; box-shadow: 0 0 40px rgba(255, 42, 42, 0.4);">
2128
2145
  <h1 style="font-size: 2.2rem; margin-bottom: 1rem; color: #ff3333;">[PERMANENT BAN]</h1>
@@ -2135,6 +2152,14 @@ class ReaperHubApp {
2135
2152
  </div>
2136
2153
  </div>
2137
2154
  `;
2155
+ overlay.style.display = 'block';
2156
+ }
2157
+
2158
+ removeBanScreen() {
2159
+ const overlay = document.getElementById('ban-screen-overlay');
2160
+ if (overlay) {
2161
+ overlay.remove();
2162
+ }
2138
2163
  }
2139
2164
 
2140
2165
  renderPermanentShutdownScreen() {
@@ -2345,12 +2370,21 @@ class ReaperHubApp {
2345
2370
  }
2346
2371
 
2347
2372
  async unbanUser(username) {
2348
- this.bannedUsers = this.bannedUsers.filter(u => u !== username);
2373
+ if (!username) return;
2374
+ const cleanUser = username.trim();
2375
+ this.bannedUsers = this.bannedUsers.filter(u => u.toLowerCase() !== cleanUser.toLowerCase());
2349
2376
  localStorage.setItem('reaper_banned_users', JSON.stringify(this.bannedUsers));
2377
+
2378
+ if ((this.currentUser.username || '').toLowerCase() === cleanUser.toLowerCase()) {
2379
+ this.currentUser.isBanned = false;
2380
+ localStorage.removeItem('reaper_is_banned');
2381
+ this.removeBanScreen();
2382
+ }
2383
+
2350
2384
  if (window.reaperFirebase) {
2351
- await window.reaperFirebase.unbanUser(username);
2385
+ await window.reaperFirebase.unbanUser(cleanUser);
2352
2386
  }
2353
- this.showToast(`User ${username} Unbanned.`);
2387
+ this.showToast(`User ${cleanUser} UNBANNED.`);
2354
2388
  this.renderBannedUsersList();
2355
2389
  }
2356
2390
 
@@ -257,16 +257,17 @@ class FirebaseService {
257
257
 
258
258
  async banUser(username) {
259
259
  if (!username || username === 'owner') return;
260
+ const cleanUser = username.trim();
260
261
 
261
262
  if (this.db) {
262
263
  try {
263
- await this.db.ref(`reaperBannedUsers/${username}`).set(true);
264
- await this.db.ref(`reaperPlaytime/${username}`).remove();
264
+ await this.db.ref(`reaperBannedUsers/${cleanUser}`).set(true);
265
+ await this.db.ref(`reaperPlaytime/${cleanUser}`).remove();
265
266
  const chatSnap = await this.db.ref('reaperChat').once('value');
266
267
  if (chatSnap.exists()) {
267
268
  const chats = chatSnap.val();
268
269
  for (const msgId of Object.keys(chats)) {
269
- if (chats[msgId].username === username) {
270
+ if (chats[msgId].username && chats[msgId].username.toLowerCase() === cleanUser.toLowerCase()) {
270
271
  await this.db.ref(`reaperChat/${msgId}`).remove();
271
272
  }
272
273
  }
@@ -277,21 +278,34 @@ class FirebaseService {
277
278
  }
278
279
 
279
280
  const localBans = JSON.parse(localStorage.getItem('reaper_banned_users') || '[]');
280
- if (!localBans.includes(username)) {
281
- localBans.push(username);
281
+ if (!localBans.some(u => u.toLowerCase() === cleanUser.toLowerCase())) {
282
+ localBans.push(cleanUser);
282
283
  localStorage.setItem('reaper_banned_users', JSON.stringify(localBans));
283
284
  }
284
285
  }
285
286
 
286
287
  async unbanUser(username) {
288
+ if (!username) return;
289
+ const cleanUser = username.trim();
290
+
287
291
  if (this.db) {
288
292
  try {
289
- await this.db.ref(`reaperBannedUsers/${username}`).remove();
293
+ await this.db.ref(`reaperBannedUsers/${cleanUser}`).remove();
294
+ const snap = await this.db.ref('reaperBannedUsers').once('value');
295
+ if (snap.exists()) {
296
+ const bans = snap.val();
297
+ for (const k of Object.keys(bans)) {
298
+ if (k.toLowerCase() === cleanUser.toLowerCase()) {
299
+ await this.db.ref(`reaperBannedUsers/${k}`).remove();
300
+ }
301
+ }
302
+ }
290
303
  } catch (e) {
291
304
  console.warn("Error unbanning user on Firebase:", e);
292
305
  }
293
306
  }
294
- const localBans = JSON.parse(localStorage.getItem('reaper_banned_users') || '[]').filter(u => u !== username);
307
+
308
+ const localBans = JSON.parse(localStorage.getItem('reaper_banned_users') || '[]').filter(u => u.toLowerCase() !== cleanUser.toLowerCase());
295
309
  localStorage.setItem('reaper_banned_users', JSON.stringify(localBans));
296
310
  }
297
311
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "reaper-arcade-hub",
3
- "version": "1.1.1",
4
- "description": "Reaper Hub - 788 High-Speed HTML5 Games, AI Name Privacy Filter, Global Chat Deletion, Potato PC Performance Mode, Top Plays, Realtime Chat, Private DMs, Playtime Leaderboard & Verification Gateway",
3
+ "version": "1.1.2",
4
+ "description": "Reaper Hub - 788 High-Speed HTML5 Games, Instant Reactive Unban & Ban Engine, AI Name Privacy Filter, Global Chat Deletion, Potato PC Performance Mode, Top Plays, Realtime Chat, Private DMs, Playtime Leaderboard & Verification Gateway",
5
5
  "main": "main/index.html",
6
6
  "unpkg": "main/index.html",
7
7
  "jsdelivr": "main/index.html",
@@ -14,6 +14,7 @@
14
14
  "html5",
15
15
  "unblocked",
16
16
  "arcade",
17
+ "unban",
17
18
  "moderation",
18
19
  "privacy",
19
20
  "performance",
@@ -257,16 +257,17 @@ class FirebaseService {
257
257
 
258
258
  async banUser(username) {
259
259
  if (!username || username === 'owner') return;
260
+ const cleanUser = username.trim();
260
261
 
261
262
  if (this.db) {
262
263
  try {
263
- await this.db.ref(`reaperBannedUsers/${username}`).set(true);
264
- await this.db.ref(`reaperPlaytime/${username}`).remove();
264
+ await this.db.ref(`reaperBannedUsers/${cleanUser}`).set(true);
265
+ await this.db.ref(`reaperPlaytime/${cleanUser}`).remove();
265
266
  const chatSnap = await this.db.ref('reaperChat').once('value');
266
267
  if (chatSnap.exists()) {
267
268
  const chats = chatSnap.val();
268
269
  for (const msgId of Object.keys(chats)) {
269
- if (chats[msgId].username === username) {
270
+ if (chats[msgId].username && chats[msgId].username.toLowerCase() === cleanUser.toLowerCase()) {
270
271
  await this.db.ref(`reaperChat/${msgId}`).remove();
271
272
  }
272
273
  }
@@ -277,21 +278,34 @@ class FirebaseService {
277
278
  }
278
279
 
279
280
  const localBans = JSON.parse(localStorage.getItem('reaper_banned_users') || '[]');
280
- if (!localBans.includes(username)) {
281
- localBans.push(username);
281
+ if (!localBans.some(u => u.toLowerCase() === cleanUser.toLowerCase())) {
282
+ localBans.push(cleanUser);
282
283
  localStorage.setItem('reaper_banned_users', JSON.stringify(localBans));
283
284
  }
284
285
  }
285
286
 
286
287
  async unbanUser(username) {
288
+ if (!username) return;
289
+ const cleanUser = username.trim();
290
+
287
291
  if (this.db) {
288
292
  try {
289
- await this.db.ref(`reaperBannedUsers/${username}`).remove();
293
+ await this.db.ref(`reaperBannedUsers/${cleanUser}`).remove();
294
+ const snap = await this.db.ref('reaperBannedUsers').once('value');
295
+ if (snap.exists()) {
296
+ const bans = snap.val();
297
+ for (const k of Object.keys(bans)) {
298
+ if (k.toLowerCase() === cleanUser.toLowerCase()) {
299
+ await this.db.ref(`reaperBannedUsers/${k}`).remove();
300
+ }
301
+ }
302
+ }
290
303
  } catch (e) {
291
304
  console.warn("Error unbanning user on Firebase:", e);
292
305
  }
293
306
  }
294
- const localBans = JSON.parse(localStorage.getItem('reaper_banned_users') || '[]').filter(u => u !== username);
307
+
308
+ const localBans = JSON.parse(localStorage.getItem('reaper_banned_users') || '[]').filter(u => u.toLowerCase() !== cleanUser.toLowerCase());
295
309
  localStorage.setItem('reaper_banned_users', JSON.stringify(localBans));
296
310
  }
297
311