You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
3.0 KiB
107 lines
3.0 KiB
const express = require('express');
|
|
const http = require('http');
|
|
const { Server } = require("socket.io");
|
|
const fs = require('fs').promises;
|
|
const path = require('path');
|
|
|
|
const app = express();
|
|
const server = http.createServer(app);
|
|
const io = new Server(server);
|
|
|
|
// Serve your existing static files (HTML, JS, CSS)
|
|
app.use(express.static(__dirname));
|
|
|
|
// File path for persistent storage
|
|
const DRAWINGS_FILE = path.join(__dirname, 'data', 'drawings.json');
|
|
const RATE_LIMIT_MS = 50; // Minimum time between draws
|
|
const lastDrawTime = {};
|
|
|
|
async function loadDrawings() {
|
|
try {
|
|
await fs.mkdir(path.join(__dirname, 'data'), { recursive: true });
|
|
const data = await fs.readFile(DRAWINGS_FILE, 'utf8');
|
|
drawings = JSON.parse(data);
|
|
console.log('Loaded drawings:', Object.keys(drawings).length);
|
|
} catch (error) {
|
|
if (error.code !== 'ENOENT') {
|
|
console.error('Error loading drawings:', error);
|
|
}
|
|
drawings = {};
|
|
console.log('No existing drawings found, starting fresh');
|
|
}
|
|
}
|
|
|
|
// Save drawings to file
|
|
async function saveDrawings() {
|
|
try {
|
|
await fs.writeFile(DRAWINGS_FILE, JSON.stringify(drawings));
|
|
} catch (error) {
|
|
console.error('Error saving drawings:', error);
|
|
}
|
|
}
|
|
|
|
// Initialize drawings from file
|
|
loadDrawings();
|
|
|
|
let players = {};
|
|
let drawings = {};
|
|
|
|
io.on('connection', (socket) => {
|
|
console.log('A user connected:', socket.id);
|
|
|
|
// Create a new player and add them to the players object
|
|
players[socket.id] = {
|
|
rotation: { x: 0, y: 0, z: 0 },
|
|
position: { x: 0, y: 1, z: 0 },
|
|
socketId: socket.id
|
|
};
|
|
|
|
// Send the new player the list of all other players
|
|
socket.emit('currentPlayers', players);
|
|
|
|
// Announce the new player to all other players
|
|
socket.broadcast.emit('newPlayer', players[socket.id]);
|
|
|
|
// Handle player disconnection
|
|
socket.on('disconnect', () => {
|
|
console.log('User disconnected:', socket.id);
|
|
delete players[socket.id];
|
|
// Announce the player's disconnection to all other players
|
|
io.emit('playerDisconnected', socket.id);
|
|
});
|
|
|
|
// Handle player movement updates
|
|
socket.on('playerMovement', (movementData) => {
|
|
if (players[socket.id]) {
|
|
players[socket.id].position = movementData.position;
|
|
players[socket.id].rotation = movementData.rotation;
|
|
// Broadcast the movement to all other players
|
|
socket.broadcast.emit('playerMoved', players[socket.id]);
|
|
}
|
|
});
|
|
|
|
// Send existing drawings to new players
|
|
socket.emit('initialDrawings', drawings);
|
|
|
|
socket.on('drawingUpdate', async (drawData) => {
|
|
const { objectId, drawData: data } = drawData;
|
|
|
|
if (!drawings[objectId]) {
|
|
drawings[objectId] = [];
|
|
}
|
|
|
|
drawings[objectId].push(data);
|
|
await saveDrawings();
|
|
|
|
socket.broadcast.emit('drawingUpdated', {
|
|
objectId: objectId,
|
|
drawData: data
|
|
});
|
|
});
|
|
|
|
});
|
|
|
|
const PORT = process.env.PORT || 3000;
|
|
server.listen(PORT, () => {
|
|
console.log(`Server listening on port ${PORT}`);
|
|
});
|