mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-18 07:07:35 +01:00
v3: fix tasks saving and selection for rebirth reroll and reset (server-only)
This commit is contained in:
@@ -11,16 +11,11 @@ import equip from './equip';
|
|||||||
const USERSTATSLIST = ['per', 'int', 'con', 'str', 'points', 'gp', 'exp', 'mp'];
|
const USERSTATSLIST = ['per', 'int', 'con', 'str', 'points', 'gp', 'exp', 'mp'];
|
||||||
|
|
||||||
module.exports = function rebirth (user, tasks = [], req = {}, analytics) {
|
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) {
|
if (user.balance < 2 && user.stats.lvl < MAX_LEVEL) {
|
||||||
throw new NotAuthorized(i18n.t('notEnoughGems', req.language));
|
throw new NotAuthorized(i18n.t('notEnoughGems', req.language));
|
||||||
}
|
}
|
||||||
|
|
||||||
analyticsData = {
|
let analyticsData = {
|
||||||
uuid: user._id,
|
uuid: user._id,
|
||||||
category: 'behavior',
|
category: 'behavior',
|
||||||
};
|
};
|
||||||
@@ -38,18 +33,20 @@ module.exports = function rebirth (user, tasks = [], req = {}, analytics) {
|
|||||||
analytics.track('Rebirth', analyticsData);
|
analytics.track('Rebirth', analyticsData);
|
||||||
}
|
}
|
||||||
|
|
||||||
lvl = capByLevel(user.stats.lvl);
|
let lvl = capByLevel(user.stats.lvl);
|
||||||
|
|
||||||
_.each(tasks, function resetTasks (task) {
|
_.each(tasks, function resetTasks (task) {
|
||||||
if (task.type !== 'reward') {
|
if (!task.challenge || !task.challenge.id || task.challenge.broken) {
|
||||||
task.value = 0;
|
if (task.type !== 'reward') {
|
||||||
}
|
task.value = 0;
|
||||||
if (task.type === 'daily') {
|
}
|
||||||
task.streak = 0;
|
if (task.type === 'daily') {
|
||||||
|
task.streak = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
stats = user.stats;
|
let stats = user.stats;
|
||||||
stats.buffs = {};
|
stats.buffs = {};
|
||||||
stats.hp = 50;
|
stats.hp = 50;
|
||||||
stats.lvl = 1;
|
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) {
|
if (!user.achievements.beastMaster) {
|
||||||
flags.rebirthEnabled = false;
|
flags.rebirthEnabled = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,8 +13,10 @@ module.exports = function reroll (user, tasks = [], req = {}, analytics) {
|
|||||||
user.stats.hp = 50;
|
user.stats.hp = 50;
|
||||||
|
|
||||||
_.each(tasks, function resetTaskValues (task) {
|
_.each(tasks, function resetTaskValues (task) {
|
||||||
if (task.type !== 'reward') {
|
if (!task.challenge || !task.challenge.id || task.challenge.broken) {
|
||||||
task.value = 0;
|
if (task.type !== 'reward') {
|
||||||
|
task.value = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ module.exports = function reset (user, tasks = [], req = {}) {
|
|||||||
tasksToRemove.push(task._id);
|
tasksToRemove.push(task._id);
|
||||||
let i = user.tasksOrder[`${task.type}s`].indexOf(task._id);
|
let i = user.tasksOrder[`${task.type}s`].indexOf(task._id);
|
||||||
if (i !== -1) user.tasksOrder[`${task.type}s`].splice(i, 1);
|
if (i !== -1) user.tasksOrder[`${task.type}s`].splice(i, 1);
|
||||||
tasksToRemove.push(task._id);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1106,16 +1106,22 @@ api.userRebirth = {
|
|||||||
url: '/user/rebirth',
|
url: '/user/rebirth',
|
||||||
async handler (req, res) {
|
async handler (req, res) {
|
||||||
let user = res.locals.user;
|
let user = res.locals.user;
|
||||||
let query = {
|
let tasks = await Tasks.Task.find({
|
||||||
userId: user._id,
|
userId: user._id,
|
||||||
type: {$in: ['daily', 'habit', 'todo']},
|
type: {$in: ['daily', 'habit', 'todo']},
|
||||||
};
|
$or: [ // exclude challenge tasks
|
||||||
let tasks = await Tasks.Task.find(query).exec();
|
{'challenge.id': {$exists: false}},
|
||||||
|
{'challenge.broken': {$exists: true}},
|
||||||
|
],
|
||||||
|
}).exec();
|
||||||
|
|
||||||
let rebirthRes = common.ops.rebirth(user, tasks, req, res.analytics);
|
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);
|
res.respond(200, ...rebirthRes);
|
||||||
},
|
},
|
||||||
@@ -1224,6 +1230,10 @@ api.userReroll = {
|
|||||||
let query = {
|
let query = {
|
||||||
userId: user._id,
|
userId: user._id,
|
||||||
type: {$in: ['daily', 'habit', 'todo']},
|
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 tasks = await Tasks.Task.find(query).exec();
|
||||||
let rerollRes = common.ops.reroll(user, tasks, req, res.analytics);
|
let rerollRes = common.ops.reroll(user, tasks, req, res.analytics);
|
||||||
@@ -1280,11 +1290,20 @@ api.userReset = {
|
|||||||
async handler (req, res) {
|
async handler (req, res) {
|
||||||
let user = res.locals.user;
|
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);
|
res.respond(200, ...resetRes);
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user