JAKTEch commited on
Commit
1a07a93
·
verified ·
1 Parent(s): e20cf25

Update index.js

Browse files
Files changed (1) hide show
  1. index.js +129 -11
index.js CHANGED
@@ -5,26 +5,144 @@ const io = require('socket.io')(http, {
5
  cors: { origin: "*", methods: ["GET", "POST"] }
6
  });
7
 
8
- app.get('/', (req, res) => res.send('sSs Relay Online.'));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
 
10
  io.on('connection', (socket) => {
11
- console.log(`User connected: ${socket.id}`);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
 
13
- // 1. SIMPLE CHAT RELAY (Echo)
14
- // We just take whatever comes in and blast it to everyone.
15
- socket.on('chat-message', (msg) => {
16
- io.emit('chat-message', msg);
 
 
 
 
 
 
 
 
 
 
 
17
  });
18
 
19
- // 2. VIEWER COUNT (Optional but nice)
20
- io.emit('viewer-count', io.engine.clientsCount);
 
 
 
 
 
 
 
 
 
 
 
 
21
 
22
- socket.on('disconnect', () => {
23
- io.emit('viewer-count', io.engine.clientsCount);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  });
25
  });
26
 
 
 
 
 
 
 
 
27
  http.listen(7860, () => console.log('Server running on 7860'));
28
 
29
- // Auto-Restart every 24h to keep memory fresh
30
  setTimeout(() => process.exit(0), 24 * 60 * 60 * 1000);
 
5
  cors: { origin: "*", methods: ["GET", "POST"] }
6
  });
7
 
8
+ app.get('/', (req, res) => res.send('sSs Relay + Justice System Online.'));
9
+
10
+ // --- STATE MEMORY ---
11
+ let broadcaster = null;
12
+ let currentVisual = "default"; // Default state
13
+ const bannedIPs = new Map(); // IP -> Expiration Timestamp
14
+ const mutedIPs = new Map(); // IP -> Expiration Timestamp
15
+ const kickedIPs = new Map(); // IP -> Expiration Timestamp (10s)
16
+
17
+ // --- HELPER: GET IP ---
18
+ function getClientIP(socket) {
19
+ const header = socket.handshake.headers['x-forwarded-for'];
20
+ return header ? header.split(',')[0].trim() : socket.handshake.address;
21
+ }
22
+
23
+ // --- HELPER: CLEAN LISTS ---
24
+ function cleanLists() {
25
+ const now = Date.now();
26
+ [bannedIPs, mutedIPs, kickedIPs].forEach(map => {
27
+ for (const [ip, time] of map.entries()) {
28
+ if (now > time) map.delete(ip);
29
+ }
30
+ });
31
+ }
32
 
