From 0e2b80ef2edec85b978ecac85f18aa41a97ce3bc Mon Sep 17 00:00:00 2001 From: SabreCat Date: Fri, 13 Oct 2017 21:20:01 +0000 Subject: [PATCH] feat(achievements): award quest completionist cheevo --- website/common/locales/en/achievements.json | 4 ++- website/common/script/content/achievements.js | 5 +++ website/common/script/libs/achievements.js | 1 + website/server/models/group.js | 32 +++++++++++++++++-- website/server/models/user/schema.js | 2 +- 5 files changed, 40 insertions(+), 4 deletions(-) diff --git a/website/common/locales/en/achievements.json b/website/common/locales/en/achievements.json index c986f2bd4fd..865e3713456 100644 --- a/website/common/locales/en/achievements.json +++ b/website/common/locales/en/achievements.json @@ -2,5 +2,7 @@ "share": "Share", "onwards": "Onwards!", "levelup": "By accomplishing your real life goals, you leveled up and are now fully healed!", - "reachedLevel": "You Reached Level <%= level %>" + "reachedLevel": "You Reached Level <%= level %>", + "achievementLostMasterclasser": "Quest Completionist: Masterclasser Series", + "achievementLostMasterclasserText": "You've completed all sixteen quests in the Masterclasser Quest Series and solved the mystery of the Lost Masterclasser!" } diff --git a/website/common/script/content/achievements.js b/website/common/script/content/achievements.js index ad024101eda..4ba6ababab6 100644 --- a/website/common/script/content/achievements.js +++ b/website/common/script/content/achievements.js @@ -117,6 +117,11 @@ let basicAchievs = { titleKey: 'invitedFriend', textKey: 'invitedFriendText', }, + lostMasterclasser: { + icon: 'achievement-lostMasterclasser', + titleKey: 'achievementLostMasterclasser', + textKey: 'achievementLostMasterclasserText', + }, }; Object.assign(achievementsData, basicAchievs); diff --git a/website/common/script/libs/achievements.js b/website/common/script/libs/achievements.js index aa742b7960c..eaf90765dfe 100644 --- a/website/common/script/libs/achievements.js +++ b/website/common/script/libs/achievements.js @@ -183,6 +183,7 @@ function _getBasicAchievements (user, language) { _addSimple(result, user, {path: 'royallyLoyal', language}); _addSimple(result, user, {path: 'joinedChallenge', language}); _addSimple(result, user, {path: 'invitedFriend', language}); + _addSimple(result, user, {path: 'lostMasterclasser', language}); _addSimpleWithMasterCount(result, user, {path: 'beastMaster', language}); _addSimpleWithMasterCount(result, user, {path: 'mountMaster', language}); diff --git a/website/server/models/group.js b/website/server/models/group.js index dc3cb66dc97..fbf1e896eb4 100644 --- a/website/server/models/group.js +++ b/website/server/models/group.js @@ -712,8 +712,9 @@ function _getUserUpdateForQuestReward (itemToAward, allAwardedItems) { return updates; } -async function _updateUserWithRetries (userId, updates, numTry = 1) { - return await User.update({_id: userId}, updates).exec() +async function _updateUserWithRetries (userId, updates, numTry = 1, query = {}) { + query._id = userId; + return await User.update(query, updates).exec() .then((raw) => { return raw; }).catch((err) => { @@ -772,6 +773,33 @@ schema.methods.finishQuest = async function finishQuest (quest) { } }); + if (questK === 'lostMasterclasser4') { + let lostMasterclasserQuery = { + 'achievements.lostMasterclasser': {$ne: true}, + 'achievements.quests.mayhemMistiflying1': {$gt: 0}, + 'achievements.quests.mayhemMistiflying2': {$gt: 0}, + 'achievements.quests.mayhemMistiflying3': {$gt: 0}, + 'achievements.quests.stoikalmCalamity1': {$gt: 0}, + 'achievements.quests.stoikalmCalamity2': {$gt: 0}, + 'achievements.quests.stoikalmCalamity3': {$gt: 0}, + 'achievements.quests.taskwoodsTerror1': {$gt: 0}, + 'achievements.quests.taskwoodsTerror2': {$gt: 0}, + 'achievements.quests.taskwoodsTerror3': {$gt: 0}, + 'achievements.quests.dilatoryDistress1': {$gt: 0}, + 'achievements.quests.dilatoryDistress2': {$gt: 0}, + 'achievements.quests.dilatoryDistress3': {$gt: 0}, + 'achievements.quests.lostMasterclasser1': {$gt: 0}, + 'achievements.quests.lostMasterclasser2': {$gt: 0}, + 'achievements.quests.lostMasterclasser3': {$gt: 0}, + }; + let lostMasterclasserUpdate = { + $set: {'achievements.lostMasterclasser': true}, + }; + promises.concat(participants.map(userId => { + return _updateUserWithRetries(userId, lostMasterclasserUpdate, null, lostMasterclasserQuery); + })); + } + return Bluebird.all(promises); }; diff --git a/website/server/models/user/schema.js b/website/server/models/user/schema.js index 5f65cb324ac..d73046ae392 100644 --- a/website/server/models/user/schema.js +++ b/website/server/models/user/schema.js @@ -102,7 +102,6 @@ let schema = new Schema({ perfect: {type: Number, default: 0}, habitBirthdays: Number, valentine: Number, - costumeContest: Boolean, // Superseded by costumeContests nye: Number, habiticaDays: Number, greeting: Number, @@ -118,6 +117,7 @@ let schema = new Schema({ joinedGuild: Boolean, joinedChallenge: Boolean, invitedFriend: Boolean, + lostMasterclasser: Boolean, }, backer: {