reaper-arcade-hub 1.0.2 → 1.0.3

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/index.html CHANGED
@@ -659,6 +659,26 @@
659
659
  <!-- SUBTAB 2: PREFERENCES & AUDIO -->
660
660
  <div id="st-content-prefs" style="display: none;">
661
661
  <div style="display: flex; flex-direction: column; gap: 1.2rem;">
662
+
663
+ <!-- Auto about:blank toggle -->
664
+ <div style="background: #040e1e; border: 1px solid var(--blue-border); padding: 1rem 1.25rem; border-radius: 8px; display: flex; justify-content: space-between; align-items: center;">
665
+ <div>
666
+ <strong style="color: #fff; font-size: 0.95rem;">🌐 Auto-Cloak in about:blank on Visit</strong>
667
+ <p style="color: #88aacc; font-size: 0.8rem;">Automatically opens Reaper Hub in an undetectable about:blank tab every time you visit.</p>
668
+ </div>
669
+ <input type="checkbox" id="auto-aboutblank-toggle" style="width: 22px; height: 22px; cursor: pointer; accent-color: #00d2ff;" onchange="app.toggleAutoAboutBlank(this.checked)">
670
+ </div>
671
+
672
+ <!-- Launch in about:blank button -->
673
+ <div style="background: #040e1e; border: 1px solid var(--blue-border); padding: 1rem 1.25rem; border-radius: 8px; display: flex; justify-content: space-between; align-items: center;">
674
+ <div>
675
+ <strong style="color: #00d2ff; font-size: 0.95rem;">🚀 Launch Site in about:blank Tab</strong>
676
+ <p style="color: #88aacc; font-size: 0.8rem;">Spawn this entire portal inside a clean Google Classroom disguised about:blank window.</p>
677
+ </div>
678
+ <button class="btn-primary" onclick="app.openSiteAboutBlank()" style="font-size: 0.82rem; padding: 0.5rem 1.2rem;">LAUNCH CLOAK</button>
679
+ </div>
680
+
681
+ <!-- SFX toggle -->
662
682
  <div style="background: #040e1e; border: 1px solid var(--blue-border); padding: 1rem 1.25rem; border-radius: 8px; display: flex; justify-content: space-between; align-items: center;">
663
683
  <div>
664
684
  <strong style="color: #fff; font-size: 0.95rem;">🔊 Sci-Fi Synthesizer Sound FX</strong>
package/js/app.js CHANGED
@@ -179,6 +179,18 @@ class ReaperHubApp {
179
179
 
180
180
  this.syncPlaytimeToDB();
181
181
 
182
+ // 10. Auto about:blank Cloak on Visit Check
183
+ const isAutoAboutBlank = localStorage.getItem('reaper_auto_about_blank') === 'true';
184
+ const autoBlankToggle = document.getElementById('auto-aboutblank-toggle');
185
+ if (autoBlankToggle) autoBlankToggle.checked = isAutoAboutBlank;
186
+
187
+ if (isAutoAboutBlank && window.self === window.top && !window.location.protocol.includes('about:')) {
188
+ if (sessionStorage.getItem('reaper_cloaked_session') !== 'true') {
189
+ sessionStorage.setItem('reaper_cloaked_session', 'true');
190
+ this.openSiteAboutBlank();
191
+ }
192
+ }
193
+
182
194
  console.log(`[REAPER HUB] System Online. Role: ${this.currentUser.rank.toUpperCase()}`);
183
195
  }
184
196
 
