From 8731da04f9570c1f3d466697d70ea4f73324efb0 Mon Sep 17 00:00:00 2001 From: MayaTheShy Date: Fri, 20 Feb 2026 02:15:26 -0500 Subject: [PATCH] feat: Add real-time event handling and chunk analysis endpoints for turtles --- server/server.js | 88 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/server/server.js b/server/server.js index f36820e..554bd43 100644 --- a/server/server.js +++ b/server/server.js @@ -384,6 +384,28 @@ app.post('/api/turtle/:id/commands/ack', (req, res) => { } }); +// Receive real-time events from turtles (inventory, peripherals) +app.post('/api/turtle/event', (req, res) => { + try { + const { turtleID, type, message } = req.body; + + if (!turtleID || !type) { + return res.status(400).json({ error: 'Missing turtleID or type' }); + } + + const turtle = turtles.get(turtleID); + if (turtle) { + turtle.handleEvent(type, message); + console.log(`📡 Event from T#${turtleID}: ${type}`); + } + + res.json({ success: true }); + } catch (error) { + console.error('❌ Error processing turtle event:', error); + res.status(500).json({ error: error.message }); + } +}); + // Get all turtles app.get('/api/turtles', (req, res) => { res.json({ @@ -970,6 +992,72 @@ app.post('/api/mining-areas/:areaId/close', (req, res) => { } }); +// ========== CHUNK ANALYSIS ENDPOINTS ========== + +// Get all chunk analyses +app.get('/api/chunks', (req, res) => { + try { + const chunks = db.getAllChunkAnalyses(); + res.json(chunks); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +// Get specific chunk analysis +app.get('/api/chunks/:x/:z', (req, res) => { + try { + const x = parseInt(req.params.x); + const z = parseInt(req.params.z); + const chunk = db.getChunkAnalysis(x, z); + res.json(chunk || { x, z, analysis: {} }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +// Save chunk analysis +app.post('/api/chunks', (req, res) => { + try { + const { x, z, analysis } = req.body; + db.saveChunkAnalysis(x, z, analysis || {}); + res.json({ success: true }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +// Search blocks by name pattern in area +app.get('/api/world/blocks/search', (req, res) => { + try { + const { fromX, fromY, fromZ, toX, toY, toZ, pattern } = req.query; + if (!pattern) { + return res.status(400).json({ error: 'Missing pattern parameter' }); + } + const blocks = db.getBlocksWithNameLike( + parseInt(fromX) || -1000, parseInt(fromY) || -64, parseInt(fromZ) || -1000, + parseInt(toX) || 1000, parseInt(toY) || 320, parseInt(toZ) || 1000, + pattern + ); + res.json({ blocks }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +// Get single block info +app.get('/api/world/block/:x/:y/:z', (req, res) => { + try { + const x = parseInt(req.params.x); + const y = parseInt(req.params.y); + const z = parseInt(req.params.z); + const block = db.getBlock(x, y, z); + res.json(block || null); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + // ========== STATISTICS ENDPOINTS ========== // Get server statistics