mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-16 22:27:26 +01:00
start upgrading eslint
This commit is contained in:
@@ -1,37 +1,37 @@
|
||||
import moment from 'moment';
|
||||
import { model as User } from '../models/user';
|
||||
import common from '../../common/';
|
||||
import { preenUserHistory } from '../libs/preening';
|
||||
import sleep from '../libs/sleep';
|
||||
import _ from 'lodash';
|
||||
import cloneDeep from 'lodash/cloneDeep';
|
||||
import nconf from 'nconf';
|
||||
import { model as User } from '../models/user';
|
||||
import common from '../../common';
|
||||
import { preenUserHistory } from './preening';
|
||||
import sleep from './sleep';
|
||||
|
||||
const CRON_SAFE_MODE = nconf.get('CRON_SAFE_MODE') === 'true';
|
||||
const CRON_SEMI_SAFE_MODE = nconf.get('CRON_SEMI_SAFE_MODE') === 'true';
|
||||
const MAX_INCENTIVES = common.constants.MAX_INCENTIVES;
|
||||
const shouldDo = common.shouldDo;
|
||||
const scoreTask = common.ops.scoreTask;
|
||||
const i18n = common.i18n;
|
||||
const loginIncentives = common.content.loginIncentives;
|
||||
const { MAX_INCENTIVES } = common.constants;
|
||||
const { shouldDo } = common;
|
||||
const { scoreTask } = common.ops;
|
||||
const { i18n } = common;
|
||||
const { loginIncentives } = common.content;
|
||||
// const maxPMs = 200;
|
||||
|
||||
function setIsDueNextDue (task, user, now) {
|
||||
let optionsForShouldDo = cloneDeep(user.preferences.toObject());
|
||||
const optionsForShouldDo = cloneDeep(user.preferences.toObject());
|
||||
task.isDue = common.shouldDo(now, task, optionsForShouldDo);
|
||||
optionsForShouldDo.nextDue = true;
|
||||
let nextDue = common.shouldDo(now, task, optionsForShouldDo);
|
||||
const nextDue = common.shouldDo(now, task, optionsForShouldDo);
|
||||
if (nextDue && nextDue.length > 0) {
|
||||
task.nextDue = nextDue;
|
||||
}
|
||||
}
|
||||
|
||||
export async function recoverCron (status, locals) {
|
||||
let {user} = locals;
|
||||
const { user } = locals;
|
||||
|
||||
await sleep(0.3);
|
||||
|
||||
let reloadedUser = await User.findOne({_id: user._id}).exec();
|
||||
const reloadedUser = await User.findOne({ _id: user._id }).exec();
|
||||
|
||||
if (!reloadedUser) {
|
||||
throw new Error(`User ${user._id} not found while recovering.`);
|
||||
@@ -49,7 +49,7 @@ export async function recoverCron (status, locals) {
|
||||
}
|
||||
}
|
||||
|
||||
let CLEAR_BUFFS = {
|
||||
const CLEAR_BUFFS = {
|
||||
str: 0,
|
||||
int: 0,
|
||||
per: 0,
|
||||
@@ -60,16 +60,18 @@ let CLEAR_BUFFS = {
|
||||
|
||||
function grantEndOfTheMonthPerks (user, now) {
|
||||
const SUBSCRIPTION_BASIC_BLOCK_LENGTH = 3; // multi-month subscriptions are for multiples of 3 months
|
||||
let plan = user.purchased.plan;
|
||||
let subscriptionEndDate = moment(plan.dateTerminated).isBefore() ? moment(plan.dateTerminated).startOf('month') : moment(now).startOf('month');
|
||||
let dateUpdatedMoment = moment(plan.dateUpdated).startOf('month');
|
||||
let elapsedMonths = moment(subscriptionEndDate).diff(dateUpdatedMoment, 'months');
|
||||
const { plan } = user.purchased;
|
||||
const subscriptionEndDate = moment(plan.dateTerminated).isBefore() ? moment(plan.dateTerminated).startOf('month') : moment(now).startOf('month');
|
||||
const dateUpdatedMoment = moment(plan.dateUpdated).startOf('month');
|
||||
const elapsedMonths = moment(subscriptionEndDate).diff(dateUpdatedMoment, 'months');
|
||||
|
||||
if (elapsedMonths > 0) {
|
||||
plan.dateUpdated = now;
|
||||
// For every month, inc their "consecutive months" counter. Give perks based on consecutive blocks
|
||||
// If they already got perks for those blocks (eg, 6mo subscription, subscription gifts, etc) - then dec the offset until it hits 0
|
||||
_.defaults(plan.consecutive, {count: 0, offset: 0, trinkets: 0, gemCapExtra: 0});
|
||||
_.defaults(plan.consecutive, {
|
||||
count: 0, offset: 0, trinkets: 0, gemCapExtra: 0,
|
||||
});
|
||||
|
||||
let planMonthsLength = 1; // 1 for one-month recurring or gift subscriptions; later set to 3 for 3-month recurring, etc.
|
||||
|
||||
@@ -90,8 +92,8 @@ function grantEndOfTheMonthPerks (user, now) {
|
||||
if (plan.consecutive.offset < 0) {
|
||||
if (plan.planId) {
|
||||
// NB gift subscriptions don't have a planID (which doesn't matter because we don't need to reapply perks for them and by this point they should have expired anyway)
|
||||
let planIdRegExp = new RegExp('_([0-9]+)mo'); // e.g., matches 'google_6mo' / 'basic_12mo' and captures '6' / '12'
|
||||
let match = plan.planId.match(planIdRegExp);
|
||||
const planIdRegExp = new RegExp('_([0-9]+)mo'); // e.g., matches 'google_6mo' / 'basic_12mo' and captures '6' / '12'
|
||||
const match = plan.planId.match(planIdRegExp);
|
||||
if (match !== null && match[0] !== null) {
|
||||
planMonthsLength = match[1]; // 3 for 3-month recurring subscription, etc
|
||||
}
|
||||
@@ -120,7 +122,7 @@ function grantEndOfTheMonthPerks (user, now) {
|
||||
}
|
||||
|
||||
function removeTerminatedSubscription (user) {
|
||||
let plan = user.purchased.plan;
|
||||
const { plan } = user.purchased;
|
||||
|
||||
_.merge(plan, {
|
||||
planId: null,
|
||||
@@ -145,7 +147,7 @@ function resetHabitCounters (user, tasksByType, now, daysMissed) {
|
||||
if (resetWeekly === true && resetMonthly === true) {
|
||||
break;
|
||||
}
|
||||
let thatDay = moment(now).zone(user.preferences.timezoneOffset + user.preferences.dayStart * 60).subtract({days: i});
|
||||
const thatDay = moment(now).zone(user.preferences.timezoneOffset + user.preferences.dayStart * 60).subtract({ days: i });
|
||||
if (thatDay.day() === 1) {
|
||||
resetWeekly = true;
|
||||
}
|
||||
@@ -154,7 +156,7 @@ function resetHabitCounters (user, tasksByType, now, daysMissed) {
|
||||
}
|
||||
}
|
||||
|
||||
tasksByType.habits.forEach((task) => {
|
||||
tasksByType.habits.forEach(task => {
|
||||
// reset counters if appropriate
|
||||
|
||||
let reset = false;
|
||||
@@ -206,10 +208,10 @@ function awardLoginIncentives (user) {
|
||||
if (notif && notif.type === 'LOGIN_INCENTIVE') user.notifications.splice(index, 1);
|
||||
});
|
||||
|
||||
let notificationData = {};
|
||||
const notificationData = {};
|
||||
notificationData.message = i18n.t('checkinEarned', user.preferences.language);
|
||||
|
||||
let loginIncentive = loginIncentives[user.loginIncentives];
|
||||
const loginIncentive = loginIncentives[user.loginIncentives];
|
||||
|
||||
if (loginIncentive.rewardKey) {
|
||||
loginIncentive.assignReward(user);
|
||||
@@ -218,11 +220,11 @@ function awardLoginIncentives (user) {
|
||||
|
||||
// @TODO: Abstract this logic and share it across the server and client
|
||||
let count = 0;
|
||||
for (let reward of loginIncentive.reward) {
|
||||
for (const reward of loginIncentive.reward) {
|
||||
if (reward.text) {
|
||||
notificationData.rewardText += reward.text(user.preferences.language);
|
||||
if (reward.key === 'RoyalPurple') {
|
||||
notificationData.rewardText = i18n.t('potion', {potionType: notificationData.rewardText}, user.preferences.language);
|
||||
notificationData.rewardText = i18n.t('potion', { potionType: notificationData.rewardText }, user.preferences.language);
|
||||
}
|
||||
} else if (loginIncentive.rewardKey[0] === 'background_blue') {
|
||||
notificationData.rewardText = i18n.t('incentiveBackgrounds', user.preferences.language);
|
||||
@@ -248,11 +250,13 @@ function awardLoginIncentives (user) {
|
||||
|
||||
// Perform various beginning-of-day reset actions.
|
||||
export function cron (options = {}) {
|
||||
let {user, tasksByType, analytics, now = new Date(), daysMissed, timezoneOffsetFromUserPrefs} = options;
|
||||
let _progress = {down: 0, up: 0, collectedItems: 0};
|
||||
const {
|
||||
user, tasksByType, analytics, now = new Date(), daysMissed, timezoneOffsetFromUserPrefs,
|
||||
} = options;
|
||||
let _progress = { down: 0, up: 0, collectedItems: 0 };
|
||||
|
||||
// Record pre-cron values of HP and MP to show notifications later
|
||||
let beforeCronStats = _.pick(user.stats, ['hp', 'mp']);
|
||||
const beforeCronStats = _.pick(user.stats, ['hp', 'mp']);
|
||||
|
||||
user.preferences.timezoneOffsetAtLastCron = timezoneOffsetFromUserPrefs;
|
||||
// User is only allowed a certain number of drops a day. This resets the count.
|
||||
@@ -262,7 +266,7 @@ export function cron (options = {}) {
|
||||
let perfect = true;
|
||||
|
||||
// Reset Gold-to-Gems cap if it's the start of the month
|
||||
let dateUpdatedFalse = !moment(user.purchased.plan.dateUpdated).startOf('month').isSame(moment().startOf('month')) || !user.purchased.plan.dateUpdated;
|
||||
const dateUpdatedFalse = !moment(user.purchased.plan.dateUpdated).startOf('month').isSame(moment().startOf('month')) || !user.purchased.plan.dateUpdated;
|
||||
|
||||
if (user.purchased && user.purchased.plan && dateUpdatedFalse) {
|
||||
user.purchased.plan.gemsBought = 0;
|
||||
@@ -273,15 +277,15 @@ export function cron (options = {}) {
|
||||
grantEndOfTheMonthPerks(user, now);
|
||||
}
|
||||
|
||||
let plan = user.purchased.plan;
|
||||
let userHasTerminatedSubscription = plan.dateTerminated && moment(plan.dateTerminated).isBefore(new Date());
|
||||
const { plan } = user.purchased;
|
||||
const userHasTerminatedSubscription = plan.dateTerminated && moment(plan.dateTerminated).isBefore(new Date());
|
||||
if (!CRON_SAFE_MODE && userHasTerminatedSubscription) removeTerminatedSubscription(user);
|
||||
|
||||
// Login Incentives
|
||||
user.loginIncentives++;
|
||||
awardLoginIncentives(user);
|
||||
|
||||
let multiDaysCountAsOneDay = true;
|
||||
const multiDaysCountAsOneDay = true;
|
||||
// If the user does not log in for two or more days, cron (mostly) acts as if it were only one day.
|
||||
// When site-wide difficulty settings are introduced, this can be a user preference option.
|
||||
|
||||
@@ -308,9 +312,9 @@ export function cron (options = {}) {
|
||||
let atLeastOneDailyDue = false; // were any dailies due?
|
||||
if (!user.party.quest.progress.down) user.party.quest.progress.down = 0;
|
||||
|
||||
tasksByType.dailys.forEach((task) => {
|
||||
tasksByType.dailys.forEach(task => {
|
||||
if (task.group.assignedDate && moment(task.group.assignedDate).isAfter(user.auth.timestamps.updated)) return;
|
||||
let completed = task.completed;
|
||||
const { completed } = task;
|
||||
// Deduct points for missed Daily tasks
|
||||
let EvadeTask = 0;
|
||||
let scheduleMisses = daysMissed;
|
||||
@@ -318,7 +322,7 @@ export function cron (options = {}) {
|
||||
if (completed) {
|
||||
dailyChecked += 1;
|
||||
if (!atLeastOneDailyDue) { // only bother checking until the first thing is found
|
||||
let thatDay = moment(now).subtract({days: daysMissed});
|
||||
const thatDay = moment(now).subtract({ days: daysMissed });
|
||||
atLeastOneDailyDue = shouldDo(thatDay.toDate(), task, user.preferences);
|
||||
}
|
||||
} else {
|
||||
@@ -326,7 +330,7 @@ export function cron (options = {}) {
|
||||
scheduleMisses = 0;
|
||||
|
||||
for (let i = 0; i < daysMissed; i++) {
|
||||
let thatDay = moment(now).subtract({days: i + 1});
|
||||
const thatDay = moment(now).subtract({ days: i + 1 });
|
||||
|
||||
if (shouldDo(thatDay.toDate(), task, user.preferences)) {
|
||||
atLeastOneDailyDue = true;
|
||||
@@ -347,7 +351,7 @@ export function cron (options = {}) {
|
||||
perfect = false;
|
||||
|
||||
if (task.checklist && task.checklist.length > 0) { // Partially completed checklists dock fewer mana points
|
||||
let fractionChecked = _.reduce(task.checklist, (m, i) => m + (i.completed ? 1 : 0), 0) / task.checklist.length;
|
||||
const fractionChecked = _.reduce(task.checklist, (m, i) => m + (i.completed ? 1 : 0), 0) / task.checklist.length;
|
||||
dailyDueUnchecked += 1 - fractionChecked;
|
||||
dailyChecked += fractionChecked;
|
||||
} else {
|
||||
@@ -355,7 +359,7 @@ export function cron (options = {}) {
|
||||
}
|
||||
|
||||
if (!user.preferences.sleep) {
|
||||
let delta = scoreTask({
|
||||
const delta = scoreTask({
|
||||
user,
|
||||
task,
|
||||
direction: 'down',
|
||||
@@ -402,11 +406,11 @@ export function cron (options = {}) {
|
||||
|
||||
resetHabitCounters(user, tasksByType, now, daysMissed);
|
||||
|
||||
tasksByType.habits.forEach((task) => {
|
||||
tasksByType.habits.forEach(task => {
|
||||
// slowly reset value to 0 for "onlies" (Habits with + or - but not both)
|
||||
// move singleton Habits towards yellow.
|
||||
if (task.up === false || task.down === false) {
|
||||
task.value = Math.abs(task.value) < 0.1 ? 0 : task.value = task.value / 2;
|
||||
task.value = Math.abs(task.value) < 0.1 ? 0 : task.value /= 2;
|
||||
}
|
||||
if (task.group && task.group.approval && task.group.approval.approved) {
|
||||
task.group.approval.approved = false;
|
||||
@@ -417,7 +421,7 @@ export function cron (options = {}) {
|
||||
});
|
||||
|
||||
// Finished tallying
|
||||
user.history.todos.push({date: now, value: todoTally});
|
||||
user.history.todos.push({ date: now, value: todoTally });
|
||||
|
||||
// tally experience
|
||||
let expTally = user.stats.exp;
|
||||
@@ -427,14 +431,10 @@ export function cron (options = {}) {
|
||||
expTally += common.tnl(lvl);
|
||||
}
|
||||
|
||||
user.history.exp.push({date: now, value: expTally});
|
||||
user.history.exp.push({ date: now, value: expTally });
|
||||
|
||||
// Remove any remaining completed todos from the list of active todos
|
||||
user.tasksOrder.todos = user.tasksOrder.todos.filter(taskOrderId => {
|
||||
return _.some(tasksByType.todos, taskType => {
|
||||
return taskType._id === taskOrderId && taskType.completed === false;
|
||||
});
|
||||
});
|
||||
user.tasksOrder.todos = user.tasksOrder.todos.filter(taskOrderId => _.some(tasksByType.todos, taskType => taskType._id === taskOrderId && taskType.completed === false));
|
||||
// TODO also adjust tasksOrder arrays to remove deleted tasks of any kind (including rewards), ensure that all existing tasks are in the arrays, no tasks IDs are duplicated -- https://github.com/HabitRPG/habitica/issues/7645
|
||||
|
||||
// preen user history so that it doesn't become a performance problem
|
||||
@@ -443,7 +443,7 @@ export function cron (options = {}) {
|
||||
|
||||
if (perfect && atLeastOneDailyDue) {
|
||||
user.achievements.perfect++;
|
||||
let lvlDiv2 = Math.ceil(common.capByLevel(user.stats.lvl) / 2);
|
||||
const lvlDiv2 = Math.ceil(common.capByLevel(user.stats.lvl) / 2);
|
||||
user.stats.buffs = {
|
||||
str: lvlDiv2,
|
||||
int: lvlDiv2,
|
||||
@@ -466,21 +466,20 @@ export function cron (options = {}) {
|
||||
|
||||
// After all is said and done, progress up user's effect on quest, return those values & reset the user's
|
||||
if (!user.preferences.sleep) {
|
||||
let progress = user.party.quest.progress;
|
||||
const { progress } = user.party.quest;
|
||||
_progress = progress.toObject(); // clone the old progress object
|
||||
_.merge(progress, {down: 0, up: 0, collectedItems: 0});
|
||||
_.merge(progress, { down: 0, up: 0, collectedItems: 0 });
|
||||
}
|
||||
|
||||
// Send notification for changes in HP and MP.
|
||||
// First remove a possible previous cron notification because
|
||||
// we don't want to flood the users with many cron notifications at once.
|
||||
let oldCronNotif = user.notifications.find((notif, index) => {
|
||||
const oldCronNotif = user.notifications.find((notif, index) => {
|
||||
if (notif && notif.type === 'CRON') {
|
||||
user.notifications.splice(index, 1);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
user.addNotification('CRON', {
|
||||
|
||||
Reference in New Issue
Block a user