API/game-server/src/sockets/handlers/questsHandler.js
2026-04-21 08:48:52 +03:00

90 lines
2.4 KiB
JavaScript

const questsManager = require("../../game/QuestsManager");
const DatapackLoader = require("../../game/DatapackLoader");
const { PlayerQuest } = require("../../models");
module.exports = (io, socket) => {
const playerId = socket.user?.id;
socket.on("quest:get_list", async () => {
if (!playerId) return;
try {
const autoQuests = DatapackLoader.getAutoStartQuests();
const existingQuests = await PlayerQuest.findAll({
where: { playerId },
attributes: ["questId"],
raw: true,
});
const existingIds = existingQuests.map((q) => q.questId);
const missingQuests = autoQuests.filter(
(aq) => !existingIds.includes(aq.id),
);
if (missingQuests.length > 0) {
const toCreate = missingQuests.map((aq) => ({
playerId,
questId: aq.id,
status: "active",
progress: aq.objectives.map((obj) => ({ ...obj, currentAmount: 0 })),
}));
await PlayerQuest.bulkCreate(toCreate, { ignoreDuplicates: true });
}
const all = await PlayerQuest.findAll({
where: { playerId },
order: [["updatedAt", "DESC"]],
});
socket.emit(
"quest:list_data",
all.map((q) => ({
id: q.questId,
status: q.status,
objectives: q.progress,
rewards: DatapackLoader.getQuest(q.questId)?.rewards,
})),
);
} catch (err) {
console.error("Quest sync error:", err);
}
});
socket.on("quest:claim_reward", async ({ questId }) => {
try {
const result = await questsManager.claimRewards(playerId, questId);
socket.emit("player:credits_update", {
totalCredits: result.newTotalCredits,
});
socket.emit("quest:reward_claimed", {
questId,
rewards: result.rewards,
});
const all = await PlayerQuest.findAll({
where: { playerId },
order: [["updatedAt", "DESC"]],
});
socket.emit(
"quest:list_data",
all.map((q) => ({
id: q.questId,
status: q.status,
objectives: q.progress,
rewards: DatapackLoader.getQuest(q.questId)?.rewards,
})),
);
} catch (err) {
const msg =
err.message === "QUEST_NOT_READY_OR_CLAIMED"
? "Reward already claimed or objective not met."
: "Failed to claim reward.";
socket.emit("error", { message: msg });
}
});
};