const express = require('express'); const http = require('http'); const { Server } = require('socket.io'); const app = express(); const server = http.createServer(app); // Pengaturan CORS agar bisa diakses bebas dari file HTML/APK bos const io = new Server(server, { cors: { origin: "*" } }); let activeUsers = 0; let publicRooms = new Set(); function broadcastStats() { io.emit('stats-update', { activeUsers: activeUsers, totalRooms: publicRooms.size, rooms: Array.from(publicRooms) }); } io.on('connection', (socket) => { activeUsers++; broadcastStats(); // Pemain membuat room socket.on('create-room', (roomCode) => { socket.join(roomCode); publicRooms.add(roomCode); broadcastStats(); }); // Pemain bergabung ke room socket.on('join-room', (roomCode) => { const room = io.sockets.adapter.rooms.get(roomCode); if (room && room.size === 1) { socket.join(roomCode); // Sembunyikan room dari lobi karena sudah penuh (2 orang) publicRooms.delete(roomCode); broadcastStats(); // Tentukan warna: Pembuat room = Putih ('w'), Joiner = Hitam ('b') const clients = Array.from(room); io.to(clients[0]).emit('game-start', 'w'); io.to(clients[1]).emit('game-start', 'b'); } else { socket.emit('room-error', 'Room tidak ditemukan atau sudah penuh!'); } }); // Kirim langkah catur ke lawan socket.on('send-move', (data) => { socket.to(data.roomCode).emit('receive-move', data.move); }); // Pemain keluar room secara manual socket.on('leave-room', (roomCode) => { socket.leave(roomCode); publicRooms.delete(roomCode); socket.to(roomCode).emit('opponent-disconnected'); broadcastStats(); }); // Pemain disconnect (tutup aplikasi/hilang sinyal) socket.on('disconnecting', () => { for (const room of socket.rooms) { if (room !== socket.id) { socket.to(room).emit('opponent-disconnected'); publicRooms.delete(room); } } }); socket.on('disconnect', () => { activeUsers--; broadcastStats(); }); }); // Port 7860 adalah aturan mutlak dari Hugging Face Spaces const PORT = 7860; server.listen(PORT, () => { console.log(`Server CREATE BY SIGIT siap tempur di port ${PORT}`); });