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.
@@ -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
+ })();
@@ -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
+ });