This commit is contained in:
Cay 2026-03-14 14:12:49 +00:00
parent d36914c7d6
commit b7e227f7f7
3 changed files with 174 additions and 11 deletions

View File

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

View File

@ -4,28 +4,51 @@ export async function loadSchwarzmarkt() {
ui.innerHTML = `
<h2>Schwarzmarkt</h2>
<div id="market-info"></div>
<button id="buy-page">Inventarseite kaufen</button>
<div id="market-pages"></div>
`;
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 = `
<p>Freigeschaltete Seiten: ${data.ownedPages} / ${data.maxPages}</p>
<p>Inventarslots: ${data.slots}</p>
let html = "";
for (let i = 1; i <= 8; i++) {
if (data.ownedPages.includes(i)) {
html += `
<div class="market-page owned">
Seite ${i}
</div>
`;
} else {
const price = data.prices.find((p) => p.page === i);
if (price) {
html += `
<div class="market-page buy" data-page="${i}">
Seite ${i} Kaufen (${price.price} Gold)
</div>
`;
} else {
html += `
<div class="market-page locked">
Seite ${i} 🔒
</div>
`;
}
}
}
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();
});

View File

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