From 0eac9497de602c83f599a84010cb4319b6e7af22 Mon Sep 17 00:00:00 2001 From: MayaTheShy Date: Fri, 20 Feb 2026 01:23:05 -0500 Subject: [PATCH] feat: Implement block discovery endpoint and update worldBlocks state on discovery --- client/src/store/turtleStore.js | 9 +++++++ server/server.js | 45 ++++++++++++++++++++------------- 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/client/src/store/turtleStore.js b/client/src/store/turtleStore.js index 3fb71d4..af1c9c9 100644 --- a/client/src/store/turtleStore.js +++ b/client/src/store/turtleStore.js @@ -77,6 +77,15 @@ export const useTurtleStore = create((set, get) => ({ } } })); + } else if (data.type === 'block_discovered') { + if (data.block) { + set(state => { + const blockMap = new Map(state.worldBlocks.map(b => [`${b.x},${b.y},${b.z}`, b])); + const key = `${data.block.x},${data.block.y},${data.block.z}`; + blockMap.set(key, data.block); + return { worldBlocks: Array.from(blockMap.values()) }; + }); + } } } catch (error) { console.error('Error processing message:', error); diff --git a/server/server.js b/server/server.js index 147724a..75bfabb 100644 --- a/server/server.js +++ b/server/server.js @@ -364,6 +364,31 @@ app.get('/api/world/blocks', (req, res) => { res.json({ blocks }); }); +// Store a discovered block +app.post('/api/world/blocks', (req, res) => { + try { + const { x, y, z, blockName, metadata, discoveredBy } = req.body; + + if (x === undefined || y === undefined || z === undefined || !blockName) { + return res.status(400).json({ error: 'Missing required fields: x, y, z, blockName' }); + } + + const blockData = { name: blockName, metadata: metadata || 0 }; + storeBlock(x, y, z, blockData, discoveredBy); + + // Broadcast to web clients + broadcastToClients({ + type: 'block_discovered', + block: { x, y, z, name: blockName, metadata: metadata || 0, discoveredBy, timestamp: Date.now() } + }); + + res.json({ success: true }); + } catch (error) { + console.error('❌ Error storing block:', error); + res.status(500).json({ error: error.message }); + } +}); + // Send command to turtle app.post('/api/turtle/:id/command', (req, res) => { try { @@ -390,24 +415,6 @@ app.post('/api/turtle/:id/command', (req, res) => { } }); -// Cleanup stale turtles (haven't updated in 30 seconds) -setInterval(() => { - const now = Date.now(); - const timeout = 30000; // 30 seconds - - for (const [turtleID, turtle] of turtleData.entries()) { - if (now - turtle.lastUpdate > timeout) { - console.log(`🗑️ Removing stale turtle: ${turtleID}`); - turtleData.delete(turtleID); - - broadcastToClients({ - type: 'turtle_disconnected', - turtleID - }); - } - } -}, 10000); // Check every 10 seconds - // ========== PATH RECORDING ENDPOINTS ========== // Save a recorded path @@ -575,7 +582,9 @@ app.get('/api/stats', (req, res) => { try { const stats = { activeTurtles: turtleData.size, + turtles: turtleData.size, totalBlocks: worldBlocks.size, + blocks: worldBlocks.size, savedHomes: turtleHomes.size, connectedClients: webClients.size, tasks: db.getAllTasks().length,