reaper-arcade-hub 1.0.0
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 +980 -0
- package/index.html +548 -0
- package/js/app.js +1758 -0
- package/js/firebase-client.js +427 -0
- package/js/games-data.js +7861 -0
- package/js/moderator.js +68 -0
- package/js/security-shield.js +225 -0
- package/js/usernames.js +112 -0
- package/js/visuals.js +74 -0
- package/main/css/styles.css +980 -0
- package/main/games.json +7860 -0
- package/main/index.html +548 -0
- package/main/js/app.js +1758 -0
- package/main/js/firebase-client.js +427 -0
- package/main/js/games-data.js +7861 -0
- package/main/js/moderator.js +68 -0
- package/main/js/security-shield.js +225 -0
- package/main/js/usernames.js +112 -0
- package/main/js/visuals.js +74 -0
- package/package.json +32 -0
- package/verify/css/styles.css +980 -0
- package/verify/index.html +437 -0
- package/verify/js/firebase-client.js +427 -0
- package/verify/js/security-shield.js +225 -0
- package/verify/js/visuals.js +74 -0
package/index.html
ADDED
|
@@ -0,0 +1,548 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>REAPER // Games & Leaderboard</title>
|
|
7
|
+
<meta name="description" content="Reaper Hub - 788 unblocked games with instant HTML5 player, Chat, and Playtime Leaderboard.">
|
|
8
|
+
|
|
9
|
+
<!-- Security Shield & Anti-Extension Defense -->
|
|
10
|
+
<script src="js/security-shield.js"></script>
|
|
11
|
+
|
|
12
|
+
<!-- Styles -->
|
|
13
|
+
<link rel="stylesheet" href="css/styles.css">
|
|
14
|
+
|
|
15
|
+
<!-- Firebase SDKs -->
|
|
16
|
+
<script src="https://www.gstatic.com/firebasejs/9.23.0/firebase-app-compat.js"></script>
|
|
17
|
+
<script src="https://www.gstatic.com/firebasejs/9.23.0/firebase-database-compat.js"></script>
|
|
18
|
+
</head>
|
|
19
|
+
<body>
|
|
20
|
+
|
|
21
|
+
<!-- 10-Second Initial Splash Screen -->
|
|
22
|
+
<div id="app-splash-screen">
|
|
23
|
+
<div class="splash-content">
|
|
24
|
+
<h1 class="splash-logo">reaper</h1>
|
|
25
|
+
<div class="splash-sub">788-GAME CORE ARCADE ENGINE</div>
|
|
26
|
+
|
|
27
|
+
<!-- Dynamic Rotating Cyber Quotes -->
|
|
28
|
+
<div class="splash-quote-wrapper">
|
|
29
|
+
<div id="splash-quote-text" class="splash-quote-text">"Calibrating 788 high-speed HTML5 engines..."</div>
|
|
30
|
+
</div>
|
|
31
|
+
|
|
32
|
+
<div class="splash-progress-track">
|
|
33
|
+
<div id="splash-progress-bar" class="splash-progress-bar"></div>
|
|
34
|
+
</div>
|
|
35
|
+
<div id="splash-status-text" class="splash-status-text">[0%] STARTING SERVICES...</div>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
|
|
39
|
+
<!-- Key Gatekeeper Modal (In-Page Clean UI) -->
|
|
40
|
+
<div id="key-gate-modal" class="admin-modal" style="z-index: 99998; background: radial-gradient(circle at center, #07152b 0%, #02050a 100%);">
|
|
41
|
+
<div class="admin-window" style="max-width: 480px; text-align: center; border-color: var(--blue-primary); box-shadow: 0 0 45px var(--blue-glow); padding: 2.5rem 2rem;">
|
|
42
|
+
<div style="font-family: var(--font-logo); font-size: 3.5rem; color: #fff; font-weight: 900; margin-bottom: 0.25rem; letter-spacing: 0.1em;">reaper</div>
|
|
43
|
+
<div style="color: #00d2ff; font-family: var(--font-heading); font-size: 0.8rem; font-weight: 800; letter-spacing: 0.12em; text-transform: uppercase; margin-bottom: 1.25rem;">AUTHENTICATION REQUIRED</div>
|
|
44
|
+
<p style="color: #adc4e2; font-size: 0.88rem; margin-bottom: 1.5rem; line-height: 1.6;">
|
|
45
|
+
To protect server stability, Reaper requires an active access key or session token. Enter your key directly below or verify on the gateway.
|
|
46
|
+
</p>
|
|
47
|
+
|
|
48
|
+
<!-- In-Page Direct Key & Master Token Input Box -->
|
|
49
|
+
<div style="background: #040c18; border: 1.5px solid var(--blue-border); border-radius: 8px; padding: 1.2rem; text-align: left; margin-bottom: 1.25rem;">
|
|
50
|
+
<div style="font-size: 0.78rem; color: #88aacc; font-weight: 700; margin-bottom: 0.5rem; text-transform: uppercase;">ENTER ACCESS KEY OR MASTER TOKEN:</div>
|
|
51
|
+
<input type="text" id="gate-token-input" class="red-chat-input" placeholder="ENTER KEY (E.G. REAPER-123)" autocomplete="off" style="margin-bottom: 0.75rem; font-family: var(--font-mono); font-size: 0.88rem; padding: 0.75rem 1rem;" onkeydown="if(event.key==='Enter') app.submitGateToken()">
|
|
52
|
+
<button class="btn-primary" style="width: 100%; justify-content: center; padding: 0.75rem;" onclick="app.submitGateToken()">
|
|
53
|
+
UNLOCK & ENTER REAPER
|
|
54
|
+
</button>
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
<div>
|
|
58
|
+
<button class="btn-stealth" style="width: 100%; justify-content: center; font-size: 0.8rem;" onclick="app.redirectToVerify()">
|
|
59
|
+
OPEN VERIFICATION GATEWAY PAGE ➔
|
|
60
|
+
</button>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
|
|
65
|
+
<!-- Human Update Logs Modal -->
|
|
66
|
+
<div id="update-logs-modal" class="admin-modal" style="z-index: 700;">
|
|
67
|
+
<div class="admin-window" style="max-width: 620px;">
|
|
68
|
+
<div class="admin-header">
|
|
69
|
+
<h2 style="font-size: 1.3rem; color: #00d2ff;">PATCH NOTES & UPDATES</h2>
|
|
70
|
+
<button onclick="app.closeUpdateLogsModal()" class="btn-primary">CLOSE</button>
|
|
71
|
+
</div>
|
|
72
|
+
|
|
73
|
+
<div style="font-size: 0.88rem; line-height: 1.7; color: #d0e4ff; display: flex; flex-direction: column; gap: 1rem;">
|
|
74
|
+
<div>
|
|
75
|
+
<strong style="color: #fff; font-size: 1.05rem;">Reaper v4.0 is live</strong>
|
|
76
|
+
<p style="color: #88aacc; font-size: 0.82rem;">August 31, 2026</p>
|
|
77
|
+
</div>
|
|
78
|
+
|
|
79
|
+
<p>
|
|
80
|
+
Here is everything updated in this release:
|
|
81
|
+
</p>
|
|
82
|
+
|
|
83
|
+
<ul style="padding-left: 1.25rem; display: flex; flex-direction: column; gap: 0.5rem; color: #e5f0ff;">
|
|
84
|
+
<li><strong>3 Clean Roles:</strong> Member, Chat Mod, and Owner. Chat Mods have their own dedicated Mod tab to review chats and timeout rulebreakers. Owners can promote or de-rank users on the fly.</li>
|
|
85
|
+
<li><strong>Owner Custom Name Aura:</strong> Owners feature a radiant, chromatic gold-electric animated shimmer gradient text across the entire interface.</li>
|
|
86
|
+
<li><strong>Key Limits & Auto-Expiration:</strong> Owners can set exact max uses (e.g. 1 Use, 5 Uses, Unlimited) and duration for any key. Once exhausted, keys auto-expire.</li>
|
|
87
|
+
<li><strong>Fixed Chat Filtering:</strong> Eliminated false-positive AI message deletions for normal friendly greetings.</li>
|
|
88
|
+
<li><strong>Cyber Typography:</strong> Complete typography overhaul featuring Outfit, Space Grotesk, Cinzel, and JetBrains Mono.</li>
|
|
89
|
+
</ul>
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
|
|
94
|
+
<!-- Starfield Space Canvas -->
|
|
95
|
+
<canvas id="bg-canvas"></canvas>
|
|
96
|
+
|
|
97
|
+
<!-- App Header -->
|
|
98
|
+
<header class="app-header">
|
|
99
|
+
<div class="nav-container">
|
|
100
|
+
<div class="brand-logo" onclick="app.switchTab('home')">
|
|
101
|
+
<span>reaper</span>
|
|
102
|
+
</div>
|
|
103
|
+
|
|
104
|
+
<!-- Nav Tabs -->
|
|
105
|
+
<nav class="nav-tabs-pill">
|
|
106
|
+
<button class="nav-tab-btn active" data-tab="home" onclick="app.switchTab('home')">Home</button>
|
|
107
|
+
<button class="nav-tab-btn" data-tab="games" onclick="app.switchTab('games')">Games (788)</button>
|
|
108
|
+
<button class="nav-tab-btn" data-tab="leaderboard" onclick="app.switchTab('leaderboard')">Leaderboard</button>
|
|
109
|
+
<button class="nav-tab-btn" data-tab="shield" style="color: #00d2ff;" onclick="app.switchTab('shield')">🛡️ Shield</button>
|
|
110
|
+
<button class="nav-tab-btn" id="nav-tab-mod" style="display: none; color: #00ffaa;" data-tab="mod" onclick="app.switchTab('mod')">Mod</button>
|
|
111
|
+
<button class="nav-tab-btn" id="nav-tab-admin" style="display: none; color: #ffd700;" data-tab="admin" onclick="app.switchTab('admin')">Admin</button>
|
|
112
|
+
</nav>
|
|
113
|
+
|
|
114
|
+
<div class="header-right">
|
|
115
|
+
<button class="btn-stealth" onclick="app.openUpdateLogsModal()" title="View update logs">
|
|
116
|
+
Updates
|
|
117
|
+
</button>
|
|
118
|
+
|
|
119
|
+
<button class="btn-stealth" onclick="app.openSiteAboutBlank()" title="Cloak entire site in an about:blank tab">
|
|
120
|
+
Cloak
|
|
121
|
+
</button>
|
|
122
|
+
|
|
123
|
+
<div class="user-badge">
|
|
124
|
+
<span class="bind-username" id="header-username-display">Reaper</span>
|
|
125
|
+
<span class="bind-rank rank-pill rank-member" id="header-rank-badge">MEMBER</span>
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
128
|
+
</div>
|
|
129
|
+
</header>
|
|
130
|
+
|
|
131
|
+
<!-- Main App Layout (Chat Always Visible) -->
|
|
132
|
+
<div class="app-layout">
|
|
133
|
+
|
|
134
|
+
<!-- Center Content Area -->
|
|
135
|
+
<main class="content-area">
|
|
136
|
+
|
|
137
|
+
<!-- ========================================== -->
|
|
138
|
+
<!-- TAB 1: REAPER HOME SCREEN -->
|
|
139
|
+
<!-- ========================================== -->
|
|
140
|
+
<section id="section-home" class="tab-section">
|
|
141
|
+
<div class="opium-home-container">
|
|
142
|
+
<h1 class="opium-logo-title">reaper</h1>
|
|
143
|
+
<div class="opium-subtitle">788 High-Speed Unblocked Games & Live Leaderboard</div>
|
|
144
|
+
|
|
145
|
+
<!-- Pill Search Bar -->
|
|
146
|
+
<div class="opium-search-wrapper">
|
|
147
|
+
<span style="color: #0088ff; font-weight: 700; font-size: 0.95rem;">SEARCH</span>
|
|
148
|
+
<input type="text" id="opium-search-input" class="opium-search-input" placeholder="Search 780+ games or topics..." autocomplete="off" onkeydown="if(event.key==='Enter') app.handleOpiumSearch()">
|
|
149
|
+
</div>
|
|
150
|
+
|
|
151
|
+
<!-- Quick Navigation Tiles -->
|
|
152
|
+
<div style="display: flex; gap: 0.85rem; flex-wrap: wrap; justify-content: center; max-width: 580px;">
|
|
153
|
+
<button class="btn-primary" style="padding: 0.75rem 1.4rem; font-size: 0.88rem;" onclick="app.switchTab('games')">
|
|
154
|
+
BROWSE 788 GAMES
|
|
155
|
+
</button>
|
|
156
|
+
<button class="btn-stealth" style="padding: 0.75rem 1.4rem; font-size: 0.88rem;" onclick="app.switchTab('leaderboard')">
|
|
157
|
+
PLAYTIME LEADERBOARD
|
|
158
|
+
</button>
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
</section>
|
|
162
|
+
|
|
163
|
+
<!-- ========================================== -->
|
|
164
|
+
<!-- TAB 2: 788 GAMES CATALOGUE -->
|
|
165
|
+
<!-- ========================================== -->
|
|
166
|
+
<section id="section-games" class="tab-section" style="display: none;">
|
|
167
|
+
<div class="hero-banner" style="margin-bottom: 1.25rem;">
|
|
168
|
+
<h2 class="hero-title" style="font-size: 1.6rem; font-family: var(--font-heading);">GAMES CATALOGUE</h2>
|
|
169
|
+
<p class="hero-desc" style="color: var(--text-sub); font-size: 0.85rem;">788 High-Speed HTML5 Games with instant in-site player & active playtime tracker.</p>
|
|
170
|
+
</div>
|
|
171
|
+
|
|
172
|
+
<div class="controls-bar">
|
|
173
|
+
<div class="search-box">
|
|
174
|
+
<span style="color: #0088ff; font-size: 0.75rem; font-weight: 700;">FILTER</span>
|
|
175
|
+
<input type="text" id="search-games-input" placeholder="Search 780+ games, series, or authors..." autocomplete="off">
|
|
176
|
+
</div>
|
|
177
|
+
|
|
178
|
+
<div class="filter-pills">
|
|
179
|
+
<button class="filter-btn active" data-cat="all">ALL</button>
|
|
180
|
+
<button class="filter-btn" data-cat="featured">FEATURED</button>
|
|
181
|
+
<button class="filter-btn" data-cat="favorites">FAVORITES</button>
|
|
182
|
+
<button class="filter-btn" data-cat="fnf">FNF (50+)</button>
|
|
183
|
+
<button class="filter-btn" data-cat="port">PORTS</button>
|
|
184
|
+
<button class="filter-btn" data-cat="flash">FLASH</button>
|
|
185
|
+
<button class="filter-btn" data-cat="emulator">EMULATOR</button>
|
|
186
|
+
<button class="filter-btn" data-cat="tools">TOOLS</button>
|
|
187
|
+
</div>
|
|
188
|
+
</div>
|
|
189
|
+
|
|
190
|
+
<div class="games-grid" id="games-grid">
|
|
191
|
+
<!-- Rendered dynamically -->
|
|
192
|
+
</div>
|
|
193
|
+
</section>
|
|
194
|
+
|
|
195
|
+
<!-- ========================================== -->
|
|
196
|
+
<!-- TAB 3: PLAYTIME LEADERBOARD -->
|
|
197
|
+
<!-- ========================================== -->
|
|
198
|
+
<section id="section-leaderboard" class="tab-section" style="display: none;">
|
|
199
|
+
<div class="leaderboard-container">
|
|
200
|
+
<div class="leaderboard-header">
|
|
201
|
+
<div>
|
|
202
|
+
<h2 style="font-size: 1.6rem; color: #fff; margin-bottom: 0.25rem; font-family: var(--font-heading);">PLAYTIME LEADERBOARD</h2>
|
|
203
|
+
<p style="color: var(--text-sub); font-size: 0.85rem;">Rankings based on active in-game playtime. Inactivity for 1 minute pauses your counter.</p>
|
|
204
|
+
</div>
|
|
205
|
+
<div style="text-align: right;">
|
|
206
|
+
<div style="font-size: 0.72rem; color: #88aacc; text-transform: uppercase;">YOUR RECORDED TIME</div>
|
|
207
|
+
<div id="stat-my-playtime" style="font-family: var(--font-mono); font-size: 1.25rem; font-weight: 900; color: #00d2ff;">0m 0s</div>
|
|
208
|
+
</div>
|
|
209
|
+
</div>
|
|
210
|
+
|
|
211
|
+
<div class="leaderboard-list" id="leaderboard-rows-container">
|
|
212
|
+
<!-- Leaderboard rankings rendered dynamically -->
|
|
213
|
+
</div>
|
|
214
|
+
</div>
|
|
215
|
+
</section>
|
|
216
|
+
|
|
217
|
+
<!-- ========================================== -->
|
|
218
|
+
<!-- TAB: BROWSER EXTENSION SHIELD & FIREWALL -->
|
|
219
|
+
<!-- ========================================== -->
|
|
220
|
+
<section id="section-shield" class="tab-section" style="display: none;">
|
|
221
|
+
<div class="leaderboard-container">
|
|
222
|
+
<div class="leaderboard-header" style="border-color: #00d2ff;">
|
|
223
|
+
<div>
|
|
224
|
+
<h2 style="font-size: 1.6rem; color: #00d2ff; margin-bottom: 0.25rem; font-family: var(--font-heading);">
|
|
225
|
+
🛡️ BROWSER EXTENSION FIREWALL & SPY DEFENDER
|
|
226
|
+
</h2>
|
|
227
|
+
<p style="color: var(--text-sub); font-size: 0.85rem;">
|
|
228
|
+
Live extension detection engine. Scans, cuts, and isolates all school surveillance hooks and DOM sniffers.
|
|
229
|
+
</p>
|
|
230
|
+
</div>
|
|
231
|
+
<div style="text-align: right;">
|
|
232
|
+
<button class="btn-primary" onclick="app.purgeAllExtensionHooks()" style="background: #ff0055; border-color: #ff3377; padding: 0.6rem 1.2rem; font-size: 0.82rem;">
|
|
233
|
+
⚡ DISABLE & PURGE ALL HOOKS
|
|
234
|
+
</button>
|
|
235
|
+
</div>
|
|
236
|
+
</div>
|
|
237
|
+
|
|
238
|
+
<!-- Controls & Status Strip -->
|
|
239
|
+
<div style="display: flex; justify-content: space-between; align-items: center; background: #040e1e; border: 1px solid var(--blue-border); padding: 1rem 1.25rem; border-radius: 8px; margin-bottom: 1.5rem; flex-wrap: wrap; gap: 1rem;">
|
|
240
|
+
<div style="display: flex; gap: 1.5rem; align-items: center;">
|
|
241
|
+
<div>
|
|
242
|
+
<span style="font-size: 0.72rem; color: #88aacc; text-transform: uppercase; display: block;">SHIELD STATUS</span>
|
|
243
|
+
<strong style="color: #00ffaa; font-size: 0.95rem;">ACTIVE & ENFORCING</strong>
|
|
244
|
+
</div>
|
|
245
|
+
<div>
|
|
246
|
+
<span style="font-size: 0.72rem; color: #88aacc; text-transform: uppercase; display: block;">ISOLATION INTEGRITY</span>
|
|
247
|
+
<strong style="color: #00d2ff; font-size: 0.95rem;">100% SECURE</strong>
|
|
248
|
+
</div>
|
|
249
|
+
</div>
|
|
250
|
+
|
|
251
|
+
<div style="display: flex; gap: 1rem; align-items: center;">
|
|
252
|
+
<label style="display: flex; align-items: center; gap: 0.5rem; cursor: pointer; color: #fff; font-size: 0.82rem; font-weight: 700;">
|
|
253
|
+
<input type="checkbox" id="auto-shield-toggle" style="width: 20px; height: 20px; accent-color: #0088ff;" onchange="app.toggleAutoShield(this.checked)" checked>
|
|
254
|
+
AUTO-PURGE ON EVERY VISIT
|
|
255
|
+
</label>
|
|
256
|
+
<button class="btn-stealth" onclick="app.refreshExtensionScan()" style="padding: 0.4rem 0.85rem; font-size: 0.78rem;">
|
|
257
|
+
🔄 RESCAN BROWSER
|
|
258
|
+
</button>
|
|
259
|
+
</div>
|
|
260
|
+
</div>
|
|
261
|
+
|
|
262
|
+
<!-- Detected Extensions Matrix -->
|
|
263
|
+
<div style="font-size: 0.82rem; color: #88aacc; font-weight: 800; margin-bottom: 0.75rem; letter-spacing: 0.05em; text-transform: uppercase;">
|
|
264
|
+
DETECTED EXTENSIONS & SPY PROBES:
|
|
265
|
+
</div>
|
|
266
|
+
|
|
267
|
+
<div id="shield-extensions-list" style="display: flex; flex-direction: column; gap: 0.6rem;">
|
|
268
|
+
<!-- Extensions rendered dynamically -->
|
|
269
|
+
</div>
|
|
270
|
+
</div>
|
|
271
|
+
</section>
|
|
272
|
+
|
|
273
|
+
<!-- ========================================== -->
|
|
274
|
+
<!-- TAB 4: CHAT MOD TAB (MOD ONLY) -->
|
|
275
|
+
<!-- ========================================== -->
|
|
276
|
+
<section id="section-mod" class="tab-section" style="display: none;">
|
|
277
|
+
<div class="mod-tab-container">
|
|
278
|
+
<div class="mod-window">
|
|
279
|
+
<div class="mod-header">
|
|
280
|
+
<h2 style="font-size: 1.3rem; color: #00ffaa; font-family: var(--font-heading);">CHAT MODERATOR DESK</h2>
|
|
281
|
+
<span class="rank-pill rank-mod">CHAT MOD ACCESS</span>
|
|
282
|
+
</div>
|
|
283
|
+
|
|
284
|
+
<!-- Timeout User Box -->
|
|
285
|
+
<div class="mod-section">
|
|
286
|
+
<h3 style="font-size: 0.95rem; color: #fff; margin-bottom: 0.35rem;">TIMEOUT / MUTE USER</h3>
|
|
287
|
+
<p style="color: #88aacc; font-size: 0.8rem; margin-bottom: 0.75rem;">Apply a temporary chat timeout to any user by name.</p>
|
|
288
|
+
<div style="display: flex; gap: 0.5rem; flex-wrap: wrap;">
|
|
289
|
+
<input type="text" id="mod-timeout-username" class="red-chat-input" placeholder="Enter username to timeout" autocomplete="off" style="max-width: 260px;">
|
|
290
|
+
<button class="btn-primary" style="background: #0088ff;" onclick="app.modApplyTimeout(5)">5 MIN TIMEOUT</button>
|
|
291
|
+
<button class="btn-primary" style="background: #ff8800;" onclick="app.modApplyTimeout(15)">15 MIN TIMEOUT</button>
|
|
292
|
+
<button class="btn-primary" style="background: #ff3333;" onclick="app.modApplyTimeout(60)">1 HOUR TIMEOUT</button>
|
|
293
|
+
</div>
|
|
294
|
+
</div>
|
|
295
|
+
|
|
296
|
+
<!-- Live Chat Logs with Quick Actions -->
|
|
297
|
+
<div class="mod-section">
|
|
298
|
+
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.5rem;">
|
|
299
|
+
<h3 style="font-size: 0.95rem; color: #fff;">LIVE CHAT LOGS & MESSAGE PURGE</h3>
|
|
300
|
+
</div>
|
|
301
|
+
<p style="color: #88aacc; font-size: 0.8rem; margin-bottom: 0.75rem;">Click DEL to remove rulebreaking messages or TIMEOUT to mute the user.</p>
|
|
302
|
+
<div id="mod-chat-logs" style="max-height: 280px; overflow-y: auto; background: #040912; border: 1px solid var(--blue-border); border-radius: 4px;"></div>
|
|
303
|
+
</div>
|
|
304
|
+
</div>
|
|
305
|
+
</div>
|
|
306
|
+
</section>
|
|
307
|
+
|
|
308
|
+
<!-- ========================================== -->
|
|
309
|
+
<!-- TAB 5: ROOT OWNER ADMIN TAB (OWNER ONLY) -->
|
|
310
|
+
<!-- ========================================== -->
|
|
311
|
+
<section id="section-admin" class="tab-section" style="display: none;">
|
|
312
|
+
<div class="admin-tab-container">
|
|
313
|
+
<div class="admin-window">
|
|
314
|
+
<div class="admin-header">
|
|
315
|
+
<h2 style="font-size: 1.3rem; color: #ffd700; font-family: var(--font-heading);">ROOT OWNER ADMINISTRATION</h2>
|
|
316
|
+
<div style="display: flex; gap: 0.5rem;">
|
|
317
|
+
<button onclick="app.logoutAdmin()" class="btn-stealth" style="color: #ff4444; border-color: #ff4444;">LOGOUT</button>
|
|
318
|
+
</div>
|
|
319
|
+
</div>
|
|
320
|
+
|
|
321
|
+
<!-- User Roles & Directory (Promote / Demote) -->
|
|
322
|
+
<div class="admin-section">
|
|
323
|
+
<h3 style="font-size: 0.95rem; color: #fff; margin-bottom: 0.35rem;">USER ROLES & PROMOTION</h3>
|
|
324
|
+
<p style="color: #88aacc; font-size: 0.8rem; margin-bottom: 0.85rem;">Promote members to Chat Mod, de-rank mods back to Member, or ban offenders.</p>
|
|
325
|
+
<div id="admin-users-directory" style="display: flex; flex-direction: column; gap: 0.4rem; max-height: 220px; overflow-y: auto;">
|
|
326
|
+
<!-- Users rendered dynamically -->
|
|
327
|
+
</div>
|
|
328
|
+
</div>
|
|
329
|
+
|
|
330
|
+
<!-- Key Generator (Duration, Max Uses, & Auto-Expiration) -->
|
|
331
|
+
<div class="admin-section">
|
|
332
|
+
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.5rem;">
|
|
333
|
+
<h3 style="font-size: 0.95rem; color: #fff;">KEY GENERATOR & USAGE CONTROLS</h3>
|
|
334
|
+
<button onclick="app.clearAllKeys()" class="btn-stealth" style="color: #ff5555; border-color: #771111; font-size: 0.72rem;">CLEAR ALL KEYS</button>
|
|
335
|
+
</div>
|
|
336
|
+
<p style="color: #88aacc; font-size: 0.8rem; margin-bottom: 0.85rem;">Set key name, duration, and max uses. Keys auto-expire once all uses are exhausted.</p>
|
|
337
|
+
|
|
338
|
+
<!-- Custom Key Creation Input -->
|
|
339
|
+
<div style="display: flex; gap: 0.5rem; margin-bottom: 0.85rem; flex-wrap: wrap; align-items: center;">
|
|
340
|
+
<input type="text" id="admin-custom-key-input" class="red-chat-input" placeholder="Blank for REAPER-$$$ (or type name)" autocomplete="off" style="max-width: 250px;">
|
|
341
|
+
|
|
342
|
+
<select id="admin-custom-key-rank" style="background: #040912; color: #fff; border: 1px solid var(--blue-border); border-radius: 6px; padding: 0.45rem 0.65rem; font-size: 0.8rem; font-weight: 700;">
|
|
343
|
+
<option value="member">Rank: Member</option>
|
|
344
|
+
<option value="chat_mod">Rank: Chat Mod</option>
|
|
345
|
+
</select>
|
|
346
|
+
|
|
347
|
+
<select id="admin-custom-key-duration" style="background: #040912; color: #fff; border: 1px solid var(--blue-border); border-radius: 6px; padding: 0.45rem 0.65rem; font-size: 0.8rem;">
|
|
348
|
+
<option value="24">Duration: 24 Hours (1 Day)</option>
|
|
349
|
+
<option value="72">Duration: 3 Days</option>
|
|
350
|
+
<option value="120">Duration: 5 Days</option>
|
|
351
|
+
<option value="168">Duration: 7 Days (1 Week)</option>
|
|
352
|
+
<option value="720">Duration: 30 Days (1 Month)</option>
|
|
353
|
+
<option value="87600">Duration: Lifetime</option>
|
|
354
|
+
</select>
|
|
355
|
+
|
|
356
|
+
<select id="admin-custom-key-maxuses" style="background: #040912; color: #fff; border: 1px solid var(--blue-border); border-radius: 6px; padding: 0.45rem 0.65rem; font-size: 0.8rem;">
|
|
357
|
+
<option value="1">Uses: 1 Use (Single-Use)</option>
|
|
358
|
+
<option value="3">Uses: 3 Uses</option>
|
|
359
|
+
<option value="5">Uses: 5 Uses</option>
|
|
360
|
+
<option value="10">Uses: 10 Uses</option>
|
|
361
|
+
<option value="25">Uses: 25 Uses</option>
|
|
362
|
+
<option value="50">Uses: 50 Uses</option>
|
|
363
|
+
<option value="999999">Uses: Unlimited Uses</option>
|
|
364
|
+
</select>
|
|
365
|
+
|
|
366
|
+
<button class="btn-primary" style="padding: 0.5rem 1.15rem;" onclick="app.createCustomKey()">GENERATE KEY</button>
|
|
367
|
+
</div>
|
|
368
|
+
|
|
369
|
+
<div style="font-size: 0.78rem; color: #88aacc; margin-bottom: 0.3rem;">ACTIVE KEYS & REMAINING USES:</div>
|
|
370
|
+
<div id="admin-keys-list" style="max-height: 180px; overflow-y: auto;"></div>
|
|
371
|
+
</div>
|
|
372
|
+
|
|
373
|
+
<!-- Admin AI Bypass Switch -->
|
|
374
|
+
<div class="admin-section">
|
|
375
|
+
<div style="display: flex; justify-content: space-between; align-items: center;">
|
|
376
|
+
<div>
|
|
377
|
+
<strong style="color: #fff; font-size: 0.95rem;">OWNER AI FILTER BYPASS</strong>
|
|
378
|
+
<p style="color: #88aacc; font-size: 0.8rem;">Allow Owner to bypass AI content filtering in Chat.</p>
|
|
379
|
+
</div>
|
|
380
|
+
<input type="checkbox" id="admin-bypass-toggle" style="width: 22px; height: 22px; cursor: pointer;" onchange="app.toggleAiBypass(this.checked)">
|
|
381
|
+
</div>
|
|
382
|
+
</div>
|
|
383
|
+
|
|
384
|
+
<!-- Chat Lock Switch -->
|
|
385
|
+
<div class="admin-section">
|
|
386
|
+
<div style="display: flex; justify-content: space-between; align-items: center;">
|
|
387
|
+
<div>
|
|
388
|
+
<strong style="color: #fff; font-size: 0.95rem;">LOCK CHAT</strong>
|
|
389
|
+
<p style="color: #88aacc; font-size: 0.8rem;">Prevent lower ranks from sending messages in Chat.</p>
|
|
390
|
+
</div>
|
|
391
|
+
<input type="checkbox" id="admin-chatlock-toggle" style="width: 22px; height: 22px; cursor: pointer;" onchange="app.toggleChatLock(this.checked)">
|
|
392
|
+
</div>
|
|
393
|
+
</div>
|
|
394
|
+
|
|
395
|
+
<!-- Emergency Google Redirect Lock (Panic Mode) -->
|
|
396
|
+
<div class="admin-section" style="border-color: #ff0055; background: #1a000d;">
|
|
397
|
+
<div style="display: flex; justify-content: space-between; align-items: center;">
|
|
398
|
+
<div>
|
|
399
|
+
<strong style="color: #ff3377; font-size: 0.95rem;">EMERGENCY GOOGLE REDIRECT LOCK (PANIC MODE)</strong>
|
|
400
|
+
<p style="color: #ff99bb; font-size: 0.8rem;">When enabled, ANY user opening the Main Portal or Verification Gateway is INSTANTLY redirected to google.com.</p>
|
|
401
|
+
</div>
|
|
402
|
+
<input type="checkbox" id="admin-redirect-google-toggle" style="width: 24px; height: 24px; cursor: pointer; accent-color: #ff0055;" onchange="app.toggleRedirectGoogle(this.checked)">
|
|
403
|
+
</div>
|
|
404
|
+
</div>
|
|
405
|
+
|
|
406
|
+
<!-- Pause / Freeze All Access Keys -->
|
|
407
|
+
<div class="admin-section" style="border-color: #ffaa00; background: #140d02;">
|
|
408
|
+
<div style="display: flex; justify-content: space-between; align-items: center;">
|
|
409
|
+
<div>
|
|
410
|
+
<strong style="color: #ffbb33; font-size: 0.95rem;">PAUSE / FREEZE ALL ACCESS KEYS</strong>
|
|
411
|
+
<p style="color: #ffe099; font-size: 0.8rem;">When paused, no new key logins can occur on the gateway. Key durations & remaining uses are frozen and preserved.</p>
|
|
412
|
+
</div>
|
|
413
|
+
<input type="checkbox" id="admin-keys-locked-toggle" style="width: 24px; height: 24px; cursor: pointer; accent-color: #ffaa00;" onchange="app.toggleKeysLocked(this.checked)">
|
|
414
|
+
</div>
|
|
415
|
+
</div>
|
|
416
|
+
|
|
417
|
+
<!-- Verify Gateway Lockdown Switch -->
|
|
418
|
+
<div class="admin-section" style="border-color: #00d2ff; background: #020f1e;">
|
|
419
|
+
<div style="display: flex; justify-content: space-between; align-items: center;">
|
|
420
|
+
<div>
|
|
421
|
+
<strong style="color: #00d2ff; font-size: 0.95rem;">LOCK VERIFICATION GATEWAY (VERIFY SITE LOCKDOWN)</strong>
|
|
422
|
+
<p style="color: #88ccff; font-size: 0.8rem;">When enabled, the Verification site (verifyreaper.neocities.org) is locked down with a maintenance screen.</p>
|
|
423
|
+
</div>
|
|
424
|
+
<input type="checkbox" id="admin-verify-lockdown-toggle" style="width: 24px; height: 24px; cursor: pointer; accent-color: #00d2ff;" onchange="app.toggleVerifyLockdown(this.checked)">
|
|
425
|
+
</div>
|
|
426
|
+
</div>
|
|
427
|
+
|
|
428
|
+
<!-- Permanent Shutdown Mode Switch -->
|
|
429
|
+
<div class="admin-section" style="border-color: #ff3333; background: #140303;">
|
|
430
|
+
<div style="display: flex; justify-content: space-between; align-items: center;">
|
|
431
|
+
<div>
|
|
432
|
+
<strong style="color: #ff5555; font-size: 0.95rem;">PERMANENT SHUTDOWN MODE ("WE ARE SHUTTING DOWN FOR GOOD")</strong>
|
|
433
|
+
<p style="color: #ffaaaa; font-size: 0.8rem;">When enabled, all lower ranks see a permanent blackout screen saying 'We are shutting down for good'.</p>
|
|
434
|
+
</div>
|
|
435
|
+
<input type="checkbox" id="admin-shutdown-toggle" style="width: 24px; height: 24px; cursor: pointer; accent-color: #ff2222;" onchange="app.toggleShutdownMode(this.checked)">
|
|
436
|
+
</div>
|
|
437
|
+
</div>
|
|
438
|
+
|
|
439
|
+
<!-- Site Lockdown Switch -->
|
|
440
|
+
<div class="admin-section">
|
|
441
|
+
<div style="display: flex; justify-content: space-between; align-items: center;">
|
|
442
|
+
<div>
|
|
443
|
+
<strong style="color: #fff; font-size: 0.95rem;">SHUT DOWN PORTAL FOR LOWER RANKS (MAIN PORTAL LOCKDOWN)</strong>
|
|
444
|
+
<p style="color: #88aacc; font-size: 0.8rem;">When enabled, all non-owner users on the main site will be locked out with a maintenance screen.</p>
|
|
445
|
+
</div>
|
|
446
|
+
<input type="checkbox" id="admin-lockdown-toggle" style="width: 22px; height: 22px; cursor: pointer;" onchange="app.toggleSiteLockdown(this.checked)">
|
|
447
|
+
</div>
|
|
448
|
+
</div>
|
|
449
|
+
|
|
450
|
+
<!-- Server Data Purge -->
|
|
451
|
+
<div class="admin-section" style="border-color: #ffaa00;">
|
|
452
|
+
<div style="display: flex; justify-content: space-between; align-items: center;">
|
|
453
|
+
<div>
|
|
454
|
+
<strong style="color: #ffaa00; font-size: 0.95rem;">PURGE ALL SERVER DATA</strong>
|
|
455
|
+
<p style="color: #88aacc; font-size: 0.8rem;">Instantly reset all chat messages, playtime leaderboard scores, and generated keys across Firebase.</p>
|
|
456
|
+
</div>
|
|
457
|
+
<button onclick="app.purgeAllServerData()" class="btn-primary" style="background: #ff4400; border-color: #ff8800; font-size: 0.78rem;">PURGE ALL</button>
|
|
458
|
+
</div>
|
|
459
|
+
</div>
|
|
460
|
+
|
|
461
|
+
<!-- User Moderation & Ban Tools -->
|
|
462
|
+
<div class="admin-section">
|
|
463
|
+
<h3 style="font-size: 0.95rem; margin-bottom: 0.5rem; color: #fff;">PERMANENT BAN TOOLS</h3>
|
|
464
|
+
<p style="color: #88aacc; font-size: 0.8rem; margin-bottom: 0.65rem;">Banning a user immediately wipes all their playtime progress, clears their chat history, and permanently blacklists their identity across all domains.</p>
|
|
465
|
+
<div style="display: flex; gap: 0.5rem; margin-bottom: 0.85rem;">
|
|
466
|
+
<input type="text" id="admin-ban-username-input" class="red-chat-input" placeholder="Username to permanently ban" autocomplete="off" style="max-width: 260px;">
|
|
467
|
+
<button onclick="app.permLocalBan()" class="btn-primary" style="background: #ff2222; font-size: 0.78rem;">PERM BAN & WIPE USER</button>
|
|
468
|
+
</div>
|
|
469
|
+
<div style="font-size: 0.78rem; color: #88aacc; margin-bottom: 0.3rem;">BANNED IDENTITIES (BLACKLISTED):</div>
|
|
470
|
+
<div id="admin-banned-list"></div>
|
|
471
|
+
</div>
|
|
472
|
+
|
|
473
|
+
<!-- Live Chat Logs & Purge -->
|
|
474
|
+
<div class="admin-section">
|
|
475
|
+
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.5rem;">
|
|
476
|
+
<h3 style="font-size: 0.95rem; color: #fff;">LIVE CHAT LOGS</h3>
|
|
477
|
+
<button onclick="app.clearAllChat()" class="btn-stealth" style="color: #ff5555; border-color: #771111; font-size: 0.75rem;">CLEAR CHAT</button>
|
|
478
|
+
</div>
|
|
479
|
+
<div id="admin-chat-logs" style="max-height: 160px; overflow-y: auto; background: #040912; border: 1px solid var(--blue-border); border-radius: 4px;"></div>
|
|
480
|
+
</div>
|
|
481
|
+
</div>
|
|
482
|
+
</div>
|
|
483
|
+
</section>
|
|
484
|
+
|
|
485
|
+
</main>
|
|
486
|
+
|
|
487
|
+
<!-- Side-Docked Chat (Always Visible in Portal) -->
|
|
488
|
+
<aside class="side-chat-panel" id="side-chat-panel">
|
|
489
|
+
<div class="red-chat-header">
|
|
490
|
+
<div class="red-chat-title">
|
|
491
|
+
<span>CHAT</span>
|
|
492
|
+
<span class="chat-lock-indicator" id="chat-lock-indicator">LOCKED</span>
|
|
493
|
+
</div>
|
|
494
|
+
<span style="font-size: 0.68rem; color: #00d2ff;">AI FILTER ACTIVE</span>
|
|
495
|
+
</div>
|
|
496
|
+
|
|
497
|
+
<!-- Messages Stream (Right for You, Left for Others) -->
|
|
498
|
+
<div class="red-chat-messages" id="red-chat-messages">
|
|
499
|
+
<!-- Messages stream -->
|
|
500
|
+
</div>
|
|
501
|
+
|
|
502
|
+
<!-- Input Bar -->
|
|
503
|
+
<div class="red-chat-input-bar">
|
|
504
|
+
<div class="timeout-warning-bar" id="chat-timeout-bar"></div>
|
|
505
|
+
<div class="chat-input-row">
|
|
506
|
+
<input type="text" id="red-chat-input" class="red-chat-input" placeholder="Send message in Chat..." autocomplete="off">
|
|
507
|
+
<button class="btn-primary" id="red-chat-send-btn" onclick="app.handleSendChatMessage()">SEND</button>
|
|
508
|
+
</div>
|
|
509
|
+
</div>
|
|
510
|
+
</aside>
|
|
511
|
+
|
|
512
|
+
</div>
|
|
513
|
+
|
|
514
|
+
<!-- In-Site Game Player Modal (Chat hidden while playing) -->
|
|
515
|
+
<div id="game-player-modal" class="game-player-modal">
|
|
516
|
+
<div class="player-toolbar">
|
|
517
|
+
<div style="display: flex; align-items: center; gap: 0.85rem;">
|
|
518
|
+
<button class="btn-stealth" onclick="app.closePlayer()">EXIT GAME</button>
|
|
519
|
+
<span id="player-game-name" style="font-weight: 800; font-size: 1.1rem; color: #fff;">Game Player</span>
|
|
520
|
+
<span id="player-status-badge" style="font-size: 0.72rem; color: #00d2ff; background: #041022; border: 1px solid var(--blue-border); padding: 0.2rem 0.5rem; border-radius: 4px;">Loading...</span>
|
|
521
|
+
<span id="player-playtime-counter" style="font-family: var(--font-mono); font-size: 0.82rem; font-weight: 800; color: #00d2ff; margin-left: 0.5rem;">PLAYTIME: 0m 0s</span>
|
|
522
|
+
</div>
|
|
523
|
+
<div style="display: flex; gap: 0.5rem;">
|
|
524
|
+
<button class="btn-stealth" style="border-color: var(--blue-border); color: #88ccff;" onclick="app.openGameAboutBlank()" title="Play in a disguised about:blank tab">
|
|
525
|
+
OPEN IN ABOUT:BLANK
|
|
526
|
+
</button>
|
|
527
|
+
<button class="btn-stealth" onclick="app.reloadPlayer()">RELOAD</button>
|
|
528
|
+
<button class="btn-primary" onclick="app.togglePlayerFullscreen()">FULLSCREEN</button>
|
|
529
|
+
</div>
|
|
530
|
+
</div>
|
|
531
|
+
<div class="player-frame-wrapper">
|
|
532
|
+
<iframe id="player-iframe" class="player-iframe" src="about:blank" allowfullscreen="true" allow="autoplay; fullscreen; gamepad"></iframe>
|
|
533
|
+
<div class="reaper-watermark">REAPER HUB</div>
|
|
534
|
+
</div>
|
|
535
|
+
</div>
|
|
536
|
+
|
|
537
|
+
<!-- Toast -->
|
|
538
|
+
<div id="toast-box" class="toast-box"></div>
|
|
539
|
+
|
|
540
|
+
<!-- Scripts -->
|
|
541
|
+
<script src="js/usernames.js"></script>
|
|
542
|
+
<script src="js/games-data.js"></script>
|
|
543
|
+
<script src="js/moderator.js"></script>
|
|
544
|
+
<script src="js/visuals.js"></script>
|
|
545
|
+
<script src="js/firebase-client.js"></script>
|
|
546
|
+
<script src="js/app.js"></script>
|
|
547
|
+
</body>
|
|
548
|
+
</html>
|