From 234328f2ba5aae5d256ac645bb4b38fe3f204f33 Mon Sep 17 00:00:00 2001 From: Sabe Jones Date: Tue, 6 Jun 2017 20:14:26 -0700 Subject: [PATCH] Reduce difficulty of collection quests (#8754) * create script to insert message into party chat because collection quest is now easier See https://github.com/HabitRPG/habitrpg/pull/7987 for more details. * fix(quests): make collection less burdensome * refactor(migration): return groups directly --- ...unce_collection_quest_change_in_parties.js | 110 ++++++++++++++++++ website/common/script/content/quests.js | 12 +- 2 files changed, 116 insertions(+), 6 deletions(-) create mode 100644 migrations/20170111_announce_collection_quest_change_in_parties.js diff --git a/migrations/20170111_announce_collection_quest_change_in_parties.js b/migrations/20170111_announce_collection_quest_change_in_parties.js new file mode 100644 index 0000000000..aabd6703f8 --- /dev/null +++ b/migrations/20170111_announce_collection_quest_change_in_parties.js @@ -0,0 +1,110 @@ +'use strict'; + +/**************************************** + * Author: @Alys + * + * Reason: Collection quests are being changed + * to require fewer items collected: + * https://github.com/HabitRPG/habitrpg/pull/7987 + * This will cause existing quests to end sooner + * than the party is expecting. + * This script inserts an explanatory `system` + * message into the chat for affected parties. + ***************************************/ + +global.Promise = require('bluebird'); +const uuid = require('uuid'); +const TaskQueue = require('cwait').TaskQueue; +const logger = require('./utils/logger'); +const Timer = require('./utils/timer'); +const connectToDb = require('./utils/connect').connectToDb; +const closeDb = require('./utils/connect').closeDb; + +const message = '`This party\'s collection quest has been made easier! For details, refer to http://habitica.wikia.com/wiki/User_blog:LadyAlys/Collection_Quests_are_Now_Easier`'; + +const timer = new Timer(); + +// PROD: Enable prod db +// const DB_URI = 'mongodb://username:password@dsXXXXXX-a0.mlab.com:XXXXX,dsXXXXXX-a1.mlab.com:XXXXX/habitica?replicaSet=rs-dsXXXXXX'; +const DB_URI = 'mongodb://localhost/habitrpg'; + +const COLLECTION_QUESTS = [ + 'vice2', + 'egg', + 'moonstone1', + 'goldenknight1', + 'dilatoryDistress1', +]; + +let Groups; + +connectToDb(DB_URI).then((db) => { + Groups = db.collection('groups'); + + return Promise.resolve(); +}) +.then(findPartiesWithCollectionQuest) +// .then(displayGroups) // for testing only +.then(addMessageToGroups) +.then(() => { + timer.stop(); + closeDb(); +}).catch(reportError); + +function reportError (err) { + logger.error('Uh oh, an error occurred'); + closeDb(); + timer.stop(); + throw err; +} + +function findPartiesWithCollectionQuest () { + logger.info('Looking up groups on collection quests...'); + + return Groups.find({'quest.key': {$in: COLLECTION_QUESTS}}, ['name','quest']).toArray().then((groups) => { + logger.success('Found', groups.length, 'parties on collection quests'); + + return Promise.resolve(groups); + }) +} + +function displayGroups (groups) { // for testing only + logger.info('Displaying parties...'); + console.log(groups); + return Promise.resolve(groups); +} + +function updateGroupById (group) { + var newMessage = { + 'id' : uuid.v4(), + 'text' : message, + 'timestamp': Date.now(), + 'likes': {}, + 'flags': {}, + 'flagCount': 0, + 'uuid': 'system' + }; + return Groups.findOneAndUpdate({_id: group._id}, {$push:{"chat" :{$each: [newMessage], $position:0}}}, {returnOriginal: false}); + // Does not set the newMessage flag for all party members because I don't think it's essential and + // I don't want to run the extra code (extra database load, extra opportunity for bugs). +} + +function addMessageToGroups (groups) { + let queue = new TaskQueue(Promise, 300); + + logger.info('About to update', groups.length, 'parties...'); + + return Promise.map(groups, queue.wrap(updateGroupById)).then((result) => { + let updates = result.filter(res => res.lastErrorObject && res.lastErrorObject.updatedExisting) + let failures = result.filter(res => !(res.lastErrorObject && res.lastErrorObject.updatedExisting)); + + logger.success(updates.length, 'parties have been notified'); + + if (failures.length > 0) { + logger.error(failures.length, 'parties could not be notified'); + } + + return Promise.resolve(); + }); +} + diff --git a/website/common/script/content/quests.js b/website/common/script/content/quests.js index bb41bdd2e5..ebe790729b 100644 --- a/website/common/script/content/quests.js +++ b/website/common/script/content/quests.js @@ -442,7 +442,7 @@ let quests = { collect: { lightCrystal: { text: t('questVice2CollectLightCrystal'), - count: 45, + count: 30, }, }, drop: { @@ -511,7 +511,7 @@ let quests = { collect: { plainEgg: { text: t('questEggHuntCollectPlainEgg'), - count: 100, + count: 40, }, }, drop: { @@ -846,7 +846,7 @@ let quests = { collect: { moonstone: { text: t('questMoonstone1CollectMoonstone'), - count: 500, + count: 100, }, }, drop: { @@ -953,7 +953,7 @@ let quests = { collect: { testimony: { text: t('questGoldenknight1CollectTestimony'), - count: 300, + count: 60, }, }, drop: { @@ -1396,11 +1396,11 @@ let quests = { collect: { fireCoral: { text: t('questDilatoryDistress1CollectFireCoral'), - count: 25, + count: 20, }, blueFins: { text: t('questDilatoryDistress1CollectBlueFins'), - count: 25, + count: 20, }, }, drop: {