Spaces:
Running
Running
| 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}`); | |
| }); |