33
  io.on('connection', (socket) => {
34
+ const ip = getClientIP(socket);
35
+ cleanLists(); // Cleanup old bans on every connect
36
+
37
+ // 1. GATEKEEPER (Bans & Kicks)
38
+ if (bannedIPs.has(ip)) {
39
+ const timeLeft = Math.ceil((bannedIPs.get(ip) - Date.now()) / 60000);
40
+ socket.emit('force-disconnect', `BANNED. Time remaining: ${timeLeft} mins.`);
41
+ socket.disconnect(true);
42
+ return;
43
+ }
44
+ if (kickedIPs.has(ip)) {
45
+ socket.emit('force-disconnect', `KICKED. Cooldown: 10s.`);
46
+ socket.disconnect(true);
47
+ return;
48
+ }
49
 
50
+ console.log(`User joined: ${socket.id} [${ip}]`);
51
+
52
+ // 2. BROADCASTER LOGIC
53
+ socket.on('broadcaster', () => {
54
+ broadcaster = socket.id;
55
+ socket.broadcast.emit('broadcaster');
56
+ // Send lists to admin immediately
57
+ sendAdminData(socket);
58
+ });
59
+
60
+ // 3. WATCHER LOGIC
61
+ socket.on('watcher', () => {
62
+ if (broadcaster) socket.to(broadcaster).emit('watcher', socket.id);
63
+ // Send current visual state immediately to new user
64
+ socket.emit('visual-update', currentVisual);
65
  });
66
 
67
+ // 4. CHAT RELAY (With Mute Check)
68
+ socket.on('chat-message', (payload) => {
69
+ cleanLists();
70
+ // payload: { name, text, isHost }
71
+ if (mutedIPs.has(ip) && !payload.isHost) {
72
+ // Notify user they are muted? Or silent fail? Let's notify.
73
+ const timeLeft = Math.ceil((mutedIPs.get(ip) - Date.now()) / 60000);
74
+ socket.emit('system-msg', `YOU ARE MUTED (${timeLeft}m remaining).`);
75
+ return;
76
+ }
77
+
78
+ // Add IP hash for Admin ID
79
+ io.emit('chat-message', { ...payload, socketId: socket.id, ip: ip });
80
+ });
81
 
82
+ // 5. VISUAL CONTROLLER
83
+ socket.on('push-visual', (url) => {
84
+ if (socket.id !== broadcaster) return;
85
+ currentVisual = url;
86
+ io.emit('visual-update', url);
87
+ });
88
+
89
+ // 6. ADMIN JUSTICE SYSTEM
90
+ socket.on('admin-action', (cmd) => {
91
+ if (socket.id !== broadcaster) return;
92
+
93
+ // cmd: { action: 'ban1', targetIp: '...' } OR { action: 'ban1', targetSocket: '...' }
94
+ let targetIP = cmd.targetIp;
95
+
96
+ // If we only have socket ID (from chat click), find the socket to get IP
97
+ if (!targetIP && cmd.targetSocket) {
98
+ const targetSock = io.sockets.sockets.get(cmd.targetSocket);
99
+ if (targetSock) {
100
+ targetIP = getClientIP(targetSock);
101
+ // Execute immediate disconnects if needed
102
+ if (cmd.action.includes('ban') || cmd.action === 'kick') {
103
+ targetSock.emit('force-disconnect', 'You have been removed by the Host.');
104
+ targetSock.disconnect(true);
105
+ }
106
+ }
107
+ }
108
+
109
+ if (!targetIP) return; // Can't act without IP
110
+
111
+ const now = Date.now();
112
+ const min = 60000;
113
+ const hour = min * 60;
114
+
115
+ switch (cmd.action) {
116
+ case 'kick': kickedIPs.set(targetIP, now + 10000); break; // 10s
117
+
118
+ case 'ban1': bannedIPs.set(targetIP, now + (1 * hour)); break;
119
+ case 'ban2': bannedIPs.set(targetIP, now + (24 * hour)); break;
120
+ case 'ban3': bannedIPs.set(targetIP, now + (720 * hour)); break;
121
+
122
+ case 'mute1': mutedIPs.set(targetIP, now + (1 * min)); break;
123
+ case 'mute2': mutedIPs.set(targetIP, now + (10 * min)); break;
124
+ case 'mute3': mutedIPs.set(targetIP, now + (160 * min)); break;
125
+
126
+ case 'unban': bannedIPs.delete(targetIP); kickedIPs.delete(targetIP); break;
127
+ case 'unmute': mutedIPs.delete(targetIP); break;
128
+ }
129
+
130
+ // Update Admin UI
131
+ sendAdminData(socket);
132
+ });
133
+
134
+ socket.on('request-admin-data', () => {
135
+ if (socket.id === broadcaster) sendAdminData(socket);
136
  });
137
  });
138
 
139
+ function sendAdminData(socket) {
140
+ // Convert Maps to Arrays for sending
141
+ const bans = Array.from(bannedIPs.entries()).map(([ip, time]) => ({ ip, time }));
142
+ const mutes = Array.from(mutedIPs.entries()).map(([ip, time]) => ({ ip, time }));
143
+ socket.emit('admin-data', { bans, mutes });
144
+ }
145
+
146
  http.listen(7860, () => console.log('Server running on 7860'));
147
 
 
148
  setTimeout(() => process.exit(0), 24 * 60 * 60 * 1000);