From 58cd634255061fab347234bcfb858934c63c790c Mon Sep 17 00:00:00 2001 From: Blade Barringer Date: Thu, 2 Jun 2016 17:36:29 -0500 Subject: [PATCH] fix: Change quest collection to calculate items on the server only --- common/script/fns/randomDrop.js | 13 ++---------- .../debug/POST-debug_quest-progress.test.js | 5 +---- .../POST-groups_groupid_quests_abort.test.js | 2 +- .../POST-groups_groupid_quests_cancel.test.js | 2 +- .../POST-groups_groupid_quests_leave.test.js | 2 +- .../POST-groups_groupid_quests_reject.test.js | 2 +- test/api/v3/unit/models/group.test.js | 21 ++++++++----------- test/common/fns/randomDrop.test.js | 14 +++---------- test/server_side/controllers/groups.test.js | 2 +- website/server/controllers/api-v3/debug.js | 6 +----- website/server/libs/api-v3/cron.js | 3 +-- website/server/models/group.js | 17 +++++++++------ website/server/models/user.js | 4 +--- 13 files changed, 34 insertions(+), 59 deletions(-) diff --git a/common/script/fns/randomDrop.js b/common/script/fns/randomDrop.js index ec6f350d4c..2d91f2e2f3 100644 --- a/common/script/fns/randomDrop.js +++ b/common/script/fns/randomDrop.js @@ -17,9 +17,7 @@ module.exports = function randomDrop (user, options, req = {}) { let acceptableDrops; let chance; let drop; - let dropK; let dropMultiplier; - let quest; let rarity; let task; @@ -38,15 +36,8 @@ module.exports = function randomDrop (user, options, req = {}) { }, 0) || 0)); chance = diminishingReturns(chance, 0.75); - if (user.party.quest.key) - quest = content.quests[user.party.quest.key]; - if (quest && quest.collect && predictableRandom(user, user.stats.gp) < chance) { - dropK = randomVal(user, quest.collect, { - key: true, - }); - if (!user.party.quest.progress.collect[dropK]) - user.party.quest.progress.collect[dropK] = 0; - user.party.quest.progress.collect[dropK]++; + if (predictableRandom(user, user.stats.gp) < chance) { + user.party.quest.progress.collect++; user.markModified('party.quest.progress'); } diff --git a/test/api/v3/integration/debug/POST-debug_quest-progress.test.js b/test/api/v3/integration/debug/POST-debug_quest-progress.test.js index 3ae3d48882..5ab0ee0af8 100644 --- a/test/api/v3/integration/debug/POST-debug_quest-progress.test.js +++ b/test/api/v3/integration/debug/POST-debug_quest-progress.test.js @@ -44,10 +44,7 @@ describe('POST /debug/quest-progress', () => { await user.sync(); - expect(user.party.quest.progress.collect).to.eql({ - tracks: 300, - branches: 300, - }); + expect(user.party.quest.progress.collect).to.eql(300); }); it('returns error when not in production mode', async () => { diff --git a/test/api/v3/integration/quests/POST-groups_groupid_quests_abort.test.js b/test/api/v3/integration/quests/POST-groups_groupid_quests_abort.test.js index 850cf53646..f65a1f5557 100644 --- a/test/api/v3/integration/quests/POST-groups_groupid_quests_abort.test.js +++ b/test/api/v3/integration/quests/POST-groups_groupid_quests_abort.test.js @@ -102,7 +102,7 @@ describe('POST /groups/:groupId/quests/abort', () => { progress: { up: 0, down: 0, - collect: {}, + collect: 0, }, completed: null, RSVPNeeded: false, diff --git a/test/api/v3/integration/quests/POST-groups_groupid_quests_cancel.test.js b/test/api/v3/integration/quests/POST-groups_groupid_quests_cancel.test.js index f3bd03a180..bd4ff20916 100644 --- a/test/api/v3/integration/quests/POST-groups_groupid_quests_cancel.test.js +++ b/test/api/v3/integration/quests/POST-groups_groupid_quests_cancel.test.js @@ -114,7 +114,7 @@ describe('POST /groups/:groupId/quests/cancel', () => { progress: { up: 0, down: 0, - collect: {}, + collect: 0, }, completed: null, RSVPNeeded: false, diff --git a/test/api/v3/integration/quests/POST-groups_groupid_quests_leave.test.js b/test/api/v3/integration/quests/POST-groups_groupid_quests_leave.test.js index 65d781c163..584a37a2d9 100644 --- a/test/api/v3/integration/quests/POST-groups_groupid_quests_leave.test.js +++ b/test/api/v3/integration/quests/POST-groups_groupid_quests_leave.test.js @@ -113,7 +113,7 @@ describe('POST /groups/:groupId/quests/leave', () => { progress: { up: 0, down: 0, - collect: {}, + collect: 0, }, completed: null, RSVPNeeded: false, diff --git a/test/api/v3/integration/quests/POST-groups_groupid_quests_reject.test.js b/test/api/v3/integration/quests/POST-groups_groupid_quests_reject.test.js index 596ad2f360..80641b1e15 100644 --- a/test/api/v3/integration/quests/POST-groups_groupid_quests_reject.test.js +++ b/test/api/v3/integration/quests/POST-groups_groupid_quests_reject.test.js @@ -116,7 +116,7 @@ describe('POST /groups/:groupId/quests/reject', () => { progress: { up: 0, down: 0, - collect: {}, + collect: 0, }, completed: null, RSVPNeeded: false, diff --git a/test/api/v3/unit/models/group.test.js b/test/api/v3/unit/models/group.test.js index 1f0304eb92..533dced9a6 100644 --- a/test/api/v3/unit/models/group.test.js +++ b/test/api/v3/unit/models/group.test.js @@ -146,7 +146,7 @@ describe('Group Model', () => { expect(participatingMember.party.quest.key).to.eql('whale'); expect(participatingMember.party.quest.progress.down).to.eql(0); - expect(participatingMember.party.quest.progress.collect).to.eql({}); + expect(participatingMember.party.quest.progress.collect).to.eql(0); expect(participatingMember.party.quest.completed).to.eql(null); }); @@ -158,12 +158,12 @@ describe('Group Model', () => { expect(participatingMember.party.quest.key).to.eql('whale'); expect(participatingMember.party.quest.progress.down).to.eql(0); - expect(participatingMember.party.quest.progress.collect).to.eql({}); + expect(participatingMember.party.quest.progress.collect).to.eql(0); expect(participatingMember.party.quest.completed).to.eql(null); expect(questLeader.party.quest.key).to.eql('whale'); expect(questLeader.party.quest.progress.down).to.eql(0); - expect(questLeader.party.quest.progress.collect).to.eql({}); + expect(questLeader.party.quest.progress.collect).to.eql(0); expect(questLeader.party.quest.completed).to.eql(null); }); @@ -255,7 +255,6 @@ describe('Group Model', () => { $set: { 'party.quest.key': 'whale', 'party.quest.progress.down': 0, - 'party.quest.progress.collect': {}, 'party.quest.completed': null, }, } @@ -284,7 +283,7 @@ describe('Group Model', () => { expect(userQuest.key).to.eql('whale'); expect(userQuest.progress.down).to.eql(0); - expect(userQuest.progress.collect).to.eql({}); + expect(userQuest.progress.collect).to.eql(0); expect(userQuest.completed).to.eql(null); }); @@ -554,9 +553,7 @@ describe('Group Model', () => { beforeEach(async () => { progress = { - collect: { - soapBars: 5, - }, + collect: 5, }; quest = questScrolls.atom1; @@ -582,7 +579,7 @@ describe('Group Model', () => { group: party, }); - expect(party.quest.progress.collect.soapBars).to.eq(5) + expect(party.quest.progress.collect.soapBars).to.eq(5); }); it('sends a chat message about progress', async () => { @@ -598,7 +595,7 @@ describe('Group Model', () => { }); it('sends a chat message if no progress is made', async () => { - delete progress.collect.soapBars; + progress.collect = 0; await Group.processCollectionQuest({ user: participatingMember, @@ -612,7 +609,7 @@ describe('Group Model', () => { }); it('sends message about victory', async () => { - progress.collect.soapBars = 500; + progress.collect = 500; await Group.processCollectionQuest({ user: participatingMember, @@ -626,7 +623,7 @@ describe('Group Model', () => { }); it('calls finishQuest when all items are found', async () => { - progress.collect.soapBars = 999; + progress.collect = 999; sandbox.spy(party, 'finishQuest'); await Group.processCollectionQuest({ diff --git a/test/common/fns/randomDrop.test.js b/test/common/fns/randomDrop.test.js index 39920e02bf..b91021ab6e 100644 --- a/test/common/fns/randomDrop.test.js +++ b/test/common/fns/randomDrop.test.js @@ -6,7 +6,6 @@ import { generateDaily, generateReward, } from '../../helpers/common.helper'; -import content from '../../../common/script/content/index'; describe('common.fns.randomDrop', () => { let user; @@ -22,23 +21,16 @@ describe('common.fns.randomDrop', () => { }; }); - /** - * function signature as follows: - * randomDrop(user, modifiers) {} - * modifiers = { task, delta = null } - **/ - it('drops an item for the user.party.quest.progress', () => { - expect(user.party.quest.progress.collect).to.eql({}); + expect(user.party.quest.progress.collect).to.eql(0); user.party.quest.key = 'vice2'; - let collectWhat = Object.keys(content.quests[user.party.quest.key].collect)[0]; // lightCrystal predictableRandom = () => { return 0.0001; }; randomDrop(user, { task, predictableRandom }); - expect(user.party.quest.progress.collect[collectWhat]).to.eql(1); + expect(user.party.quest.progress.collect).to.eql(1); randomDrop(user, { task, predictableRandom }); - expect(user.party.quest.progress.collect[collectWhat]).to.eql(2); + expect(user.party.quest.progress.collect).to.eql(2); }); context('drops enabled', () => { diff --git a/test/server_side/controllers/groups.test.js b/test/server_side/controllers/groups.test.js index bf12df321b..88fe31752e 100644 --- a/test/server_side/controllers/groups.test.js +++ b/test/server_side/controllers/groups.test.js @@ -380,7 +380,7 @@ describe('Groups Controller', function() { expect(user.party.quest.progress).to.eql({ up: 0, down: 0, - collect: {} + collect: 0, }); }); diff --git a/website/server/controllers/api-v3/debug.js b/website/server/controllers/api-v3/debug.js index 9315f9bf4e..923a79814a 100644 --- a/website/server/controllers/api-v3/debug.js +++ b/website/server/controllers/api-v3/debug.js @@ -171,11 +171,7 @@ api.questProgress = { } if (quest.collect) { - let collect = user.party.quest.progress.collect; - _.each(quest.collect, (details, item) => { - collect[item] = collect[item] || 0; - collect[item] += 300; - }); + user.party.quest.progress.collect += 300; } user.markModified('party.quest.progress'); diff --git a/website/server/libs/api-v3/cron.js b/website/server/libs/api-v3/cron.js index ab3b941eb2..f6a4d337c7 100644 --- a/website/server/libs/api-v3/cron.js +++ b/website/server/libs/api-v3/cron.js @@ -277,8 +277,7 @@ export function cron (options = {}) { // After all is said and done, progress up user's effect on quest, return those values & reset the user's let progress = user.party.quest.progress; let _progress = _.cloneDeep(progress); - _.merge(progress, {down: 0, up: 0}); - progress.collect = _.transform(progress.collect, (m, v, k) => m[k] = 0); + _.merge(progress, {down: 0, up: 0, collect: 0}); // TODO: Clean PMs - keep 200 for subscribers and 50 for free users. Should also be done while resting in the inn // let numberOfPMs = Object.keys(user.inbox.messages).length; diff --git a/website/server/models/group.js b/website/server/models/group.js index 58aa38fc97..e62c3e12f2 100644 --- a/website/server/models/group.js +++ b/website/server/models/group.js @@ -117,7 +117,7 @@ function _cleanQuestProgress (merge) { progress: { up: 0, down: 0, - collect: {}, + collect: 0, }, completed: null, RSVPNeeded: false, @@ -365,7 +365,6 @@ schema.methods.startQuest = async function startQuest (user) { if (userIsParticipating) { user.party.quest.key = this.quest.key; user.party.quest.progress.down = 0; - user.party.quest.progress.collect = collected; user.party.quest.completed = null; user.markModified('party.quest'); } @@ -389,7 +388,6 @@ schema.methods.startQuest = async function startQuest (user) { $set: { 'party.quest.key': this.quest.key, 'party.quest.progress.down': 0, - 'party.quest.progress.collect': collected, 'party.quest.completed': null, }, }, { multi: true }).exec(); @@ -499,11 +497,18 @@ async function processCollectionQuest (options) { group, } = options; - _.each(progress.collect, (v, k) => { - group.quest.progress.collect[k] += v; + let itemsFound = {}; + + _.times(progress.collect, () => { + let item = shared.fns.randomVal(user, quest.collect, {key: true}); + if (!itemsFound[item]) { + itemsFound[item] = 0; + } + itemsFound[item]++; + group.quest.progress.collect[item]++; }); - let foundText = _.reduce(progress.collect, (m, v, k) => { + let foundText = _.reduce(itemsFound, (m, v, k) => { m.push(`${v} ${quest.collect[k].text('en')}`); return m; }, []); diff --git a/website/server/models/user.js b/website/server/models/user.js index db305e3330..8042eaa48e 100644 --- a/website/server/models/user.js +++ b/website/server/models/user.js @@ -376,9 +376,7 @@ export let schema = new Schema({ progress: { up: {type: Number, default: 0}, down: {type: Number, default: 0}, - collect: {type: Schema.Types.Mixed, default: () => { - return {}; - }}, // {feather:1, ingot:2} + collect: {type: Number, default: 0}, }, completed: String, // When quest is done, we move it from key => completed, and it's a one-time flag (for modal) that they unset by clicking "ok" in browser RSVPNeeded: {type: Boolean, default: false}, // Set to true when invite is pending, set to false when quest invite is accepted or rejected, quest starts, or quest is cancelled