Sm2
This commit is contained in:
parent
d36914c7d6
commit
b7e227f7f7
@ -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;
|
||||
}
|
||||
|
||||
@ -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();
|
||||
});
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user