minen update 5
This commit is contained in:
parent
ca71c379a6
commit
02f2369cd6
@ -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" });
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user