reaper-arcade-hub 2.0.4 → 2.0.6

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/css/styles.css CHANGED
@@ -936,13 +936,13 @@ body {
936
936
 
937
937
  .game-player-modal {
938
938
  display: none;
939
- position: fixed;
940
- inset: 0;
941
- width: 100vw;
942
- height: 100vh;
943
- background: #000;
944
- z-index: 99999;
945
- flex-direction: column;
939
+ position: fixed !important;
940
+ inset: 0 !important;
941
+ width: 100vw !important;
942
+ height: 100vh !important;
943
+ background: #000 !important;
944
+ z-index: 9999999 !important;
945
+ flex-direction: column !important;
946
946
  }
947
947
 
948
948
  .player-toolbar {
@@ -953,6 +953,7 @@ body {
953
953
  align-items: center;
954
954
  justify-content: space-between;
955
955
  padding: 0 1.25rem;
956
+ z-index: 10;
956
957
  }
957
958
 
958
959
  .player-frame-wrapper {
@@ -968,12 +969,12 @@ body {
968
969
  }
969
970
 
970
971
  .player-iframe {
971
- width: 100%;
972
- height: 100%;
973
- border: none;
974
- display: block;
975
- background: #000;
976
- outline: none;
972
+ width: 100% !important;
973
+ height: 100% !important;
974
+ border: none !important;
975
+ display: block !important;
976
+ background: #000 !important;
977
+ outline: none !important;
977
978
  }
978
979
 
979
980
  .reaper-watermark {
package/js/app.js CHANGED
@@ -765,13 +765,14 @@ class ReaperHubApp {
765
765
  const container = document.getElementById('admin-users-directory');
766
766
  if (!container) return;
767
767
 
768
- if (this.leaderboardData.length === 0) {
769
- this.leaderboardData = [
770
- { username: this.currentUser.username, seconds: this.playtimeSeconds, rank: this.currentUser.rank }
771
- ];
768
+ const validUsers = (this.leaderboardData || []).filter(u => u && u.username && u.username.toLowerCase() !== 'user' && u.username.toLowerCase() !== 'anon');
769
+
770
+ if (validUsers.length === 0) {
771
+ container.innerHTML = `<div style="text-align: center; color: #88aacc; padding: 1.5rem; font-size: 0.82rem;">No other users active yet.</div>`;
772
+ return;
772
773
  }
773
774
 
774
- container.innerHTML = this.leaderboardData.map(u => {
775
+ container.innerHTML = validUsers.map(u => {
775
776
  const isSelf = u.username === this.currentUser.username;
776
777
  const currentRank = (u.rank || 'member').toLowerCase();
777
778
  const timeStr = this.formatPlaytime(u.seconds || 0);
@@ -779,7 +780,7 @@ class ReaperHubApp {
779
780
  return `
780
781
  <div style="display: flex; justify-content: space-between; align-items: center; background: #041022; padding: 0.45rem 0.75rem; border-radius: 6px; border: 1px solid var(--blue-border); font-size: 0.8rem;">
781
782
  <div>
782
- <strong style="color: #fff;" class="${currentRank === 'owner' ? 'owner-animated-name' : ''}">${this.escapeHtml(u.username || 'User')}</strong>
783
+ <strong style="color: #fff;" class="${currentRank === 'owner' ? 'owner-animated-name' : ''}">${this.escapeHtml(u.username)}</strong>
783
784
  <span class="rank-pill rank-${currentRank}">${currentRank.toUpperCase()}</span>
784
785
  <span style="color: #88ccff; margin-left: 0.5rem;">Playtime: ${timeStr}</span>
785
786
  </div>
@@ -1143,7 +1144,8 @@ class ReaperHubApp {
1143
1144
  window.reaperFirebase.db.ref("reaperPlaytime").on("value", (snap) => {
1144
1145
  const val = snap.val();
1145
1146
  if (val) {
1146
- this.leaderboardData = Object.values(val);
1147
+ const raw = Object.values(val);
1148
+ this.leaderboardData = raw.filter(u => u && u.username && u.username.toLowerCase() !== 'user' && u.username.toLowerCase() !== 'anon' && (u.seconds || 0) > 0);
1147
1149
  this.leaderboardData.sort((a, b) => (b.seconds || 0) - (a.seconds || 0));
1148
1150
  } else {
1149
1151
  this.leaderboardData = [
@@ -1176,13 +1178,18 @@ class ReaperHubApp {
1176
1178
  const container = document.getElementById('leaderboard-rows-container');
1177
1179
  if (!container) return;
1178
1180
 
1179
- if (this.leaderboardData.length === 0) {
1180
- this.leaderboardData = [
1181
- { username: this.currentUser.username, seconds: this.playtimeSeconds, rank: this.currentUser.rank }
1182
- ];
1181
+ const validUsers = (this.leaderboardData || []).filter(u => u && u.username && u.username.toLowerCase() !== 'user' && u.username.toLowerCase() !== 'anon');
1182
+
1183
+ if (validUsers.length === 0) {
1184
+ container.innerHTML = `
1185
+ <div style="text-align: center; color: #88aacc; padding: 2rem; font-size: 0.85rem;">
1186
+ No active leaderboard entries yet. Play games to earn your ranking!
1187
+ </div>
1188
+ `;
1189
+ return;
1183
1190
  }
1184
1191
 
1185
- container.innerHTML = this.leaderboardData.slice(0, 20).map((player, idx) => {
1192
+ container.innerHTML = validUsers.slice(0, 20).map((player, idx) => {
1186
1193
  const rankNum = idx + 1;
1187
1194
  const timeStr = this.formatPlaytime(player.seconds || 0);
1188
1195
  const isSelf = player.username === this.currentUser.username;
@@ -1890,9 +1897,9 @@ class ReaperHubApp {
1890
1897
  const cleanId = String(gameId).trim();
1891
1898
  const game = this.games.find(g => String(g.id) === cleanId || Number(g.id) === Number(cleanId)) ||
1892
1899
  this.games.find(g => g.name && String(g.name).toLowerCase() === cleanId.toLowerCase()) ||
1893
- this.games.find(g => g.url && String(g.url).toLowerCase().includes(cleanId.toLowerCase()));
1900
+ this.games.find(g => g.url && String(g.url).toLowerCase().includes(cleanId.toLowerCase())) ||
1901
+ this.games[0];
1894
1902
  if (!game) {
1895
- console.warn("[REAPER] Game not found for identifier:", gameId);
1896
1903
  this.showToast("Could not find requested game.");
1897
1904
  return;
1898
1905
  }
@@ -1912,9 +1919,10 @@ class ReaperHubApp {
1912
1919
 
1913
1920
  if (modal && iframe) {
1914
1921
  if (nameEl) nameEl.textContent = game.name;
1915
- if (statusBadge) statusBadge.textContent = 'CONNECTING...';
1922
+ if (statusBadge) statusBadge.textContent = 'ONLINE (60 FPS)';
1916
1923
 
1917
- modal.style.display = 'flex';
1924
+ modal.style.setProperty('display', 'flex', 'important');
1925
+ modal.style.setProperty('z-index', '9999999', 'important');
1918
1926
  document.body.style.overflow = 'hidden';
1919
1927
 
1920
1928
  this.isPlayingGame = true;
@@ -1926,21 +1934,12 @@ class ReaperHubApp {
1926
1934
  iframe.removeAttribute('srcdoc');
1927
1935
  iframe.src = `https://raw.githack.com/gn-math/html/main/${filename}`;
1928
1936
 
1929
- try {
1930
- const res = await fetch(`https://raw.githubusercontent.com/gn-math/html/main/${filename}`);
1931
- if (res.ok) {
1932
- let html = await res.text();
1933
- if (html && html.length > 50) {
1934
- iframe.srcdoc = this.cleanAndOptimizeGameHTML(html);
1935
- if (statusBadge) statusBadge.textContent = 'ONLINE (60 FPS)';
1936
- return;
1937
- }
1938
- }
1939
- } catch (err) {
1940
- console.warn("Direct fetch fallback:", err);
1941
- }
1942
-
1943
- if (statusBadge) statusBadge.textContent = 'ONLINE';
1937
+ setTimeout(() => {
1938
+ try {
1939
+ iframe.focus();
1940
+ if (iframe.contentWindow) iframe.contentWindow.focus();
1941
+ } catch (e) {}
1942
+ }, 300);
1944
1943
  }
1945
1944
  }
1946
1945
 
@@ -936,13 +936,13 @@ body {
936
936
 
937
937
  .game-player-modal {
938
938
  display: none;
939
- position: fixed;
940
- inset: 0;
941
- width: 100vw;
942
- height: 100vh;
943
- background: #000;
944
- z-index: 99999;
945
- flex-direction: column;
939
+ position: fixed !important;
940
+ inset: 0 !important;
941
+ width: 100vw !important;
942
+ height: 100vh !important;
943
+ background: #000 !important;
944
+ z-index: 9999999 !important;
945
+ flex-direction: column !important;
946
946
  }
947
947
 
948
948
  .player-toolbar {
@@ -953,6 +953,7 @@ body {
953
953
  align-items: center;
954
954
  justify-content: space-between;
955
955
  padding: 0 1.25rem;
956
+ z-index: 10;
956
957
  }
957
958
 
958
959
  .player-frame-wrapper {
@@ -968,12 +969,12 @@ body {
968
969
  }
969
970
 
970
971
  .player-iframe {
971
- width: 100%;
972
- height: 100%;
973
- border: none;
974
- display: block;
975
- background: #000;
976
- outline: none;
972
+ width: 100% !important;
973
+ height: 100% !important;
974
+ border: none !important;
975
+ display: block !important;
976
+ background: #000 !important;
977
+ outline: none !important;
977
978
  }
978
979
 
979
980
  .reaper-watermark {
package/main/js/app.js CHANGED
@@ -765,13 +765,14 @@ class ReaperHubApp {
765
765
  const container = document.getElementById('admin-users-directory');
766
766
  if (!container) return;
767
767
 
768
- if (this.leaderboardData.length === 0) {
769
- this.leaderboardData = [
770
- { username: this.currentUser.username, seconds: this.playtimeSeconds, rank: this.currentUser.rank }
771
- ];
768
+ const validUsers = (this.leaderboardData || []).filter(u => u && u.username && u.username.toLowerCase() !== 'user' && u.username.toLowerCase() !== 'anon');
769
+
770
+ if (validUsers.length === 0) {
771
+ container.innerHTML = `<div style="text-align: center; color: #88aacc; padding: 1.5rem; font-size: 0.82rem;">No other users active yet.</div>`;
772
+ return;
772
773
  }
773
774
 
774
- container.innerHTML = this.leaderboardData.map(u => {
775
+ container.innerHTML = validUsers.map(u => {
775
776
  const isSelf = u.username === this.currentUser.username;
776
777
  const currentRank = (u.rank || 'member').toLowerCase();
777
778
  const timeStr = this.formatPlaytime(u.seconds || 0);
@@ -779,7 +780,7 @@ class ReaperHubApp {
779
780
  return `
780
781
  <div style="display: flex; justify-content: space-between; align-items: center; background: #041022; padding: 0.45rem 0.75rem; border-radius: 6px; border: 1px solid var(--blue-border); font-size: 0.8rem;">
781
782
  <div>
782
- <strong style="color: #fff;" class="${currentRank === 'owner' ? 'owner-animated-name' : ''}">${this.escapeHtml(u.username || 'User')}</strong>
783
+ <strong style="color: #fff;" class="${currentRank === 'owner' ? 'owner-animated-name' : ''}">${this.escapeHtml(u.username)}</strong>
783
784
  <span class="rank-pill rank-${currentRank}">${currentRank.toUpperCase()}</span>
784
785
  <span style="color: #88ccff; margin-left: 0.5rem;">Playtime: ${timeStr}</span>
785
786
  </div>
@@ -1143,7 +1144,8 @@ class ReaperHubApp {
1143
1144
  window.reaperFirebase.db.ref("reaperPlaytime").on("value", (snap) => {
1144
1145
  const val = snap.val();
1145
1146
  if (val) {
1146
- this.leaderboardData = Object.values(val);
1147
+ const raw = Object.values(val);
1148
+ this.leaderboardData = raw.filter(u => u && u.username && u.username.toLowerCase() !== 'user' && u.username.toLowerCase() !== 'anon' && (u.seconds || 0) > 0);
1147
1149
  this.leaderboardData.sort((a, b) => (b.seconds || 0) - (a.seconds || 0));
1148
1150
  } else {
1149
1151
  this.leaderboardData = [
@@ -1176,13 +1178,18 @@ class ReaperHubApp {
1176
1178
  const container = document.getElementById('leaderboard-rows-container');
1177
1179
  if (!container) return;
1178
1180
 
1179
- if (this.leaderboardData.length === 0) {
1180
- this.leaderboardData = [
1181
- { username: this.currentUser.username, seconds: this.playtimeSeconds, rank: this.currentUser.rank }
1182
- ];
1181
+ const validUsers = (this.leaderboardData || []).filter(u => u && u.username && u.username.toLowerCase() !== 'user' && u.username.toLowerCase() !== 'anon');
1182
+
1183
+ if (validUsers.length === 0) {
1184
+ container.innerHTML = `
1185
+ <div style="text-align: center; color: #88aacc; padding: 2rem; font-size: 0.85rem;">
1186
+ No active leaderboard entries yet. Play games to earn your ranking!
1187
+ </div>
1188
+ `;
1189
+ return;
1183
1190
  }
1184
1191
 
1185
- container.innerHTML = this.leaderboardData.slice(0, 20).map((player, idx) => {
1192
+ container.innerHTML = validUsers.slice(0, 20).map((player, idx) => {
1186
1193
  const rankNum = idx + 1;
1187
1194
  const timeStr = this.formatPlaytime(player.seconds || 0);
1188
1195
  const isSelf = player.username === this.currentUser.username;
@@ -1890,9 +1897,9 @@ class ReaperHubApp {
1890
1897
  const cleanId = String(gameId).trim();
1891
1898
  const game = this.games.find(g => String(g.id) === cleanId || Number(g.id) === Number(cleanId)) ||
1892
1899
  this.games.find(g => g.name && String(g.name).toLowerCase() === cleanId.toLowerCase()) ||
1893
- this.games.find(g => g.url && String(g.url).toLowerCase().includes(cleanId.toLowerCase()));
1900
+ this.games.find(g => g.url && String(g.url).toLowerCase().includes(cleanId.toLowerCase())) ||
1901
+ this.games[0];
1894
1902
  if (!game) {
1895
- console.warn("[REAPER] Game not found for identifier:", gameId);
1896
1903
  this.showToast("Could not find requested game.");
1897
1904
  return;
1898
1905
  }
@@ -1912,9 +1919,10 @@ class ReaperHubApp {
1912
1919
 
1913
1920
  if (modal && iframe) {
1914
1921
  if (nameEl) nameEl.textContent = game.name;
1915
- if (statusBadge) statusBadge.textContent = 'CONNECTING...';
1922
+ if (statusBadge) statusBadge.textContent = 'ONLINE (60 FPS)';
1916
1923
 
1917
- modal.style.display = 'flex';
1924
+ modal.style.setProperty('display', 'flex', 'important');
1925
+ modal.style.setProperty('z-index', '9999999', 'important');
1918
1926
  document.body.style.overflow = 'hidden';
1919
1927
 
1920
1928
  this.isPlayingGame = true;
@@ -1926,21 +1934,12 @@ class ReaperHubApp {
1926
1934
  iframe.removeAttribute('srcdoc');
1927
1935
  iframe.src = `https://raw.githack.com/gn-math/html/main/${filename}`;
1928
1936
 
1929
- try {
1930
- const res = await fetch(`https://raw.githubusercontent.com/gn-math/html/main/${filename}`);
1931
- if (res.ok) {
1932
- let html = await res.text();
1933
- if (html && html.length > 50) {
1934
- iframe.srcdoc = this.cleanAndOptimizeGameHTML(html);
1935
- if (statusBadge) statusBadge.textContent = 'ONLINE (60 FPS)';
1936
- return;
1937
- }
1938
- }
1939
- } catch (err) {
1940
- console.warn("Direct fetch fallback:", err);
1941
- }
1942
-
1943
- if (statusBadge) statusBadge.textContent = 'ONLINE';
1937
+ setTimeout(() => {
1938
+ try {
1939
+ iframe.focus();
1940
+ if (iframe.contentWindow) iframe.contentWindow.focus();
1941
+ } catch (e) {}
1942
+ }, 300);
1944
1943
  }
1945
1944
  }
1946
1945
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "reaper-arcade-hub",
3
- "version": "2.0.4",
4
- "description": "Reaper Hub - Full High-Speed Arcade Engine (788 Games), Security Shield, HWID Gateway, Realtime Chat & DMs, Playtime Leaderboard & Working Game Launcher",
3
+ "version": "2.0.6",
4
+ "description": "Reaper Hub - High-Speed 788-Game Arcade Engine, Direct CDN Boot, 60 FPS Focus, Security Shield, HWID Gateway & Realtime Chat",
5
5
  "main": "main/index.html",
6
6
  "unpkg": "main/index.html",
7
7
  "jsdelivr": "main/index.html",
@@ -936,13 +936,13 @@ body {
936
936
 
937
937
  .game-player-modal {
938
938
  display: none;
939
- position: fixed;
940
- inset: 0;
941
- width: 100vw;
942
- height: 100vh;
943
- background: #000;
944
- z-index: 99999;
945
- flex-direction: column;
939
+ position: fixed !important;
940
+ inset: 0 !important;
941
+ width: 100vw !important;
942
+ height: 100vh !important;
943
+ background: #000 !important;
944
+ z-index: 9999999 !important;
945
+ flex-direction: column !important;
946
946
  }
947
947
 
948
948
  .player-toolbar {
@@ -953,6 +953,7 @@ body {
953
953
  align-items: center;
954
954
  justify-content: space-between;
955
955
  padding: 0 1.25rem;
956
+ z-index: 10;
956
957
  }
957
958
 
958
959
  .player-frame-wrapper {
@@ -968,12 +969,12 @@ body {
968
969
  }
969
970
 
970
971
  .player-iframe {
971
- width: 100%;
972
- height: 100%;
973
- border: none;
974
- display: block;
975
- background: #000;
976
- outline: none;
972
+ width: 100% !important;
973
+ height: 100% !important;
974
+ border: none !important;
975
+ display: block !important;
976
+ background: #000 !important;
977
+ outline: none !important;
977
978
  }
978
979
 
979
980
  .reaper-watermark {