116 lines
3.0 KiB
JavaScript
116 lines
3.0 KiB
JavaScript
const TasksModel = require("./tasks.model.js");
|
|
const UserModel = require("../users/users.model.js");
|
|
// Task status constants
|
|
const TASK_STATUS = {
|
|
ACTIVE: 0,
|
|
COMPLETED: 1,
|
|
EXPIRED: 2,
|
|
CLAIMED: 3
|
|
};
|
|
|
|
// Task condition types
|
|
const TASK_CONDITION_TYPES = {
|
|
LOGIN_GAME: 1,
|
|
PLAY_GAMES: 2,
|
|
WIN_GAMES: 3,
|
|
DEFEAT_HERO_WITH_ATTRIBUTES: 4,
|
|
SUMMON_HERO_WITH_ATTRIBUTES: 5,
|
|
USE_HERO_SKILL_WITH_ATTRIBUTES: 6
|
|
};
|
|
|
|
// Task reward types
|
|
const TASK_REWARD_TYPES = {
|
|
COINS: 0
|
|
};
|
|
|
|
// Check if a task is expired
|
|
exports.isTaskExpired = (task) => {
|
|
return new Date() > new Date(task.expireTime);
|
|
};
|
|
|
|
// Check if a task is completed
|
|
exports.isTaskCompleted = (task) => {
|
|
return task.status === TASK_STATUS.COMPLETED;
|
|
};
|
|
|
|
// Check if a task is claimed
|
|
exports.isTaskClaimed = (task) => {
|
|
return task.status === TASK_STATUS.CLAIMED;
|
|
};
|
|
|
|
// Get a random task from the configuration
|
|
exports.getRandomTask = async () => {
|
|
const tasks = await TasksModel.getAllTaskConfigs();
|
|
if (tasks.length === 0) {
|
|
return null;
|
|
}
|
|
|
|
const randomIndex = Math.floor(Math.random() * tasks.length);
|
|
return tasks[randomIndex];
|
|
};
|
|
|
|
// Create a new player task based on task configuration
|
|
exports.createPlayerTask = async (taskConfig) => {
|
|
const now = new Date();
|
|
const expireTime = new Date(now.getTime() + (taskConfig.durationHours * 60 * 60 * 1000));
|
|
|
|
return {
|
|
taskId: taskConfig.id,
|
|
assignedTime: now,
|
|
expireTime: expireTime,
|
|
status: TASK_STATUS.ACTIVE,
|
|
progress: 0
|
|
};
|
|
};
|
|
|
|
// Update task progress
|
|
exports.updateTaskProgress = async (playerTask, taskConfig, increment = 1) => {
|
|
// Check if task is already completed or claimed
|
|
if (playerTask.status === TASK_STATUS.COMPLETED || playerTask.status === TASK_STATUS.CLAIMED) {
|
|
return playerTask;
|
|
}
|
|
|
|
// Update progress
|
|
playerTask.progress += increment;
|
|
|
|
// Check if task is completed
|
|
if (playerTask.progress >= taskConfig.value1) {
|
|
playerTask.progress = taskConfig.value1; // Cap at the required value
|
|
playerTask.status = TASK_STATUS.COMPLETED;
|
|
}
|
|
|
|
return playerTask;
|
|
};
|
|
|
|
// Give reward for completing a task
|
|
exports.giveTaskReward = async (userId, taskConfig) => {
|
|
// In a real implementation, this would integrate with the rewards system
|
|
// For now, we'll just log the reward information
|
|
|
|
for (let i = 0; i < taskConfig.rewardTypes.length; i++) {
|
|
const rewardType = taskConfig.rewardTypes[i];
|
|
const rewardNum = taskConfig.rewardNums[i];
|
|
const user = await UserModel.getById(userId);
|
|
switch (rewardType) {
|
|
case TASK_REWARD_TYPES.COINS:
|
|
user.coins += rewardNum;
|
|
break;
|
|
case TASK_REWARD_TYPES.CRYSTALS:
|
|
user.crystals += rewardNum;
|
|
break;
|
|
case TASK_REWARD_TYPES.CARD_FRAGMENTS:
|
|
user.cardfragments += rewardNum;
|
|
break;
|
|
default:
|
|
console.log(`Unknown reward type: ${rewardType}`);
|
|
}
|
|
|
|
}
|
|
await user.save();
|
|
return true;
|
|
};
|
|
|
|
// Export constants
|
|
exports.TASK_STATUS = TASK_STATUS;
|
|
exports.TASK_CONDITION_TYPES = TASK_CONDITION_TYPES;
|
|
exports.TASK_REWARD_TYPES = TASK_REWARD_TYPES; |