diff --git a/web/server/server.js b/web/server/server.js index 40a6f54..02302c2 100644 --- a/web/server/server.js +++ b/web/server/server.js @@ -7,7 +7,7 @@ import path from 'path'; import { fileURLToPath } from 'url'; import { loadFullState, saveFullState, recordItemHistory, - saveItems, saveFurnaces, saveAlerts, saveState, + saveItems, saveFurnaces, saveAlerts, saveState, loadState, getHistory, getHistorySummary, closeDb, flushPendingSave, } from './db.js'; @@ -38,6 +38,7 @@ let smeltableRecipes = persisted.smeltableRecipes; let craftableRecipes = persisted.craftableRecipes; let craftTurtleOk = persisted.craftTurtleOk; let lastUpdate = persisted.lastUpdate; +let dropperNicknames = loadState('dropperNicknames', {}); if (lastUpdate > 0) { const ago = Math.round((Date.now() - lastUpdate) / 1000); @@ -210,6 +211,7 @@ app.get('/api/inventory', (req, res) => { craftTurtleOk, lastUpdate, bridgeConnected: bridgeClients.size > 0, + dropperNicknames, }); }); @@ -281,6 +283,33 @@ app.post('/api/order', (req, res) => { } }); +// ========== Dropper Nicknames ========== + +// Get all dropper nicknames +app.get('/api/dropper-nicknames', (req, res) => { + res.json({ nicknames: dropperNicknames }); +}); + +// Set a single dropper nickname +app.post('/api/dropper-nicknames', (req, res) => { + try { + const { dropperName, nickname } = req.body; + if (!dropperName) return res.status(400).json({ error: 'Missing dropperName' }); + + if (nickname && nickname.trim()) { + dropperNicknames[dropperName] = nickname.trim(); + } else { + delete dropperNicknames[dropperName]; + } + + saveState('dropperNicknames', dropperNicknames); + console.log(`🏷️ Dropper nickname: ${dropperName} → ${nickname || '(removed)'}`); + res.json({ success: true, nicknames: dropperNicknames }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + // Request inventory scan app.post('/api/scan', (req, res) => { try { @@ -630,6 +659,7 @@ wss.on('connection', (ws, req) => { craftTurtleOk, lastUpdate, bridgeConnected: bridgeClients.size > 0, + dropperNicknames, })); ws.on('pong', () => { ws.isAlive = true; });