diff --git a/public/css/building.css b/public/css/building.css index 810eacb..278aaa2 100644 --- a/public/css/building.css +++ b/public/css/building.css @@ -529,3 +529,43 @@ body { transform: translate(-50%, -50%); } } + +/* ========================= + Schwarzmarkt +========================= */ +#market-pages { + display: flex; + flex-direction: column; + + gap: 8px; + + margin-top: 15px; +} + +.market-page { + padding: 8px 12px; + + border: 1px solid #8b6a3c; + + background: rgba(0, 0, 0, 0.15); +} + +.market-page.owned { + color: #3cff3c; +} + +.market-page.buy { + cursor: pointer; + + background: #6b4b2a; + + color: white; +} + +.market-page.buy:hover { + background: #8b6a3c; +} + +.market-page.locked { + opacity: 0.4; +} diff --git a/public/js/buildings/schwarzmarkt.js b/public/js/buildings/schwarzmarkt.js index 3eef8a0..42de1f3 100644 --- a/public/js/buildings/schwarzmarkt.js +++ b/public/js/buildings/schwarzmarkt.js @@ -4,28 +4,51 @@ export async function loadSchwarzmarkt() { ui.innerHTML = `

Schwarzmarkt

-
- - +
`; - loadMarketInfo(); + loadPages(); } -async function loadMarketInfo() { +async function loadPages() { const res = await fetch("/api/blackmarket/pages"); const data = await res.json(); - const info = document.getElementById("market-info"); + const container = document.getElementById("market-pages"); - info.innerHTML = ` -

Freigeschaltete Seiten: ${data.ownedPages} / ${data.maxPages}

-

Inventarslots: ${data.slots}

+ let html = ""; + + for (let i = 1; i <= 8; i++) { + if (data.ownedPages.includes(i)) { + html += ` +
+Seite ${i} ✔ +
`; + } else { + const price = data.prices.find((p) => p.page === i); + + if (price) { + html += ` +
+Seite ${i} Kaufen (${price.price} Gold) +
+`; + } else { + html += ` +
+Seite ${i} 🔒 +
+`; + } + } + } + + container.innerHTML = html; } document.addEventListener("click", async (e) => { - if (e.target.id !== "buy-page") return; + if (!e.target.classList.contains("buy")) return; const res = await fetch("/api/blackmarket/buy-page", { method: "POST", @@ -40,5 +63,5 @@ document.addEventListener("click", async (e) => { alert("Seite " + data.page + " freigeschaltet!"); - location.reload(); + loadPages(); }); diff --git a/routes/blackmarket.js b/routes/blackmarket.js index 9e1ef82..43d7686 100644 --- a/routes/blackmarket.js +++ b/routes/blackmarket.js @@ -3,4 +3,104 @@ const router = express.Router(); const db = require("../database/database"); const auth = require("../middleware/auth"); +router.get("/pages", auth, async (req, res) => { + const userId = req.session.user.id; + + try { + const [owned] = await db.query( + ` + SELECT page + FROM user_inventory_pages + WHERE user_id = ? + ORDER BY page + `, + [userId], + ); + + const [prices] = await db.query(` + SELECT page, price + FROM inventory_page_prices + ORDER BY page + `); + + res.json({ + ownedPages: owned.map((p) => p.page), + prices: prices, + }); + } catch (err) { + console.error(err); + res.status(500).json({ error: "DB Fehler" }); + } +}); + +router.post("/buy-page", auth, async (req, res) => { + const userId = req.session.user.id; + + try { + const [[maxPage]] = await db.query( + ` + SELECT MAX(page) AS page + FROM user_inventory_pages + WHERE user_id = ? + `, + [userId], + ); + + const nextPage = (maxPage.page || 1) + 1; + + const [[priceRow]] = await db.query( + ` + SELECT price + FROM inventory_page_prices + WHERE page = ? + `, + [nextPage], + ); + + if (!priceRow) { + return res.json({ error: "Max Seiten erreicht" }); + } + + const price = priceRow.price; + + const [[account]] = await db.query( + ` + SELECT gold + FROM accounts + WHERE id = ? + `, + [userId], + ); + + if (account.gold < price) { + return res.json({ error: "Nicht genug Gold" }); + } + + await db.query( + ` + UPDATE accounts + SET gold = gold - ? + WHERE id = ? + `, + [price, userId], + ); + + await db.query( + ` + INSERT INTO user_inventory_pages (user_id,page) + VALUES (?,?) + `, + [userId, nextPage], + ); + + res.json({ + success: true, + page: nextPage, + }); + } catch (err) { + console.error(err); + res.status(500).json({ error: "DB Fehler" }); + } +}); + module.exports = router;