feat: Add real-time event handling and chunk analysis endpoints for turtles

This commit is contained in:
MayaTheShy
2026-02-20 02:15:26 -05:00
parent ff58778f3f
commit 8731da04f9

View File

@@ -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