minen update 5

This commit is contained in:
Cay 2026-03-16 14:09:05 +00:00
parent ca71c379a6
commit 02f2369cd6

View File

@ -1,7 +1,7 @@
const express = require("express"); const express = require("express");
const router = require("express").Router(); const router = require("express").Router();
const db = require("../database/database"); const db = require("../database/database");
const auth = require("../middleware/auth"); const auth = require("../middleware/auth");
/* /*
HELPER: Timer sicherstellen HELPER: Timer sicherstellen
@ -12,12 +12,12 @@ const auth = require("../middleware/auth");
async function ensureTimer(userBuildingId) { async function ensureTimer(userBuildingId) {
const [[existing]] = await db.query( const [[existing]] = await db.query(
"SELECT last_collected FROM building_collect_timer WHERE user_building_id = ?", "SELECT last_collected FROM building_collect_timer WHERE user_building_id = ?",
[userBuildingId] [userBuildingId],
); );
if (!existing) { if (!existing) {
await db.query( await db.query(
"INSERT INTO building_collect_timer (user_building_id, last_collected) VALUES (?, NOW())", "INSERT INTO building_collect_timer (user_building_id, last_collected) VALUES (?, NOW())",
[userBuildingId] [userBuildingId],
); );
} }
} }
@ -45,7 +45,7 @@ async function loadMineData(userId, buildingId) {
WHERE ub.user_id = ? WHERE ub.user_id = ?
AND ub.building_id = ? AND ub.building_id = ?
`, `,
[userId, buildingId] [userId, buildingId],
); );
return rows; return rows;
} }
@ -54,14 +54,14 @@ async function loadMineData(userId, buildingId) {
GET /api/mine/:buildingId/status GET /api/mine/:buildingId/status
*/ */
router.get("/:buildingId/status", auth, async (req, res) => { router.get("/:buildingId/status", auth, async (req, res) => {
const userId = req.session.user.id; const userId = req.session.user.id;
const buildingId = req.params.buildingId; const buildingId = req.params.buildingId;
try { try {
// user_building holen // user_building holen
const [[userBuilding]] = await db.query( const [[userBuilding]] = await db.query(
"SELECT id, level FROM user_buildings WHERE user_id = ? AND building_id = ?", "SELECT id, level FROM user_buildings WHERE user_id = ? AND building_id = ?",
[userId, buildingId] [userId, buildingId],
); );
if (!userBuilding) { if (!userBuilding) {
@ -78,31 +78,32 @@ router.get("/:buildingId/status", auth, async (req, res) => {
const { cycle_seconds, last_collected, level } = rows[0]; const { cycle_seconds, last_collected, level } = rows[0];
const elapsed = Math.floor((Date.now() - new Date(last_collected).getTime()) / 1000); const elapsed = Math.floor(
const cycles = Math.floor(elapsed / cycle_seconds); (Date.now() - new Date(last_collected).getTime()) / 1000,
const nextIn = cycle_seconds - (elapsed % cycle_seconds); );
const cycles = Math.floor(elapsed / cycle_seconds);
const nextIn = cycle_seconds - (elapsed % cycle_seconds);
const available = rows.map((r) => ({ const available = rows.map((r) => ({
resource: r.resource, resource: r.resource,
amount: r.amount * cycles, amount: r.amount * cycles,
})); }));
const production = rows.map((r) => ({ const production = rows.map((r) => ({
resource: r.resource, resource: r.resource,
amount: r.amount, amount: r.amount,
})); }));
res.json({ res.json({
level, level,
cycles, cycles,
ready: cycles > 0, ready: cycles > 0,
available, available,
production, production,
last_collected, last_collected,
next_cycle_in_seconds: nextIn, next_cycle_in_seconds: nextIn,
cycle_seconds, cycle_seconds,
}); });
} catch (err) { } catch (err) {
console.error(err); console.error(err);
res.status(500).json({ error: "DB Fehler" }); res.status(500).json({ error: "DB Fehler" });
@ -114,14 +115,14 @@ router.get("/:buildingId/status", auth, async (req, res) => {
Ressourcen gutschreiben + Timer reset Ressourcen gutschreiben + Timer reset
*/ */
router.post("/:buildingId/collect", auth, async (req, res) => { router.post("/:buildingId/collect", auth, async (req, res) => {
const userId = req.session.user.id; const userId = req.session.user.id;
const buildingId = req.params.buildingId; const buildingId = req.params.buildingId;
try { try {
// user_building holen // user_building holen
const [[userBuilding]] = await db.query( const [[userBuilding]] = await db.query(
"SELECT id FROM user_buildings WHERE user_id = ? AND building_id = ?", "SELECT id FROM user_buildings WHERE user_id = ? AND building_id = ?",
[userId, buildingId] [userId, buildingId],
); );
if (!userBuilding) { if (!userBuilding) {
@ -138,51 +139,61 @@ router.post("/:buildingId/collect", auth, async (req, res) => {
const { user_building_id, cycle_seconds, last_collected } = rows[0]; const { user_building_id, cycle_seconds, last_collected } = rows[0];
const elapsed = Math.floor((Date.now() - new Date(last_collected).getTime()) / 1000); const elapsed = Math.floor(
const cycles = Math.floor(elapsed / cycle_seconds); (Date.now() - new Date(last_collected).getTime()) / 1000,
);
const cycles = Math.floor(elapsed / cycle_seconds);
if (cycles < 1) { if (cycles < 1) {
const waitSeconds = cycle_seconds - elapsed; const waitSeconds = cycle_seconds - elapsed;
const minutes = Math.floor(waitSeconds / 60); const minutes = Math.floor(waitSeconds / 60);
const seconds = waitSeconds % 60; const seconds = waitSeconds % 60;
return res.json({ return res.json({
error: "Noch nichts bereit", error: "Noch nichts bereit",
ready_in_seconds: waitSeconds, ready_in_seconds: waitSeconds,
ready_in_display: `${minutes}m ${seconds}s`, ready_in_display: `${minutes}m ${seconds}s`,
}); });
} }
// ── Alle Ressourcen atomar in EINEM Query schreiben ────────────── // Jede Ressource einzeln gutschreiben
// Verhindert inkonsistente Zustände bei Verbindungsabbrüchen const allowedResources = [
const setClauses = rows "gold",
.map((r) => `\`${r.resource}\` = \`${r.resource}\` + ${r.amount * cycles}`) "silver",
.join(", "); "copper",
"iron",
"wood",
"stone",
"gems",
];
await db.query( for (const row of rows) {
`INSERT INTO account_currency (account_id) if (!allowedResources.includes(row.resource)) continue;
VALUES (?)
ON DUPLICATE KEY UPDATE ${setClauses}`, const toAdd = row.amount * cycles;
[userId]
); await db.query(
`UPDATE account_currency SET \`${row.resource}\` = \`${row.resource}\` + ? WHERE account_id = ?`,
[toAdd, userId],
);
}
// Timer zuruecksetzen: last_collected um genau die abgeschlossenen // Timer zuruecksetzen: last_collected um genau die abgeschlossenen
// Zyklen vorruecken Restsekunden bleiben erhalten, kein Verlust // Zyklen vorruecken Restsekunden bleiben erhalten, kein Verlust
const newLastCollected = new Date( const newLastCollected = new Date(
new Date(last_collected).getTime() + cycles * cycle_seconds * 1000 new Date(last_collected).getTime() + cycles * cycle_seconds * 1000,
); );
await db.query( await db.query(
"UPDATE building_collect_timer SET last_collected = ? WHERE user_building_id = ?", "UPDATE building_collect_timer SET last_collected = ? WHERE user_building_id = ?",
[newLastCollected, user_building_id] [newLastCollected, user_building_id],
); );
const collected = rows.map((r) => ({ const collected = rows.map((r) => ({
resource: r.resource, resource: r.resource,
amount: r.amount * cycles, amount: r.amount * cycles,
})); }));
res.json({ success: true, cycles, collected }); res.json({ success: true, cycles, collected });
} catch (err) { } catch (err) {
console.error(err); console.error(err);
res.status(500).json({ error: "DB Fehler" }); res.status(500).json({ error: "DB Fehler" });