fix: migrate inventory to separate route file
authorxangelo <me@xangelo.ca>
Sat, 21 Oct 2023 03:25:53 +0000 (23:25 -0400)
committerxangelo <me@xangelo.ca>
Sat, 21 Oct 2023 03:25:53 +0000 (23:25 -0400)
src/server/routes/inventory.ts [new file with mode: 0644]

diff --git a/src/server/routes/inventory.ts b/src/server/routes/inventory.ts
new file mode 100644 (file)
index 0000000..6fc38fc
--- /dev/null
@@ -0,0 +1,90 @@
+import { Request, Response, Router } from 'express';
+import { logger } from '../lib/logger';
+import { authEndpoint } from '../auth';
+import { blockPlayerInFight } from '../fight';
+import { blockPlayerInDungeon } from '../dungeon';
+import {addInventoryItem, getEquippedItems, getInventory, getInventoryItem} from '../inventory';
+import { getItemFromPlayer, getItemFromShop, getPlayersItems, getShopItems, givePlayerItem, updateItemCount } from '../items';
+import { equip, unequip } from '../equipment';
+import { renderInventoryPage } from '../views/inventory';
+import { renderPlayerBar } from '../views/player-bar';
+import { EquipmentSlot } from '../../shared/inventory';
+
+export const inventoryRouter = Router();
+
+inventoryRouter.get('/player/inventory', authEndpoint, async (req: Request, res: Response) => {
+  const [inventory, items] = await Promise.all([
+    getInventory(req.player.id),
+    getPlayersItems(req.player.id)
+  ]);
+
+  res.send(renderInventoryPage(inventory, items));
+
+});
+
+inventoryRouter.post('/player/unequip/:item_id', authEndpoint, blockPlayerInFight, blockPlayerInDungeon, async (req: Request, res: Response) => {
+  const [item, ] = await Promise.all([
+    getInventoryItem(req.player.id, req.params.item_id),
+    unequip(req.player.id, req.params.item_id)
+  ]);
+
+  const [inventory, items] = await Promise.all([
+    getInventory(req.player.id),
+    getPlayersItems(req.player.id)
+  ]);
+
+  res.send(renderInventoryPage(inventory, items, item.type) + renderPlayerBar(req.player));
+});
+
+inventoryRouter.post('/player/equip/:item_id/:slot', authEndpoint, blockPlayerInFight, blockPlayerInDungeon, async (req: Request, res: Response) => {
+  const inventoryItem = await getInventoryItem(req.player.id, req.params.item_id);
+  const equippedItems = await getEquippedItems(req.player.id);
+  const requestedSlot = req.params.slot;
+  let desiredSlot: EquipmentSlot = inventoryItem.equipment_slot;
+
+  try {
+    // handes the situation where you're trying to equip an item 
+    // that can be equipped to any hand
+    if(inventoryItem.equipment_slot === 'ANY_HAND') {
+      if(requestedSlot === 'LEFT_HAND' || requestedSlot === 'RIGHT_HAND') {
+        // get the players current equipment in that slot!
+        if(equippedItems.some(v => {
+          return v.equipment_slot === requestedSlot || v.equipment_slot === 'TWO_HANDED';
+        })) {
+          throw new Error();
+        }
+        else {
+          desiredSlot = requestedSlot;
+        }
+      }
+    }
+
+    if(requestedSlot === 'TWO_HANDED') {
+      if(equippedItems.some(v => {
+        return v.equipment_slot === 'LEFT_HAND' || v.equipment_slot === 'RIGHT_HAND';
+      })) {
+        throw new Error();
+      }
+    }
+
+
+    await equip(req.player.id, inventoryItem, desiredSlot);
+    const socketId = req.rl.cache.get(`socket:${req.player.id}`).toString();
+    req.rl.io.to(socketId).emit('updatePlayer', req.player);
+    req.rl.io.to(socketId).emit('alert', {
+      type: 'success',
+      text: `You equipped your ${inventoryItem.name}`
+    });
+  }
+  catch(e) {
+    logger.log(e);
+  }
+
+  const [inventory, items] = await Promise.all([
+    getInventory(req.player.id),
+    getPlayersItems(req.player.id)
+  ]);
+
+  res.send(renderInventoryPage(inventory, items, inventoryItem.type) + renderPlayerBar(req.player));
+});
+