v3: fix tasks saving and selection for rebirth reroll and reset (server-only)

This commit is contained in:
Matteo Pagliazzi
2016-05-16 12:04:09 +02:00
parent ba1628427e
commit 793ca3b172
4 changed files with 42 additions and 25 deletions

View File

@@ -11,16 +11,11 @@ import equip from './equip';
const USERSTATSLIST = ['per', 'int', 'con', 'str', 'points', 'gp', 'exp', 'mp'];
module.exports = function rebirth (user, tasks = [], req = {}, analytics) {
let analyticsData;
let flags;
let lvl;
let stats;
if (user.balance < 2 && user.stats.lvl < MAX_LEVEL) {
throw new NotAuthorized(i18n.t('notEnoughGems', req.language));
}
analyticsData = {
let analyticsData = {
uuid: user._id,
category: 'behavior',
};
@@ -38,18 +33,20 @@ module.exports = function rebirth (user, tasks = [], req = {}, analytics) {
analytics.track('Rebirth', analyticsData);
}
lvl = capByLevel(user.stats.lvl);
let lvl = capByLevel(user.stats.lvl);
_.each(tasks, function resetTasks (task) {
if (task.type !== 'reward') {
task.value = 0;
}
if (task.type === 'daily') {
task.streak = 0;
if (!task.challenge || !task.challenge.id || task.challenge.broken) {
if (task.type !== 'reward') {
task.value = 0;
}
if (task.type === 'daily') {
task.streak = 0;
}
}
});
stats = user.stats;
let stats = user.stats;
stats.buffs = {};
stats.hp = 50;
stats.lvl = 1;
@@ -79,7 +76,7 @@ module.exports = function rebirth (user, tasks = [], req = {}, analytics) {
});
}
flags = user.flags;
let flags = user.flags;
if (!user.achievements.beastMaster) {
flags.rebirthEnabled = false;
}

View File

@@ -13,8 +13,10 @@ module.exports = function reroll (user, tasks = [], req = {}, analytics) {
user.stats.hp = 50;
_.each(tasks, function resetTaskValues (task) {
if (task.type !== 'reward') {
task.value = 0;
if (!task.challenge || !task.challenge.id || task.challenge.broken) {
if (task.type !== 'reward') {
task.value = 0;
}
}
});

View File

@@ -13,7 +13,6 @@ module.exports = function reset (user, tasks = [], req = {}) {
tasksToRemove.push(task._id);
let i = user.tasksOrder[`${task.type}s`].indexOf(task._id);
if (i !== -1) user.tasksOrder[`${task.type}s`].splice(i, 1);
tasksToRemove.push(task._id);
}
});

View File

@@ -1106,16 +1106,22 @@ api.userRebirth = {
url: '/user/rebirth',
async handler (req, res) {
let user = res.locals.user;
let query = {
let tasks = await Tasks.Task.find({
userId: user._id,
type: {$in: ['daily', 'habit', 'todo']},
};
let tasks = await Tasks.Task.find(query).exec();
$or: [ // exclude challenge tasks
{'challenge.id': {$exists: false}},
{'challenge.broken': {$exists: true}},
],
}).exec();
let rebirthRes = common.ops.rebirth(user, tasks, req, res.analytics);
await user.save();
let toSave = tasks.map(task => task.save());
await Bluebird.all(tasks.map(task => task.save()));
toSave.push(user.save());
await Bluebird.all(toSave);
res.respond(200, ...rebirthRes);
},
@@ -1224,6 +1230,10 @@ api.userReroll = {
let query = {
userId: user._id,
type: {$in: ['daily', 'habit', 'todo']},
$or: [ // exclude challenge tasks
{'challenge.id': {$exists: false}},
{'challenge.broken': {$exists: true}},
],
};
let tasks = await Tasks.Task.find(query).exec();
let rerollRes = common.ops.reroll(user, tasks, req, res.analytics);
@@ -1280,11 +1290,20 @@ api.userReset = {
async handler (req, res) {
let user = res.locals.user;
let tasks = await Tasks.Task.find({userId: user._id}).select('_id type challenge').exec();
let tasks = await Tasks.Task.find({
userId: user._id,
$or: [ // exclude challenge tasks
{'challenge.id': {$exists: false}},
{'challenge.broken': {$exists: true}},
],
}).select('_id type challenge').exec();
let resetRes = common.ops.reset(user, tasks);
let resetRes = common.ops.reset(user, tasks, req);
await Bluebird.all([Tasks.Task.remove({_id: {$in: resetRes[0].tasksToRemove}, userId: user._id}), user.save()]);
await Bluebird.all([
Tasks.Task.remove({_id: {$in: resetRes[0].tasksToRemove}, userId: user._id}),
user.save(),
]);
res.respond(200, ...resetRes);
},