@@ -1525,55 +1537,96 @@ class ReaperHubApp {
1525
1537
  async openGameAboutBlank() {
1526
1538
  if (!this.currentGame) return;
1527
1539
  const filename = this.currentGame.url.split('/').pop();
1540
+ const gameName = this.currentGame.name;
1541
+ const siteUrl = window.location.href;
1528
1542
  const win = window.open('about:blank', '_blank');
1529
1543
  if (win) {
1530
1544
  const doc = win.document;
1531
- doc.title = "Google Classroom";
1532
- const link = doc.createElement('link');
1533
- link.rel = 'icon';
1534
- link.href = 'https://ssl.gstatic.com/classroom/favicon.png';
1535
- doc.head.appendChild(link);
1536
-
1537
- const frame = doc.createElement('iframe');
1538
- frame.style.border = 'none';
1539
- frame.style.width = '100vw';
1540
- frame.style.height = '100vh';
1541
- frame.style.margin = '0';
1542
- frame.style.position = 'fixed';
1543
- frame.style.top = '0';
1544
- frame.style.left = '0';
1545
- frame.allow = 'autoplay; fullscreen; gamepad';
1545
+ doc.title = "Home - Google Classroom";
1546
1546
 
1547
+ let gameHtml = '';
1547
1548
  try {
1548
1549
  const res = await fetch(`https://raw.githubusercontent.com/gn-math/html/main/${filename}`);
1549
1550
  if (res.ok) {
1550
- let html = await res.text();
1551
- if (html && html.length > 50) {
1552
- html = html.replace(/https?:\/\/cdn\.jsdelivr\.net\/gh\//g, 'https://fastly.jsdelivr.net/gh/');
1553
- html = html.replace(/https?:\/\/cdn\.jsdelivr\.net\/npm\//g, 'https://fastly.jsdelivr.net/npm/');
1554
- frame.srcdoc = html;
1555
- } else {
1556
- frame.src = `https://fastly.jsdelivr.net/gh/gn-math/html@main/${filename}`;
1551
+ gameHtml = await res.text();
1552
+ if (gameHtml && gameHtml.length > 50) {
1553
+ gameHtml = gameHtml.replace(/https?:\/\/cdn\.jsdelivr\.net\/gh\//g, 'https://fastly.jsdelivr.net/gh/');
1554
+ gameHtml = gameHtml.replace(/https?:\/\/cdn\.jsdelivr\.net\/npm\//g, 'https://fastly.jsdelivr.net/npm/');
1557
1555
  }
1558
- } else {
1559
- frame.src = `https://fastly.jsdelivr.net/gh/gn-math/html@main/${filename}`;
1560
1556
  }
1561
- } catch (e) {
1562
- frame.src = `https://fastly.jsdelivr.net/gh/gn-math/html@main/${filename}`;
1557
+ } catch (e) {}
1558
+
1559
+ doc.open();
1560
+ doc.write(`
1561
+ <!DOCTYPE html>
1562
+ <html>
1563
+ <head>
1564
+ <title>Home - Google Classroom</title>
1565
+ <link rel="icon" href="https://ssl.gstatic.com/classroom/favicon.png">
1566
+ <style>
1567
+ * { margin: 0; padding: 0; box-sizing: border-box; }
1568
+ body { background: #000; overflow: hidden; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }
1569
+ #game-frame { width: 100vw; height: 100vh; border: none; position: fixed; top: 0; left: 0; z-index: 1; }
1570
+ .reaper-bar {
1571
+ position: fixed; top: 12px; left: 14px; z-index: 9999;
1572
+ display: flex; gap: 8px; align-items: center;
1573
+ background: rgba(3, 8, 18, 0.88); backdrop-filter: blur(8px);
1574
+ border: 1.5px solid rgba(0, 136, 255, 0.4); border-radius: 8px; padding: 6px 12px;
1575
+ box-shadow: 0 4px 20px rgba(0,0,0,0.7);
1576
+ opacity: 0.85; transition: opacity 0.2s ease, border-color 0.2s ease;
1577
+ }
1578
+ .reaper-bar:hover { opacity: 1; border-color: #00d2ff; }
1579
+ .btn-action {
1580
+ background: #041022; color: #00d2ff; border: 1px solid rgba(0, 136, 255, 0.4);
1581
+ padding: 5px 12px; border-radius: 6px; font-size: 11px; font-weight: 800;
1582
+ cursor: pointer; text-decoration: none; display: inline-flex; align-items: center; gap: 4px;
1583
+ transition: all 0.2s ease; font-family: inherit;
1584
+ }
1585
+ .btn-action:hover { background: #0088ff; color: #fff; box-shadow: 0 0 10px rgba(0,136,255,0.6); }
1586
+ .reaper-watermark {
1587
+ position: fixed; bottom: 10px; right: 14px; z-index: 9999;
1588
+ font-family: serif; font-weight: 900; font-size: 13px; letter-spacing: 0.12em;
1589
+ color: rgba(255, 255, 255, 0.35); text-shadow: 0 0 10px rgba(0, 136, 255, 0.6);
1590
+ pointer-events: none; user-select: none;
1591
+ }
1592
+ </style>
1593
+ <script>
1594
+ // Client-Side Ad & Pop-up Blocker
1595
+ window.open = function() { console.log('[REAPER SHIELD] Ad pop-up blocked'); return null; };
1596
+ <\/script>
1597
+ </head>
1598
+ <body>
1599
+ <div class="reaper-bar">
1600
+ <a href="${siteUrl}" class="btn-action" title="Return to Reaper Hub Portal">⚡ BACK TO SITE</a>
1601
+ <button onclick="document.getElementById('game-frame').requestFullscreen()" class="btn-action">⛶ FULLSCREEN</button>
1602
+ <button onclick="document.getElementById('game-frame').contentWindow.location.reload()" class="btn-action">🔄 RELOAD</button>
1603
+ </div>
1604
+ <div class="reaper-watermark">REAPER HUB</div>
1605
+ <iframe id="game-frame" allow="autoplay; fullscreen; gamepad" ${gameHtml ? '' : `src="https://fastly.jsdelivr.net/gh/gn-math/html@main/${filename}"`}></iframe>
1606
+ </body>
1607
+ </html>
1608
+ `);
1609
+ doc.close();
1610
+
1611
+ if (gameHtml) {
1612
+ const f = doc.getElementById('game-frame');
1613
+ if (f) f.srcdoc = gameHtml;
1563
1614
  }
1564
1615
 
1565
- doc.body.style.margin = '0';
1566
- doc.body.style.overflow = 'hidden';
1567
- doc.body.appendChild(frame);
1568
- this.showToast("Game launched in about:blank tab.");
1616
+ this.showToast("Game opened in about:blank tab with watermark & return controls.");
1569
1617
  }
1570
1618
  }
1571
1619
 
1620
+ toggleAutoAboutBlank(enabled) {
1621
+ localStorage.setItem('reaper_auto_about_blank', enabled ? 'true' : 'false');
1622
+ this.showToast(enabled ? "Auto about:blank cloak enabled on every visit." : "Auto about:blank disabled.");
1623
+ }
1624
+
1572
1625
  openSiteAboutBlank() {
1573
1626
  const win = window.open('about:blank', '_blank');
1574
1627
  if (win) {
1575
1628
  const doc = win.document;
1576
- doc.title = "Classes";
1629
+ doc.title = "Home - Google Classroom";
1577
1630
  const link = doc.createElement('link');
1578
1631
  link.rel = 'icon';
1579
1632
  link.href = 'https://ssl.gstatic.com/classroom/favicon.png';
@@ -217,6 +217,15 @@
217
217
  count++;
218
218
  }
219
219
  }
220
+
221
+ // Kill client-side third-party ad script injections & tracking pop-up tags
222
+ const adNodes = document.querySelectorAll('script[src*="googlesyndication"], script[src*="doubleclick"], script[src*="adnxs"], script[src*="monetag"], script[src*="popcash"], script[src*="propellerads"], div[class*="ad-banner" i], div[id*="ad-container" i]');
223
+ for (let i = 0; i < adNodes.length; i++) {
224
+ if (adNodes[i] && adNodes[i].parentNode) {
225
+ adNodes[i].parentNode.removeChild(adNodes[i]);
226
+ count++;
227
+ }
228
+ }
220
229
  } catch (e) {}
221
230
 
222
231
  this.blockedCount += count;
package/main/index.html CHANGED
@@ -659,6 +659,26 @@
659
659
  <!-- SUBTAB 2: PREFERENCES & AUDIO -->
660
660
  <div id="st-content-prefs" style="display: none;">
661
661
  <div style="display: flex; flex-direction: column; gap: 1.2rem;">
662
+
663
+ <!-- Auto about:blank toggle -->
664
+ <div style="background: #040e1e; border: 1px solid var(--blue-border); padding: 1rem 1.25rem; border-radius: 8px; display: flex; justify-content: space-between; align-items: center;">
665
+ <div>
666
+ <strong style="color: #fff; font-size: 0.95rem;">🌐 Auto-Cloak in about:blank on Visit</strong>
667
+ <p style="color: #88aacc; font-size: 0.8rem;">Automatically opens Reaper Hub in an undetectable about:blank tab every time you visit.</p>
668
+ </div>
669
+ <input type="checkbox" id="auto-aboutblank-toggle" style="width: 22px; height: 22px; cursor: pointer; accent-color: #00d2ff;" onchange="app.toggleAutoAboutBlank(this.checked)">
670
+ </div>
671
+
672
+ <!-- Launch in about:blank button -->
673
+ <div style="background: #040e1e; border: 1px solid var(--blue-border); padding: 1rem 1.25rem; border-radius: 8px; display: flex; justify-content: space-between; align-items: center;">
674
+ <div>
675
+ <strong style="color: #00d2ff; font-size: 0.95rem;">🚀 Launch Site in about:blank Tab</strong>
676
+ <p style="color: #88aacc; font-size: 0.8rem;">Spawn this entire portal inside a clean Google Classroom disguised about:blank window.</p>
677
+ </div>
678
+ <button class="btn-primary" onclick="app.openSiteAboutBlank()" style="font-size: 0.82rem; padding: 0.5rem 1.2rem;">LAUNCH CLOAK</button>
679
+ </div>
680
+
681
+ <!-- SFX toggle -->
662
682
  <div style="background: #040e1e; border: 1px solid var(--blue-border); padding: 1rem 1.25rem; border-radius: 8px; display: flex; justify-content: space-between; align-items: center;">
663
683
  <div>
664
684
  <strong style="color: #fff; font-size: 0.95rem;">🔊 Sci-Fi Synthesizer Sound FX</strong>
package/main/js/app.js CHANGED
@@ -179,6 +179,18 @@ class ReaperHubApp {
179
179
 
180
180
  this.syncPlaytimeToDB();
181
181
 
182
+ // 10. Auto about:blank Cloak on Visit Check
183
+ const isAutoAboutBlank = localStorage.getItem('reaper_auto_about_blank') === 'true';
184
+ const autoBlankToggle = document.getElementById('auto-aboutblank-toggle');
185
+ if (autoBlankToggle) autoBlankToggle.checked = isAutoAboutBlank;
186
+
187
+ if (isAutoAboutBlank && window.self === window.top && !window.location.protocol.includes('about:')) {
188
+ if (sessionStorage.getItem('reaper_cloaked_session') !== 'true') {
189
+ sessionStorage.setItem('reaper_cloaked_session', 'true');
190
+ this.openSiteAboutBlank();
191
+ }
192
+ }
193
+
182
194
  console.log(`[REAPER HUB] System Online. Role: ${this.currentUser.rank.toUpperCase()}`);
183
195
  }
184
196
 
@@ -1525,55 +1537,96 @@ class ReaperHubApp {
1525
1537
  async openGameAboutBlank() {
1526
1538
  if (!this.currentGame) return;
1527
1539
  const filename = this.currentGame.url.split('/').pop();
1540
+ const gameName = this.currentGame.name;
1541
+ const siteUrl = window.location.href;
1528
1542
  const win = window.open('about:blank', '_blank');
1529
1543
  if (win) {
1530
1544
  const doc = win.document;
1531
- doc.title = "Google Classroom";
1532
- const link = doc.createElement('link');
1533
- link.rel = 'icon';
1534
- link.href = 'https://ssl.gstatic.com/classroom/favicon.png';
1535
- doc.head.appendChild(link);
1536
-
1537
- const frame = doc.createElement('iframe');
1538
- frame.style.border = 'none';
1539
- frame.style.width = '100vw';
1540
- frame.style.height = '100vh';
1541
- frame.style.margin = '0';
1542
- frame.style.position = 'fixed';
1543
- frame.style.top = '0';
1544
- frame.style.left = '0';
1545
- frame.allow = 'autoplay; fullscreen; gamepad';
1545
+ doc.title = "Home - Google Classroom";
1546
1546
 
1547
+ let gameHtml = '';
1547
1548
  try {
1548
1549
  const res = await fetch(`https://raw.githubusercontent.com/gn-math/html/main/${filename}`);
1549
1550
  if (res.ok) {
1550
- let html = await res.text();
1551
- if (html && html.length > 50) {
1552
- html = html.replace(/https?:\/\/cdn\.jsdelivr\.net\/gh\//g, 'https://fastly.jsdelivr.net/gh/');
1553
- html = html.replace(/https?:\/\/cdn\.jsdelivr\.net\/npm\//g, 'https://fastly.jsdelivr.net/npm/');
1554
- frame.srcdoc = html;
1555
- } else {
1556
- frame.src = `https://fastly.jsdelivr.net/gh/gn-math/html@main/${filename}`;
1551
+ gameHtml = await res.text();
1552
+ if (gameHtml && gameHtml.length > 50) {
1553
+ gameHtml = gameHtml.replace(/https?:\/\/cdn\.jsdelivr\.net\/gh\//g, 'https://fastly.jsdelivr.net/gh/');
1554
+ gameHtml = gameHtml.replace(/https?:\/\/cdn\.jsdelivr\.net\/npm\//g, 'https://fastly.jsdelivr.net/npm/');
1557
1555
  }
1558
- } else {
1559
- frame.src = `https://fastly.jsdelivr.net/gh/gn-math/html@main/${filename}`;
1560
1556
  }
1561
- } catch (e) {
1562
- frame.src = `https://fastly.jsdelivr.net/gh/gn-math/html@main/${filename}`;
1557
+ } catch (e) {}
1558
+
1559
+ doc.open();
1560
+ doc.write(`
1561
+ <!DOCTYPE html>
1562
+ <html>
1563
+ <head>
1564
+ <title>Home - Google Classroom</title>
1565
+ <link rel="icon" href="https://ssl.gstatic.com/classroom/favicon.png">
1566
+ <style>
1567
+ * { margin: 0; padding: 0; box-sizing: border-box; }
1568
+ body { background: #000; overflow: hidden; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }
1569
+ #game-frame { width: 100vw; height: 100vh; border: none; position: fixed; top: 0; left: 0; z-index: 1; }
1570
+ .reaper-bar {
1571
+ position: fixed; top: 12px; left: 14px; z-index: 9999;
1572
+ display: flex; gap: 8px; align-items: center;
1573
+ background: rgba(3, 8, 18, 0.88); backdrop-filter: blur(8px);
1574
+ border: 1.5px solid rgba(0, 136, 255, 0.4); border-radius: 8px; padding: 6px 12px;
1575
+ box-shadow: 0 4px 20px rgba(0,0,0,0.7);
1576
+ opacity: 0.85; transition: opacity 0.2s ease, border-color 0.2s ease;
1577
+ }
1578
+ .reaper-bar:hover { opacity: 1; border-color: #00d2ff; }
1579
+ .btn-action {
1580
+ background: #041022; color: #00d2ff; border: 1px solid rgba(0, 136, 255, 0.4);
1581
+ padding: 5px 12px; border-radius: 6px; font-size: 11px; font-weight: 800;
1582
+ cursor: pointer; text-decoration: none; display: inline-flex; align-items: center; gap: 4px;
1583
+ transition: all 0.2s ease; font-family: inherit;
1584
+ }
1585
+ .btn-action:hover { background: #0088ff; color: #fff; box-shadow: 0 0 10px rgba(0,136,255,0.6); }
1586
+ .reaper-watermark {
1587
+ position: fixed; bottom: 10px; right: 14px; z-index: 9999;
1588
+ font-family: serif; font-weight: 900; font-size: 13px; letter-spacing: 0.12em;
1589
+ color: rgba(255, 255, 255, 0.35); text-shadow: 0 0 10px rgba(0, 136, 255, 0.6);
1590
+ pointer-events: none; user-select: none;
1591
+ }
1592
+ </style>
1593
+ <script>
1594
+ // Client-Side Ad & Pop-up Blocker
1595
+ window.open = function() { console.log('[REAPER SHIELD] Ad pop-up blocked'); return null; };
1596
+ <\/script>
1597
+ </head>
1598
+ <body>
1599
+ <div class="reaper-bar">
1600
+ <a href="${siteUrl}" class="btn-action" title="Return to Reaper Hub Portal">⚡ BACK TO SITE</a>
1601
+ <button onclick="document.getElementById('game-frame').requestFullscreen()" class="btn-action">⛶ FULLSCREEN</button>
1602
+ <button onclick="document.getElementById('game-frame').contentWindow.location.reload()" class="btn-action">🔄 RELOAD</button>
1603
+ </div>
1604
+ <div class="reaper-watermark">REAPER HUB</div>
1605
+ <iframe id="game-frame" allow="autoplay; fullscreen; gamepad" ${gameHtml ? '' : `src="https://fastly.jsdelivr.net/gh/gn-math/html@main/${filename}"`}></iframe>
1606
+ </body>
1607
+ </html>
1608
+ `);
1609
+ doc.close();
1610
+
1611
+ if (gameHtml) {
1612
+ const f = doc.getElementById('game-frame');
1613
+ if (f) f.srcdoc = gameHtml;
1563
1614
  }
1564
1615
 
1565
- doc.body.style.margin = '0';
1566
- doc.body.style.overflow = 'hidden';
1567
- doc.body.appendChild(frame);
1568
- this.showToast("Game launched in about:blank tab.");
1616
+ this.showToast("Game opened in about:blank tab with watermark & return controls.");
1569
1617
  }
1570
1618
  }
1571
1619
 
1620
+ toggleAutoAboutBlank(enabled) {
1621
+ localStorage.setItem('reaper_auto_about_blank', enabled ? 'true' : 'false');
1622
+ this.showToast(enabled ? "Auto about:blank cloak enabled on every visit." : "Auto about:blank disabled.");
1623
+ }
1624
+
1572
1625
  openSiteAboutBlank() {
1573
1626
  const win = window.open('about:blank', '_blank');
1574
1627
  if (win) {
1575
1628
  const doc = win.document;
1576
- doc.title = "Classes";
1629
+ doc.title = "Home - Google Classroom";
1577
1630
  const link = doc.createElement('link');
1578
1631
  link.rel = 'icon';
1579
1632
  link.href = 'https://ssl.gstatic.com/classroom/favicon.png';
@@ -217,6 +217,15 @@
217
217
  count++;
218
218
  }
219
219
  }
220
+
221
+ // Kill client-side third-party ad script injections & tracking pop-up tags
222
+ const adNodes = document.querySelectorAll('script[src*="googlesyndication"], script[src*="doubleclick"], script[src*="adnxs"], script[src*="monetag"], script[src*="popcash"], script[src*="propellerads"], div[class*="ad-banner" i], div[id*="ad-container" i]');
223
+ for (let i = 0; i < adNodes.length; i++) {
224
+ if (adNodes[i] && adNodes[i].parentNode) {
225
+ adNodes[i].parentNode.removeChild(adNodes[i]);
226
+ count++;
227
+ }
228
+ }
220
229
  } catch (e) {}
221
230
 
222
231
  this.blockedCount += count;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reaper-arcade-hub",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "description": "Reaper Hub - 788 High-Speed HTML5 Games, Realtime Chat, Playtime Leaderboard & Verification Gateway",
5
5
  "main": "main/index.html",
6
6
  "unpkg": "main/index.html",
@@ -217,6 +217,15 @@
217
217
  count++;
218
218
  }
219
219
  }
220
+
221
+ // Kill client-side third-party ad script injections & tracking pop-up tags
222
+ const adNodes = document.querySelectorAll('script[src*="googlesyndication"], script[src*="doubleclick"], script[src*="adnxs"], script[src*="monetag"], script[src*="popcash"], script[src*="propellerads"], div[class*="ad-banner" i], div[id*="ad-container" i]');
223
+ for (let i = 0; i < adNodes.length; i++) {
224
+ if (adNodes[i] && adNodes[i].parentNode) {
225
+ adNodes[i].parentNode.removeChild(adNodes[i]);
226
+ count++;
227
+ }
228
+ }
220
229
  } catch (e) {}
221
230
 
222
231
  this.blockedCount += count;