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/js/moderator.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// AI Content Moderator & Timeout Engine
|
|
2
|
+
|
|
3
|
+
class AIContentModerator {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.bannedTerms = [
|
|
6
|
+
// Drugs / Vapes / Controlled Substances (exact whole word match)
|
|
7
|
+
'vape', 'vapes', 'vaping', 'juul', 'nicotine', 'tobacco', 'cigarette', 'cigar',
|
|
8
|
+
'weed', 'marijuana', 'cannabis', 'thc', 'cbd', 'edibles', 'joint', 'blunt', 'bong',
|
|
9
|
+
'cocaine', 'coke', 'crack', 'meth', 'crystal meth', 'heroin', 'fentanyl', 'opioid',
|
|
10
|
+
'xanax', 'percocet', 'lean', 'codeine', 'ecstasy', 'molly', 'mdma', 'shrooms', 'psilocybin',
|
|
11
|
+
|
|
12
|
+
// Explicit Profanity / Slurs (exact whole word match)
|
|
13
|
+
'fuck', 'fucking', 'fucker', 'fuckin', 'motherfucker',
|
|
14
|
+
'bitch', 'bitches', 'bitching', 'asshole', 'bastard', 'dick', 'dicks', 'cock', 'cocks',
|
|
15
|
+
'pussy', 'pussies', 'cunt', 'cunts', 'nigger', 'nigga', 'niggers', 'niggas',
|
|
16
|
+
'faggot', 'fag', 'faggots', 'whore', 'whores', 'slut', 'sluts', 'retard', 'retarded',
|
|
17
|
+
|
|
18
|
+
// Explicit 18+ keywords
|
|
19
|
+
'porn', 'porno', 'xxx', 'hentai', 'rule34', 'xvideos', 'pornhub', 'onlyfans',
|
|
20
|
+
'nsfw', 'sex', 'blowjob', 'handjob', 'dildo'
|
|
21
|
+
];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
getTimeoutRemaining() {
|
|
25
|
+
const expiresAt = parseInt(localStorage.getItem('reaper_chat_timeout_expires') || '0', 10);
|
|
26
|
+
const now = Date.now();
|
|
27
|
+
if (expiresAt > now) {
|
|
28
|
+
return Math.ceil((expiresAt - now) / 1000);
|
|
29
|
+
}
|
|
30
|
+
return 0;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
applyTimeout(minutes = 5) {
|
|
34
|
+
const expiresAt = Date.now() + (minutes * 60 * 1000);
|
|
35
|
+
localStorage.setItem('reaper_chat_timeout_expires', expiresAt.toString());
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
checkMessage(text, isAdmin = false) {
|
|
39
|
+
const bypassEnabled = localStorage.getItem('reaper_ai_bypass') === 'true';
|
|
40
|
+
if (isAdmin && bypassEnabled) return { allowed: true };
|
|
41
|
+
if (!text) return { allowed: true };
|
|
42
|
+
|
|
43
|
+
const cleanText = text.toLowerCase();
|
|
44
|
+
|
|
45
|
+
for (const term of this.bannedTerms) {
|
|
46
|
+
// Strictly check whole words with boundary regex
|
|
47
|
+
const regex = new RegExp(`(?:^|\\s|[^a-zA-Z0-9])${term}(?:$|\\s|[^a-zA-Z0-9])`, 'i');
|
|
48
|
+
if (regex.test(cleanText)) {
|
|
49
|
+
if (!isAdmin) this.applyTimeout(5);
|
|
50
|
+
return {
|
|
51
|
+
allowed: false,
|
|
52
|
+
flaggedTerm: term,
|
|
53
|
+
reason: `Message deleted by AI. You are timed out for 5 minutes.`
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return { allowed: true };
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
formatTime(seconds) {
|
|
62
|
+
const mins = Math.floor(seconds / 60);
|
|
63
|
+
const secs = seconds % 60;
|
|
64
|
+
return `${mins}:${secs < 10 ? '0' : ''}${secs}`;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
window.aiModerator = new AIContentModerator();
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
// REAPER HUB - Universal Anti-Extension Spy Shield & System Defense Engine
|
|
2
|
+
// Scans, detects, isolates, and terminates browser extension hooks, surveillance content-scripts, and DOM inspectors.
|
|
3
|
+
|
|
4
|
+
(function() {
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
class ReaperSecurityShield {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.bannedSignatures = [
|
|
10
|
+
{ id: 'goguardian', name: 'GoGuardian Surveillance Hook', category: 'School Spyware', risk: 'CRITICAL' },
|
|
11
|
+
{ id: 'securly', name: 'Securly Filter & Activity Probe', category: 'School Spyware', risk: 'CRITICAL' },
|
|
12
|
+
{ id: 'hapara', name: 'Hapara Highlights Screen Grabber', category: 'School Spyware', risk: 'CRITICAL' },
|
|
13
|
+
{ id: 'blocksi', name: 'Blocksi Web Content Scanner', category: 'School Spyware', risk: 'CRITICAL' },
|
|
14
|
+
{ id: 'lightspeed', name: 'Lightspeed Relay Screen Spy', category: 'School Spyware', risk: 'HIGH' },
|
|
15
|
+
{ id: 'lanschool', name: 'LanSchool Classroom Monitor', category: 'School Spyware', risk: 'CRITICAL' },
|
|
16
|
+
{ id: 'imperosoftware', name: 'Impero Education Spy Hook', category: 'School Spyware', risk: 'CRITICAL' },
|
|
17
|
+
{ id: 'contentkeeper', name: 'ContentKeeper Behavioral Monitor', category: 'School Spyware', risk: 'HIGH' },
|
|
18
|
+
{ id: 'deledao', name: 'Deledao AI Web Telemetry', category: 'School Spyware', risk: 'HIGH' },
|
|
19
|
+
{ id: 'linewize', name: 'Linewize School Filter Probe', category: 'School Spyware', risk: 'HIGH' },
|
|
20
|
+
{ id: 'bark', name: 'Bark Youth Monitoring Probe', category: 'Activity Spy', risk: 'MEDIUM' },
|
|
21
|
+
{ id: 'cisco-umbrella', name: 'Cisco Umbrella DNS Sniffer', category: 'Network Filter', risk: 'HIGH' },
|
|
22
|
+
{ id: 'netsupport', name: 'NetSupport School Screen Catcher', category: 'School Spyware', risk: 'CRITICAL' },
|
|
23
|
+
{ id: 'aristotle', name: 'Aristotle Insight Telemetry', category: 'School Spyware', risk: 'HIGH' },
|
|
24
|
+
{ id: 'smoothwall', name: 'Smoothwall Web Policy Monitor', category: 'School Spyware', risk: 'HIGH' },
|
|
25
|
+
{ id: 'grammarly', name: 'Grammarly DOM Text Keystroke Hook', category: 'Input Sniffer', risk: 'MEDIUM' },
|
|
26
|
+
{ id: 'lastpass', name: 'LastPass Autofill Hook', category: 'Autofill Extension', risk: 'LOW' },
|
|
27
|
+
{ id: 'tampermonkey', name: 'UserScript / Userscript Manager', category: 'DOM Injector', risk: 'MEDIUM' },
|
|
28
|
+
{ id: 'adblock', name: 'AdBlocker Content Scraper', category: 'Ad Filter', risk: 'LOW' }
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
this.autoShield = localStorage.getItem('reaper_auto_shield') !== 'false';
|
|
32
|
+
this.detectedExtensions = [];
|
|
33
|
+
this.blockedCount = 0;
|
|
34
|
+
this.isScanning = false;
|
|
35
|
+
|
|
36
|
+
this.init();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
init() {
|
|
40
|
+
// 1. Defend Against DevTools Inspection Shortcuts
|
|
41
|
+
window.addEventListener('keydown', (e) => {
|
|
42
|
+
if (e.key === 'F12' || e.keyCode === 123) {
|
|
43
|
+
e.preventDefault();
|
|
44
|
+
e.stopPropagation();
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
if (e.ctrlKey && e.shiftKey && ['I','i','J','j','C','c','K','k','E','e','S','s'].includes(e.key)) {
|
|
48
|
+
e.preventDefault();
|
|
49
|
+
e.stopPropagation();
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
if (e.ctrlKey && (e.key === 'U' || e.key === 'u')) {
|
|
53
|
+
e.preventDefault();
|
|
54
|
+
e.stopPropagation();
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}, true);
|
|
58
|
+
|
|
59
|
+
// 2. Cloak chrome.runtime messaging
|
|
60
|
+
try {
|
|
61
|
+
if (window.chrome && window.chrome.runtime) {
|
|
62
|
+
const origSendMessage = window.chrome.runtime.sendMessage;
|
|
63
|
+
const bannedIds = this.bannedSignatures.map(s => s.id);
|
|
64
|
+
window.chrome.runtime.sendMessage = function() {
|
|
65
|
+
if (arguments[0] && typeof arguments[0] === 'object') {
|
|
66
|
+
const payload = JSON.stringify(arguments[0]).toLowerCase();
|
|
67
|
+
for (let i = 0; i < bannedIds.length; i++) {
|
|
68
|
+
if (payload.includes(bannedIds[i])) {
|
|
69
|
+
return Promise.resolve({ blocked: true });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (origSendMessage) {
|
|
74
|
+
try {
|
|
75
|
+
return origSendMessage.apply(this, arguments);
|
|
76
|
+
} catch (err) {}
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
} catch (e) {}
|
|
81
|
+
|
|
82
|
+
// 3. Setup continuous MutationObserver to instantly strip injected extension nodes
|
|
83
|
+
if (typeof MutationObserver !== 'undefined') {
|
|
84
|
+
const observer = new MutationObserver((mutations) => {
|
|
85
|
+
for (let i = 0; i < mutations.length; i++) {
|
|
86
|
+
const added = mutations[i].addedNodes;
|
|
87
|
+
for (let j = 0; j < added.length; j++) {
|
|
88
|
+
const node = added[j];
|
|
89
|
+
if (this.isSpyElement(node)) {
|
|
90
|
+
if (node.parentNode) {
|
|
91
|
+
node.parentNode.removeChild(node);
|
|
92
|
+
this.blockedCount++;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
const target = document.documentElement || document;
|
|
100
|
+
observer.observe(target, { childList: true, subtree: true });
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// 4. Auto-Purge Loop if enabled
|
|
104
|
+
if (this.autoShield) {
|
|
105
|
+
setInterval(() => this.purgeSpyInjections(), 800);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Initial scan
|
|
109
|
+
setTimeout(() => this.scanExtensions(), 500);
|
|
110
|
+
console.log("%c[REAPER SECURITY SHIELD]%c Active & Monitoring.", "color: #00d2ff; font-weight: 900;", "color: #88ccff;");
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
isSpyElement(node) {
|
|
114
|
+
if (!node || node.nodeType !== 1) return false;
|
|
115
|
+
try {
|
|
116
|
+
const id = (node.id || '').toLowerCase();
|
|
117
|
+
const cls = (typeof node.className === 'string' ? node.className : '').toLowerCase();
|
|
118
|
+
const src = (node.src || '').toLowerCase();
|
|
119
|
+
const href = (node.href || '').toLowerCase();
|
|
120
|
+
|
|
121
|
+
for (let i = 0; i < this.bannedSignatures.length; i++) {
|
|
122
|
+
const sig = this.bannedSignatures[i].id;
|
|
123
|
+
if (id.includes(sig) || cls.includes(sig) || src.includes(sig) || href.includes(sig)) {
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if ((src.startsWith('chrome-extension://') || href.startsWith('chrome-extension://')) &&
|
|
129
|
+
!src.includes('firebase') && !src.includes('gstatic')) {
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
} catch (e) {}
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
scanExtensions() {
|
|
137
|
+
this.isScanning = true;
|
|
138
|
+
const detected = [];
|
|
139
|
+
|
|
140
|
+
// Probe DOM elements, scripts, styles, iframes
|
|
141
|
+
this.bannedSignatures.forEach(sig => {
|
|
142
|
+
let isPresent = false;
|
|
143
|
+
let details = 'No active DOM hooks found';
|
|
144
|
+
|
|
145
|
+
// Check DOM selectors
|
|
146
|
+
const found = document.querySelectorAll(`[id*="${sig.id}" i], [class*="${sig.id}" i], script[src*="${sig.id}" i], link[href*="${sig.id}" i]`);
|
|
147
|
+
if (found.length > 0) {
|
|
148
|
+
isPresent = true;
|
|
149
|
+
details = `${found.length} injected DOM element(s) detected`;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Check global window artifacts
|
|
153
|
+
const keys = Object.keys(window);
|
|
154
|
+
for (let i = 0; i < keys.length; i++) {
|
|
155
|
+
if (keys[i].toLowerCase().includes(sig.id)) {
|
|
156
|
+
isPresent = true;
|
|
157
|
+
details = `Global object window.${keys[i]} detected`;
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
detected.push({
|
|
163
|
+
id: sig.id,
|
|
164
|
+
name: sig.name,
|
|
165
|
+
category: sig.category,
|
|
166
|
+
risk: sig.risk,
|
|
167
|
+
status: isPresent ? 'ACTIVE_BLOCKED' : 'NEUTRALIZED',
|
|
168
|
+
details: details
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
// Probe for generic chrome-extension scripts
|
|
173
|
+
const extElements = document.querySelectorAll('script[src^="chrome-extension://"], iframe[src^="chrome-extension://"]');
|
|
174
|
+
if (extElements.length > 0) {
|
|
175
|
+
detected.unshift({
|
|
176
|
+
id: 'generic-ext',
|
|
177
|
+
name: 'External Chrome Extension Content Script',
|
|
178
|
+
category: 'Browser Extension',
|
|
179
|
+
risk: 'HIGH',
|
|
180
|
+
status: 'ACTIVE_BLOCKED',
|
|
181
|
+
details: `${extElements.length} chrome-extension:// script/iframe hook(s)`
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
this.detectedExtensions = detected;
|
|
186
|
+
this.isScanning = false;
|
|
187
|
+
return detected;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
purgeSpyInjections() {
|
|
191
|
+
let count = 0;
|
|
192
|
+
try {
|
|
193
|
+
this.bannedSignatures.forEach(sig => {
|
|
194
|
+
const found = document.querySelectorAll(`[id*="${sig.id}" i], [class*="${sig.id}" i], iframe[src*="${sig.id}" i], script[src*="${sig.id}" i]`);
|
|
195
|
+
for (let i = 0; i < found.length; i++) {
|
|
196
|
+
const el = found[i];
|
|
197
|
+
if (el && el.parentNode && el.id !== 'app-splash-screen' && !el.closest('#app-layout')) {
|
|
198
|
+
el.parentNode.removeChild(el);
|
|
199
|
+
count++;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
// Kill generic chrome-extension injections
|
|
205
|
+
const extNodes = document.querySelectorAll('iframe[src^="chrome-extension://"], script[src^="chrome-extension://"]');
|
|
206
|
+
for (let i = 0; i < extNodes.length; i++) {
|
|
207
|
+
if (extNodes[i] && extNodes[i].parentNode) {
|
|
208
|
+
extNodes[i].parentNode.removeChild(extNodes[i]);
|
|
209
|
+
count++;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
} catch (e) {}
|
|
213
|
+
|
|
214
|
+
this.blockedCount += count;
|
|
215
|
+
return count;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
setAutoPurge(enabled) {
|
|
219
|
+
this.autoShield = enabled;
|
|
220
|
+
localStorage.setItem('reaper_auto_shield', enabled ? 'true' : 'false');
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
window.reaperShield = new ReaperSecurityShield();
|
|
225
|
+
})();
|
package/js/usernames.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// 500 Pre-loaded Unique Anonymous Usernames for UNKNOWN
|
|
2
|
+
const PRELOADED_USERNAMES = [
|
|
3
|
+
"ShadowOperator_01", "NullProtocol", "GhostCipher_X", "VortexPhantom", "ZeroTrace_007",
|
|
4
|
+
"CipherVex", "ObsidianRoot", "VoidWalker_99", "NeonSpectre", "Eclipse_Zero",
|
|
5
|
+
"DarkMatter_404", "QuantumPhantom", "CyberReaper", "AbyssWatcher", "FrostByte_00",
|
|
6
|
+
"SilentEcho", "BinaryWraith", "Overlord_X", "StaticVoid", "PhantomGrid",
|
|
7
|
+
"GlitchMaster", "Krypton_9", "EchoShadow", "SpectralZero", "NetPhantom_77",
|
|
8
|
+
"RogueSignal", "OmegaRoot", "TerminalDaemon", "AlphaSpectre", "Vanguard_X",
|
|
9
|
+
"MidnightCipher", "NexusGhost", "StarlightVoid", "MonochromeGod", "ArcaneOperator",
|
|
10
|
+
"SilentByte", "AegisPhantom", "VectorPrime", "CrypticReaper", "DarkKnight_01",
|
|
11
|
+
"AeroGhost", "ZenithOperator", "TitanVoid", "ApexPhantom", "SolarEclipse_X",
|
|
12
|
+
"ShadowSync", "NullPointer_404", "GhostShell", "ChronoVex", "RiddleDaemon",
|
|
13
|
+
"BionicShadow", "InfernalRoot", "OnyxGhost", "StealthSpectre", "ZeroDay_Exploit",
|
|
14
|
+
"VoidWalker_101", "LunarWraith", "CyberGod_99", "EchoSpectre", "GhostRider_B&W",
|
|
15
|
+
"ShadowNova", "Protocol_Omega", "QuantumReaper", "DarkLotus", "ObsidianReaper",
|
|
16
|
+
"VortexRogue", "SilentStrike", "Blackout_00", "CipherShadow", "NeonWraith",
|
|
17
|
+
"AbyssalGhost", "FrostReaper", "SpectralPulse", "BinaryGhost", "NullOverlord",
|
|
18
|
+
"GlitchPhantom", "Kryptic_X", "TerminalGhost", "NetWraith_88", "OmegaCipher",
|
|
19
|
+
"AlphaVoid", "VanguardGhost", "MidnightGhost", "NexusSpectre", "StarlightReaper",
|
|
20
|
+
"MonochromeWraith", "ArcaneCipher", "SilentSpectre", "AegisCipher", "VectorGhost",
|
|
21
|
+
"CrypticWraith", "DarkWraith_99", "AeroSpectre", "ZenithCipher", "TitanSpectre",
|
|
22
|
+
"ApexCipher", "SolarWraith", "ShadowPulse", "NullWraith", "GhostVex",
|
|
23
|
+
"ChronoShadow", "RiddleGhost", "BionicGhost", "InfernalCipher", "OnyxSpectre",
|
|
24
|
+
"StealthGhost", "ZeroGhost", "VoidSpectre", "LunarGhost", "CyberWraith",
|
|
25
|
+
"EchoWraith", "GhostMatrix", "ShadowMatrix", "ProtocolGhost", "QuantumGhost",
|
|
26
|
+
"DarkMatrix", "ObsidianSpectre", "VortexSpectre", "SilentMatrix", "BlackoutGhost",
|
|
27
|
+
"CipherPulse", "NeonGhost", "AbyssalSpectre", "FrostSpectre", "SpectralWraith",
|
|
28
|
+
"BinarySpectre", "NullSpectre", "GlitchWraith", "KrypticGhost", "TerminalSpectre",
|
|
29
|
+
"NetSpectre", "OmegaGhost", "AlphaWraith", "VanguardSpectre", "MidnightWraith",
|
|
30
|
+
"NexusWraith", "StarlightSpectre", "MonochromeGhost", "ArcaneGhost", "SilentWraith",
|
|
31
|
+
"AegisWraith", "VectorWraith", "CrypticGhost", "DarkGhost_77", "AeroWraith",
|
|
32
|
+
"ZenithWraith", "TitanWraith", "ApexWraith", "SolarGhost", "ShadowDaemon",
|
|
33
|
+
"NullDaemon", "GhostDaemon", "ChronoDaemon", "RiddleDaemon_X", "BionicDaemon",
|
|
34
|
+
"InfernalDaemon", "OnyxDaemon", "StealthDaemon", "ZeroDaemon", "VoidDaemon",
|
|
35
|
+
"LunarDaemon", "CyberDaemon", "EchoDaemon", "PhantomDaemon", "ShadowAgent_01",
|
|
36
|
+
"NullAgent", "GhostAgent", "ChronoAgent", "RiddleAgent", "BionicAgent",
|
|
37
|
+
"InfernalAgent", "OnyxAgent", "StealthAgent", "ZeroAgent", "VoidAgent",
|
|
38
|
+
"LunarAgent", "CyberAgent", "EchoAgent", "PhantomAgent", "ShadowHunter",
|
|
39
|
+
"NullHunter", "GhostHunter", "ChronoHunter", "RiddleHunter", "BionicHunter",
|
|
40
|
+
"InfernalHunter", "OnyxHunter", "StealthHunter", "ZeroHunter", "VoidHunter",
|
|
41
|
+
"LunarHunter", "CyberHunter", "EchoHunter", "PhantomHunter", "ShadowBlade",
|
|
42
|
+
"NullBlade", "GhostBlade", "ChronoBlade", "RiddleBlade", "BionicBlade",
|
|
43
|
+
"InfernalBlade", "OnyxBlade", "StealthBlade", "ZeroBlade", "VoidBlade",
|
|
44
|
+
"LunarBlade", "CyberBlade", "EchoBlade", "PhantomBlade", "ShadowKnight",
|
|
45
|
+
"NullKnight", "GhostKnight", "ChronoKnight", "RiddleKnight", "BionicKnight",
|
|
46
|
+
"InfernalKnight", "OnyxKnight", "StealthKnight", "ZeroKnight", "VoidKnight",
|
|
47
|
+
"LunarKnight", "CyberKnight", "EchoKnight", "PhantomKnight", "ShadowKing",
|
|
48
|
+
"NullKing", "GhostKing", "ChronoKing", "RiddleKing", "BionicKing",
|
|
49
|
+
"InfernalKing", "OnyxKing", "StealthKing", "ZeroKing", "VoidKing",
|
|
50
|
+
"LunarKing", "CyberKing", "EchoKing", "PhantomKing", "ShadowLord",
|
|
51
|
+
"NullLord", "GhostLord", "ChronoLord", "RiddleLord", "BionicLord",
|
|
52
|
+
"InfernalLord", "OnyxLord", "StealthLord", "ZeroLord", "VoidLord",
|
|
53
|
+
"LunarLord", "CyberLord", "EchoLord", "PhantomLord", "Unknown_User_001",
|
|
54
|
+
"Unknown_User_002", "Unknown_User_003", "Unknown_User_004", "Unknown_User_005",
|
|
55
|
+
"Unknown_User_006", "Unknown_User_007", "Unknown_User_008", "Unknown_User_009", "Unknown_User_010",
|
|
56
|
+
"VexMaster_99", "ByteOverdrive", "DarknetStalker", "HexOperator", "KernelPanic_0",
|
|
57
|
+
"RootAccess_Granted", "SubZero_Phantom", "SynapseWraith", "Tesseract_404", "UltraViolet_Dark",
|
|
58
|
+
"ValkyrieVoid", "WarpCipher", "XenoSpectre", "YieldProtocol", "ZephyrShadow",
|
|
59
|
+
"Anomaly_001", "BlackHole_Entity", "CosmicSpectre", "Doppelganger_X", "EventHorizon_9",
|
|
60
|
+
"Fracture_Ghost", "GravityZero", "Hyperion_Void", "IonWraith", "Juggernaut_B&W",
|
|
61
|
+
"KestrelGhost", "Leviathan_Root", "MirageCipher", "NebulaShadow", "OblivionWalker",
|
|
62
|
+
"PulsarGhost", "QuasarOperator", "RogueSpectre", "Singularity_0", "TremorPhantom",
|
|
63
|
+
"UmbraSpectre", "VortexRoot", "Wavelength_X", "XenonPhantom", "Ypsilon_Void",
|
|
64
|
+
"ZenithRoot", "AeroReaper", "BioHazard_99", "ChronosWraith", "DuskOperator",
|
|
65
|
+
"EnigmaPulse", "FallenSpectre", "GargoyleGhost", "HelixCipher", "IronSpectre",
|
|
66
|
+
"Judgement_0", "KronosVoid", "Labyrinth_X", "MonolithPhantom", "Nemesis_Root",
|
|
67
|
+
"OutlawCipher", "Pandora_00", "QuantumNexus", "RevenantVoid", "SovereignGhost",
|
|
68
|
+
"TempestWraith", "Underworld_9", "VagabondCipher", "WardenGhost", "XeroSpectre",
|
|
69
|
+
"YmirPhantom", "ZeroEntropy", "AbyssOperative", "BlackLotus_X", "CryoPhantom",
|
|
70
|
+
"Deadlock_404", "ExodusSpectre", "ForsakenVoid", "GrimCipher", "HavocOperator",
|
|
71
|
+
"InsomniaGhost", "JackalWraith", "KarmaSpectre", "LucidShadow", "Maelstrom_0",
|
|
72
|
+
"NocturneWraith", "OverkillCipher", "ParadoxGhost", "Quicksilver_X", "RancorSpectre",
|
|
73
|
+
"StalkerVoid", "TyphoonPhantom", "Ultimatum_99", "Vindicator_0", "WraithProtocol",
|
|
74
|
+
"XenolithCipher", "YieldSpectre", "ZodiacPhantom", "AbsoluteZero_9", "BlackoutOperative",
|
|
75
|
+
"ColdFusion_X", "DarkAura_0", "EclipseSpectre", "FatalError_404", "GrimReaper_B&W",
|
|
76
|
+
"HazardPulse", "InfinityVoid", "JesterPhantom", "KhaosCipher", "LostProtocol",
|
|
77
|
+
"MatrixReaper", "NightFall_X", "OracleVoid", "PhantomOverlord", "QuantumWraith",
|
|
78
|
+
"RequiemGhost", "ShadowEmperor", "ToxicSpectre", "UnseenOperative", "VexWraith",
|
|
79
|
+
"WarlockVoid", "XenoGhost", "YieldPhantom", "ZealotCipher", "ApexPredator_01",
|
|
80
|
+
"BloodHound_X", "CyberNinja_99", "DeathBringer_0", "Executioner_X", "FrostBite_99",
|
|
81
|
+
"GhostRogue", "HyperDrive_0", "ImmortalVoid", "JinxCipher", "KnightmareGhost",
|
|
82
|
+
"LoneWolf_B&W", "MidnightReaper", "NirvanaVoid", "OutcastSpectre", "PsychosisGhost",
|
|
83
|
+
"QuantumStrike", "RampageCipher", "SkullCrusher_0", "TormentVoid", "Undercover_007",
|
|
84
|
+
"VandalGhost", "WickedWraith", "XFactor_99", "YellowJacket_B&W", "ZeroTolerance",
|
|
85
|
+
"AcidRain_X", "BlazePhantom", "ChaosBringer", "DemonCore_404", "EntropyZero",
|
|
86
|
+
"FearProtocol", "GhostSniper", "HighVoltage_0", "IronClad_Void", "JudgeDredd_B&W",
|
|
87
|
+
"KillerInstinct", "LiquidNitrogen", "MaskedPhantom", "NightShade_X", "OutlawGhost",
|
|
88
|
+
"Poltergeist_99", "Quickdraw_0", "RogueAssassin", "SoulReaper_B&W", "ThunderStorm_X",
|
|
89
|
+
"UrbanLegend_0", "VortexBlade", "WarMonger_99", "XenonSpectre", "YinYang_Void",
|
|
90
|
+
"ZeroHour_404", "AlphaWolf_01", "BlackHawk_99", "CyberSamurai", "DarkMatter_00",
|
|
91
|
+
"Executioner_99", "FireStorm_X", "GhostCommand", "HellFire_Void", "InvincibleGhost",
|
|
92
|
+
"JokerPhantom", "Kraken_B&W", "LightningBolt", "MoonLightWraith", "Nocturnal_01",
|
|
93
|
+
"OverDrive_99", "Predator_X", "QuantumShift", "RagingBull_0", "SilentKiller_X",
|
|
94
|
+
"TitaniumGhost", "UltraInstinct_B&W", "ViperStrike", "WhiteFang_01", "XenonWraith",
|
|
95
|
+
"YoungGod_01", "ZeroPoint_Energy", "ApexGod_01", "BlitzKrieg_99", "CyberVandal",
|
|
96
|
+
"DeathWish_X", "EndGame_404", "FlashPoint_0", "GhostAssassin", "HavocBringer",
|
|
97
|
+
"IronMan_B&W", "JudgmentDay_0", "KingPin_99", "LaserFocus_X", "MadMax_B&W",
|
|
98
|
+
"NightCrawler_X", "OmegaStriker", "ProwlerGhost", "QuantumLeap_0", "RedemptionVoid",
|
|
99
|
+
"ShadowMaster_X", "TerrorBringer", "UltimateWeapon", "VenomousGhost", "WarLord_01",
|
|
100
|
+
"Xenomorph_B&W", "YellowStone_0", "ZeroGravity_X", "ArcAngel_B&W", "BadKarma_99",
|
|
101
|
+
"ColdBlooded_0", "DarkHero_X", "EvilGenius_01", "FinalCountdown", "GhostWalker_99",
|
|
102
|
+
"HighNoon_B&W", "ImmortalGod_X", "JackPot_777", "KillerQueen_B&W", "LostSoul_404",
|
|
103
|
+
"MasterMind_01", "NightHawk_99", "OverSeer_01", "PhantomLord_X", "QuantumMind",
|
|
104
|
+
"RapidFire_01", "SilentAssault", "TripleThreat_0", "UltraViolet_01", "VengeanceVoid",
|
|
105
|
+
"WarPath_99", "XtremeGamer", "YoungLegend_01", "ZeroHero_404"
|
|
106
|
+
];
|
|
107
|
+
|
|
108
|
+
// Helper to get random username from pool
|
|
109
|
+
function getRandomUsername() {
|
|
110
|
+
const idx = Math.floor(Math.random() * PRELOADED_USERNAMES.length);
|
|
111
|
+
return PRELOADED_USERNAMES[idx];
|
|
112
|
+
}
|
package/js/visuals.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// REAPER HUB - Opium Starfield Canvas Engine
|
|
2
|
+
|
|
3
|
+
class StarfieldCanvas {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.canvas = document.getElementById('bg-canvas');
|
|
6
|
+
if (!this.canvas) return;
|
|
7
|
+
this.ctx = this.canvas.getContext('2d');
|
|
8
|
+
this.stars = [];
|
|
9
|
+
this.numStars = 220;
|
|
10
|
+
this.width = window.innerWidth;
|
|
11
|
+
this.height = window.innerHeight;
|
|
12
|
+
|
|
13
|
+
this.init();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
init() {
|
|
17
|
+
this.resize();
|
|
18
|
+
window.addEventListener('resize', () => this.resize());
|
|
19
|
+
|
|
20
|
+
// Generate Stars
|
|
21
|
+
this.stars = [];
|
|
22
|
+
for (let i = 0; i < this.numStars; i++) {
|
|
23
|
+
this.stars.push({
|
|
24
|
+
x: Math.random() * this.width,
|
|
25
|
+
y: Math.random() * this.height,
|
|
26
|
+
radius: Math.random() * 1.5 + 0.5,
|
|
27
|
+
alpha: Math.random() * 0.8 + 0.2,
|
|
28
|
+
twinkleSpeed: (Math.random() * 0.02 + 0.005) * (Math.random() > 0.5 ? 1 : -1),
|
|
29
|
+
speedY: (Math.random() * 0.15 + 0.05)
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
this.animate();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
resize() {
|
|
37
|
+
this.width = window.innerWidth;
|
|
38
|
+
this.height = window.innerHeight;
|
|
39
|
+
if (this.canvas) {
|
|
40
|
+
this.canvas.width = this.width;
|
|
41
|
+
this.canvas.height = this.height;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
animate() {
|
|
46
|
+
this.ctx.clearRect(0, 0, this.width, this.height);
|
|
47
|
+
|
|
48
|
+
for (let star of this.stars) {
|
|
49
|
+
star.alpha += star.twinkleSpeed;
|
|
50
|
+
if (star.alpha > 0.95 || star.alpha < 0.15) {
|
|
51
|
+
star.twinkleSpeed = -star.twinkleSpeed;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
star.y -= star.speedY;
|
|
55
|
+
if (star.y < 0) {
|
|
56
|
+
star.y = this.height;
|
|
57
|
+
star.x = Math.random() * this.width;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
this.ctx.beginPath();
|
|
61
|
+
this.ctx.arc(star.x, star.y, star.radius, 0, Math.PI * 2);
|
|
62
|
+
this.ctx.fillStyle = `rgba(255, 255, 255, ${star.alpha})`;
|
|
63
|
+
this.ctx.shadowBlur = star.radius > 1.2 ? 6 : 0;
|
|
64
|
+
this.ctx.shadowColor = 'rgba(255, 255, 255, 0.8)';
|
|
65
|
+
this.ctx.fill();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
requestAnimationFrame(() => this.animate());
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
window.addEventListener('DOMContentLoaded', () => {
|
|
73
|
+
window.starfield = new StarfieldCanvas();
|
|
74
|
+
});
|