Sm2
This commit is contained in:
parent
d36914c7d6
commit
b7e227f7f7
@ -529,3 +529,43 @@ body {
|
|||||||
transform: translate(-50%, -50%);
|
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 = `
|
ui.innerHTML = `
|
||||||
<h2>Schwarzmarkt</h2>
|
<h2>Schwarzmarkt</h2>
|
||||||
|
|
||||||
<div id="market-info"></div>
|
<div id="market-pages"></div>
|
||||||
|
|
||||||
<button id="buy-page">Inventarseite kaufen</button>
|
|
||||||
`;
|
`;
|
||||||
|
|
||||||
loadMarketInfo();
|
loadPages();
|
||||||
}
|
}
|
||||||
|
|
||||||
async function loadMarketInfo() {
|
async function loadPages() {
|
||||||
const res = await fetch("/api/blackmarket/pages");
|
const res = await fetch("/api/blackmarket/pages");
|
||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
|
|
||||||
const info = document.getElementById("market-info");
|
const container = document.getElementById("market-pages");
|
||||||
|
|
||||||
info.innerHTML = `
|
let html = "";
|
||||||
<p>Freigeschaltete Seiten: ${data.ownedPages} / ${data.maxPages}</p>
|
|
||||||
<p>Inventarslots: ${data.slots}</p>
|
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) => {
|
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", {
|
const res = await fetch("/api/blackmarket/buy-page", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
@ -40,5 +63,5 @@ document.addEventListener("click", async (e) => {
|
|||||||
|
|
||||||
alert("Seite " + data.page + " freigeschaltet!");
|
alert("Seite " + data.page + " freigeschaltet!");
|
||||||
|
|
||||||
location.reload();
|
loadPages();
|
||||||
});
|
});
|
||||||
|
|||||||
@ -3,4 +3,104 @@ const router = express.Router();
|
|||||||
const db = require("../database/database");
|
const db = require("../database/database");
|
||||||
const auth = require("../middleware/auth");
|
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;
|
module.exports = router;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user