mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-17 14:47:53 +01:00
Improve handling
This commit is contained in:
committed by
Phillip Thelen
parent
0f7001b609
commit
82a1d6ff0e
@@ -106,32 +106,16 @@ async function grantEndOfTheMonthPerks (user, now) {
|
|||||||
planMonthsLength = getPlanMonths(plan);
|
planMonthsLength = getPlanMonths(plan);
|
||||||
}
|
}
|
||||||
|
|
||||||
// every 3 months you get one set of perks - this variable records how many sets you need
|
|
||||||
let perkAmountNeeded = 0;
|
|
||||||
if (planMonthsLength === 1) {
|
if (planMonthsLength === 1) {
|
||||||
// User has a single-month recurring subscription and are due for perks
|
|
||||||
// IF they've been subscribed for a multiple of 3 months.
|
|
||||||
if (plan.consecutive.count % SUBSCRIPTION_BASIC_BLOCK_LENGTH === 0) { // every 3 months
|
|
||||||
perkAmountNeeded = 1;
|
|
||||||
}
|
|
||||||
plan.consecutive.offset = 0; // allow the same logic to be run next month
|
plan.consecutive.offset = 0; // allow the same logic to be run next month
|
||||||
} else {
|
} else {
|
||||||
// User has a multi-month recurring subscription
|
// User has a multi-month recurring subscription
|
||||||
// and it renewed in the previous calendar month.
|
// and it renewed in the previous calendar month.
|
||||||
|
|
||||||
// e.g., for a 6-month subscription, give two sets of perks
|
|
||||||
perkAmountNeeded = planMonthsLength / SUBSCRIPTION_BASIC_BLOCK_LENGTH;
|
|
||||||
// don't need to check for perks again for this many months
|
// don't need to check for perks again for this many months
|
||||||
// (subtract 1 because we should have run this when the payment was taken last month)
|
// (subtract 1 because we should have run this when the payment was taken last month)
|
||||||
plan.consecutive.offset = planMonthsLength - 1;
|
plan.consecutive.offset = planMonthsLength - 1;
|
||||||
}
|
}
|
||||||
if (perkAmountNeeded > 0) {
|
await plan.incrementPerkCounterAndReward(user._id, planMonthsLength);
|
||||||
// one Hourglass every 3 months
|
|
||||||
await plan.updateHourglasses(user._id, perkAmountNeeded, 'subscription_perks'); // eslint-disable-line no-await-in-loop
|
|
||||||
plan.consecutive.gemCapExtra += 5 * perkAmountNeeded; // 5 extra Gems every 3 months
|
|
||||||
// cap it at 50 (hard 25 limit + extra 25)
|
|
||||||
if (plan.consecutive.gemCapExtra > 25) plan.consecutive.gemCapExtra = 25;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -246,12 +246,11 @@ async function createSubscription (data) {
|
|||||||
} = await prepareSubscriptionValues(data);
|
} = await prepareSubscriptionValues(data);
|
||||||
|
|
||||||
// Block sub perks
|
// Block sub perks
|
||||||
const perks = Math.floor(months / 3);
|
if (months > 0) {
|
||||||
if (perks) {
|
if (!data.gift && !groupId) {
|
||||||
plan.consecutive.offset += months;
|
plan.consecutive.offset = months;
|
||||||
plan.consecutive.gemCapExtra += perks * 5;
|
}
|
||||||
if (plan.consecutive.gemCapExtra > 25) plan.consecutive.gemCapExtra = 25;
|
await plan.incrementPerkCounterAndReward(recipient._id, months);
|
||||||
await plan.updateHourglasses(recipient._id, perks, 'subscription_perks'); // one Hourglass every 3 months
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (recipient !== group) {
|
if (recipient !== group) {
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ export const schema = new mongoose.Schema({
|
|||||||
dateUpdated: Date,
|
dateUpdated: Date,
|
||||||
dateCurrentTypeCreated: Date,
|
dateCurrentTypeCreated: Date,
|
||||||
extraMonths: { $type: Number, default: 0 },
|
extraMonths: { $type: Number, default: 0 },
|
||||||
|
perkMonthCount: { $type: Number, default: 0 },
|
||||||
gemsBought: { $type: Number, default: 0 },
|
gemsBought: { $type: Number, default: 0 },
|
||||||
mysteryItems: { $type: Array, default: () => [] },
|
mysteryItems: { $type: Array, default: () => [] },
|
||||||
lastReminderDate: Date, // indicates the last time a subscription reminder was sent
|
lastReminderDate: Date, // indicates the last time a subscription reminder was sent
|
||||||
@@ -46,6 +47,20 @@ schema.plugin(baseModel, {
|
|||||||
_id: false,
|
_id: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
schema.methods.incrementPerkCounterAndReward = async function incrementPerkCounterAndReward (userID, adding) {
|
||||||
|
this.perkMonthCount += adding;
|
||||||
|
|
||||||
|
const perks = Math.floor(this.perkMonthCount / 3);
|
||||||
|
if (perks > 0) {
|
||||||
|
this.consecutive.gemCapExtra += 5 * perks; // 5 extra Gems every 3 months
|
||||||
|
// cap it at 50 (hard 25 limit + extra 25)
|
||||||
|
if (this.consecutive.gemCapExtra > 25) this.consecutive.gemCapExtra = 25;
|
||||||
|
this.perkMonthCount -= (perks * 3);
|
||||||
|
// one Hourglass every 3 months
|
||||||
|
await this.updateHourglasses(userID, perks, 'subscription_perks'); // eslint-disable-line no-await-in-loop
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
schema.methods.updateHourglasses = async function updateHourglasses (userId,
|
schema.methods.updateHourglasses = async function updateHourglasses (userId,
|
||||||
amount,
|
amount,
|
||||||
transactionType,
|
transactionType,
|
||||||
|
|||||||
Reference in New Issue
Block a user