From 37a71924fee54e7e0bf4e48bb3e787ff9c47b0af Mon Sep 17 00:00:00 2001 From: Sabe Jones Date: Fri, 20 Jan 2017 20:36:38 -0600 Subject: [PATCH] Incentives, Batch 2 (#8435) * feat(content): Incentives batch 2 gear * feat(incentives): incentives 55-100 * chore(migration): hand out missed incentive * refactor(constant): export MAX_INCENTIVES * fix(incentives): correct const import and say "Royal Purple Potion" not "Royal Purple" --- migrations/20170120_missing_incentive.js | 113 ++++++++++++++++++ .../armor/broad_armor_special_pageArmor.png | Bin 0 -> 4046 bytes .../shop/shop_armor_special_pageArmor.png | Bin 0 -> 3432 bytes .../armor/slim_armor_special_pageArmor.png | Bin 0 -> 4013 bytes .../gear/head/head_special_pageHelm.png | Bin 0 -> 4056 bytes .../head/shop/shop_head_special_pageHelm.png | Bin 0 -> 3432 bytes .../shield/shield_special_diamondStave.png | Bin 0 -> 3382 bytes .../shop/shop_shield_special_diamondStave.png | Bin 0 -> 3252 bytes .../shop/shop_weapon_special_pageBanner.png | Bin 0 -> 3470 bytes .../gear/weapon/weapon_special_pageBanner.png | Bin 0 -> 4348 bytes website/client-old/js/controllers/userCtrl.js | 1 + website/common/locales/en/gear.json | 8 ++ website/common/script/constants.js | 1 + .../script/content/gear/sets/special/index.js | 28 +++++ .../common/script/content/loginIncentives.js | 81 ++++++++++++- website/common/script/index.js | 2 + website/server/libs/cron.js | 3 +- 17 files changed, 234 insertions(+), 3 deletions(-) create mode 100644 migrations/20170120_missing_incentive.js create mode 100644 website/assets/sprites/spritesmith/gear/armor/broad_armor_special_pageArmor.png create mode 100644 website/assets/sprites/spritesmith/gear/armor/shop/shop_armor_special_pageArmor.png create mode 100644 website/assets/sprites/spritesmith/gear/armor/slim_armor_special_pageArmor.png create mode 100644 website/assets/sprites/spritesmith/gear/head/head_special_pageHelm.png create mode 100644 website/assets/sprites/spritesmith/gear/head/shop/shop_head_special_pageHelm.png create mode 100644 website/assets/sprites/spritesmith/gear/shield/shield_special_diamondStave.png create mode 100644 website/assets/sprites/spritesmith/gear/shield/shop/shop_shield_special_diamondStave.png create mode 100644 website/assets/sprites/spritesmith/gear/weapon/shop/shop_weapon_special_pageBanner.png create mode 100644 website/assets/sprites/spritesmith/gear/weapon/weapon_special_pageBanner.png diff --git a/migrations/20170120_missing_incentive.js b/migrations/20170120_missing_incentive.js new file mode 100644 index 0000000000..8ee3c82c1b --- /dev/null +++ b/migrations/20170120_missing_incentive.js @@ -0,0 +1,113 @@ +var migrationName = '20170120_missing_incentive.js'; +var authorName = 'Sabe'; // in case script author needs to know when their ... +var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done + +/* + * Award missing Royal Purple Hatching Potion to users with 55+ check-ins + * Reduce users with impossible check-in counts to a reasonable number + */ + +import monk from 'monk'; +import common from '../website/common'; + +var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +var dbUsers = monk(connectionString).get('users', { castIds: false }); + +function processUsers(lastId) { + // specify a query to limit the affected users (empty for all users): + var query = { + 'loginIncentives': {$gt:54}, + 'migration': {$ne: migrationName}, + }; + + if (lastId) { + query._id = { + $gt: lastId + } + } + + dbUsers.find(query, { + sort: {_id: 1}, + limit: 250, + fields: [] // specify fields we are interested in to limit retrieved data (empty if we're not reading data): + }) + .then(updateUsers) + .catch(function (err) { + console.log(err); + return exiting(1, 'ERROR! ' + err); + }); +} + +var progressCount = 1000; +var count = 0; + +function updateUsers (users) { + if (!users || users.length === 0) { + console.warn('All appropriate users found and modified.'); + displayData(); + return; + } + + var userPromises = users.map(updateUser); + var lastUser = users[users.length - 1]; + + return Promise.all(userPromises) + .then(function () { + processUsers(lastUser._id); + }); +} + +function updateUser (user) { + count++; + + var language = user.preferences.language || 'en'; + var set = {'migration': migrationName}; + var inc = {'items.hatchingPotions.RoyalPurple': 1}; + if (user.loginIncentives > 58) { + set = {'migration': migrationName, 'loginIncentives': 58}; + } + var push = { + 'notifications': { + 'type': 'LOGIN_INCENTIVE', + 'data': { + 'nextRewardAt': 60, + 'rewardKey': [ + 'Pet_HatchingPotion_Purple', + ], + 'rewardText': common.i18n.t('potion', {potionType: common.i18n.t('hatchingPotionRoyalPurple', language)}, language), + 'reward': [ + { + 'premium': true, + 'key': 'RoyalPurple', + 'limited': true, + 'value': 2, + } + ], + 'message': common.i18n.t('unlockedCheckInReward', language), + }, + 'id': common.uuid(), + } + }; + + dbUsers.update({_id: user._id}, {$set:set, $push:push, $inc:inc}); + + if (count % progressCount == 0) console.warn(count + ' ' + user._id); + if (user._id == authorUuid) console.warn(authorName + ' processed'); +} + +function displayData() { + console.warn('\n' + count + ' users processed\n'); + return exiting(0); +} + +function exiting(code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { msg = 'ERROR!'; } + if (msg) { + if (code) { console.error(msg); } + else { console.log( msg); } + } + process.exit(code); +} + +module.exports = processUsers; diff --git a/website/assets/sprites/spritesmith/gear/armor/broad_armor_special_pageArmor.png b/website/assets/sprites/spritesmith/gear/armor/broad_armor_special_pageArmor.png new file mode 100644 index 0000000000000000000000000000000000000000..ed7fac9aff89e754772b99164725cc511d8680ca GIT binary patch literal 4046 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 literal 0 HcmV?d00001 diff --git a/website/assets/sprites/spritesmith/gear/armor/shop/shop_armor_special_pageArmor.png b/website/assets/sprites/spritesmith/gear/armor/shop/shop_armor_special_pageArmor.png new file mode 100644 index 0000000000000000000000000000000000000000..16bb46d8cfaa5e5340ec622e09d04398a51e5b55 GIT binary patch literal 3432 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 KMNUMnLSTaMCLIYTjFfee{dF)2b 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 literal 0 HcmV?d00001 diff --git a/website/assets/sprites/spritesmith/gear/head/shop/shop_head_special_pageHelm.png b/website/assets/sprites/spritesmith/gear/head/shop/shop_head_special_pageHelm.png new file mode 100644 index 0000000000000000000000000000000000000000..b01e957e128cc8914f81dc4d05aad96066db3966 GIT binary patch literal 3432 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 KMNUMnLSTXwS)4ck literal 0 HcmV?d00001 diff --git a/website/assets/sprites/spritesmith/gear/shield/shield_special_diamondStave.png b/website/assets/sprites/spritesmith/gear/shield/shield_special_diamondStave.png new file mode 100644 index 0000000000000000000000000000000000000000..5cde1d23a8e9c76b9044fdd41d9392a2793c154f GIT binary patch literal 3382 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 M07*qoM6N<$f+(J8o&W#< literal 0 HcmV?d00001 diff --git a/website/assets/sprites/spritesmith/gear/shield/shop/shop_shield_special_diamondStave.png b/website/assets/sprites/spritesmith/gear/shield/shop/shop_shield_special_diamondStave.png new file mode 100644 index 0000000000000000000000000000000000000000..93d3c27d11fd1980de9360d2552a53ae1f0e3ef1 GIT binary patch literal 3252 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 literal 0 HcmV?d00001 diff --git a/website/assets/sprites/spritesmith/gear/weapon/weapon_special_pageBanner.png b/website/assets/sprites/spritesmith/gear/weapon/weapon_special_pageBanner.png new file mode 100644 index 0000000000000000000000000000000000000000..3e28864fae86fa336c609cdf535d259da0f625ff GIT binary patch literal 4348 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 N+7LbUn!9$P{{ij2&ddM+ literal 0 HcmV?d00001 diff --git a/website/client-old/js/controllers/userCtrl.js b/website/client-old/js/controllers/userCtrl.js index f5eb24e5b2..8044f6e0a4 100644 --- a/website/client-old/js/controllers/userCtrl.js +++ b/website/client-old/js/controllers/userCtrl.js @@ -95,6 +95,7 @@ habitrpg.controller("UserCtrl", ['$rootScope', '$scope', '$location', 'User', '$ var currentLoginDay = Content.loginIncentives[$scope.profile.loginIncentives]; if (!currentLoginDay) return env.t('moreIncentivesComingSoon'); var nextRewardAt = currentLoginDay.nextRewardAt; + if (!nextRewardAt) return env.t('moreIncentivesComingSoon'); if (!currentLoginDay.prevRewardKey) currentLoginDay.prevRewardKey = 0; return env.t('checkinProgressTitle') + ' ' + ($scope.profile.loginIncentives - currentLoginDay.prevRewardKey) + '/' + (nextRewardAt - currentLoginDay.prevRewardKey); }; diff --git a/website/common/locales/en/gear.json b/website/common/locales/en/gear.json index d7fa0a8153..91e107a912 100644 --- a/website/common/locales/en/gear.json +++ b/website/common/locales/en/gear.json @@ -93,6 +93,8 @@ "weaponSpecialLunarScytheNotes": "Wax this scythe regularly, or its power will wane. Increases Strength and Perception by <%= attrs %> each.", "weaponSpecialMammothRiderSpearText": "Mammoth Rider Spear", "weaponSpecialMammothRiderSpearNotes": "This rose quartz-tipped spear will imbue you with ancient spell-casting power. Increases Intelligence by <%= int %>.", + "weaponSpecialPageBannerText": "Page Banner", + "weaponSpecialPageBannerNotes": "Wave your banner high to inspire confidence! Increases Strength by <%= str %>.", "weaponSpecialYetiText": "Yeti-Tamer Spear", "weaponSpecialYetiNotes": "This spear allows its user to command any yeti. Increases Strength by <%= str %>. Limited Edition 2013-2014 Winter Gear.", @@ -333,6 +335,8 @@ "armorSpecialLunarWarriorArmorNotes": "This armor is forged of moonstone and magical steel. Increases Strength and Constitution by <%= attrs %> each.", "armorSpecialMammothRiderArmorText": "Mammoth Rider Armor", "armorSpecialMammothRiderArmorNotes": "This suit of fur and leather includes a snazzy cape studded with rose quartz gems. It will protect you from bitter winds as you adventure in the coldest climes. Increases Constitution by <%= con %>.", + "armorSpecialPageArmorText": "Page Armor", + "armorSpecialPageArmorNotes": "Carry everything you need in your perfect pack! Increases Constitution by <%= con %>.", "armorSpecialYetiText": "Yeti-Tamer Robe", "armorSpecialYetiNotes": "Fuzzy and fierce. Increases Constitution by <%= con %>. Limited Edition 2013-2014 Winter Gear.", @@ -630,6 +634,8 @@ "headSpecialLunarWarriorHelmNotes": "The power of the moon will strengthen you in battle! Increases Strength and Intelligence by <%= attrs %> each.", "headSpecialMammothRiderHelmText": "Mammoth Rider Helm", "headSpecialMammothRiderHelmNotes": "Don't let its fluffiness fool you--this hat will grant you piercing powers of perception! Increases Perception by <%= per %>.", + "headSpecialPageHelmText": "Page Helm", + "headSpecialPageHelmNotes": "Chainmail: for the stylish AND the practical. Increases Perception by <%= per %>.", "headSpecialNyeText": "Absurd Party Hat", "headSpecialNyeNotes": "You've received an Absurd Party Hat! Wear it with pride while ringing in the New Year! Confers no benefit.", @@ -915,6 +921,8 @@ "shieldSpecialMoonpearlShieldNotes": "Designed for fast swimming, and also some defense. Increases Constitution by <%= con %>.", "shieldSpecialMammothRiderHornText": "Mammoth Rider's Horn", "shieldSpecialMammothRiderHornNotes": "One blow on this mighty rose quartz horn and you'll summon powerful magical forces. Increases Strength by <%= str %>.", + "shieldSpecialDiamondStaveText": "Diamond Stave", + "shieldSpecialDiamondStaveNotes": "This valuable stave has mystical powers. Increases Intelligence by <%= int %>.", "shieldSpecialGoldenknightText": "Mustaine's Milestone Mashing Morning Star", "shieldSpecialGoldenknightNotes": "Meetings, monsters, malaise: managed! Mash! Increases Constitution and Perception by <%= attrs %> each.", diff --git a/website/common/script/constants.js b/website/common/script/constants.js index f58cc7f8fb..865614295e 100644 --- a/website/common/script/constants.js +++ b/website/common/script/constants.js @@ -2,6 +2,7 @@ export const MAX_HEALTH = 50; export const MAX_LEVEL = 100; export const MAX_STAT_POINTS = MAX_LEVEL; export const ATTRIBUTES = ['str', 'int', 'per', 'con']; +export const MAX_INCENTIVES = 100; export const TAVERN_ID = '00000000-0000-4000-A000-000000000000'; export const LARGE_GROUP_COUNT_MESSAGE_CUTOFF = 5000; diff --git a/website/common/script/content/gear/sets/special/index.js b/website/common/script/content/gear/sets/special/index.js index 18b5a07c9d..3b5e55eafc 100644 --- a/website/common/script/content/gear/sets/special/index.js +++ b/website/common/script/content/gear/sets/special/index.js @@ -49,6 +49,13 @@ let armor = { value: 130, canOwn: ownsItem('armor_special_mammothRiderArmor'), }, + pageArmor: { + text: t('armorSpecialPageArmorText'), + notes: t('armorSpecialPageArmorNotes', { con: 16 }), + con: 16, + value: 0, + canOwn: ownsItem('armor_special_pageArmor'), + }, yeti: { event: EVENTS.winter, specialClass: 'warrior', @@ -690,6 +697,13 @@ let head = { value: 130, canOwn: ownsItem('head_special_mammothRiderHelm'), }, + pageHelm: { + text: t('headSpecialPageHelmText'), + notes: t('headSpecialPageHelmNotes', { per: 16 }), + per: 16, + value: 0, + canOwn: ownsItem('head_special_pageHelm'), + }, nye: { event: EVENTS.nye, text: t('headSpecialNyeText'), @@ -1368,6 +1382,13 @@ let shield = { value: 130, canOwn: ownsItem('shield_special_mammothRiderHorn'), }, + diamondStave: { + text: t('shieldSpecialDiamondStaveText'), + notes: t('shieldSpecialDiamondStaveNotes', { int: 16 }), + int: 16, + value: 0, + canOwn: ownsItem('shield_special_diamondStave'), + }, yeti: { event: EVENTS.winter, specialClass: 'warrior', @@ -1757,6 +1778,13 @@ let weapon = { value: 130, canOwn: ownsItem('weapon_special_mammothRiderSpear'), }, + pageBanner: { + text: t('weaponSpecialPageBannerText'), + notes: t('weaponSpecialPageBannerNotes', { str: 16 }), + str: 16, + value: 0, + canOwn: ownsItem('weapon_special_pageBanner'), + }, yeti: { event: EVENTS.winter, specialClass: 'warrior', diff --git a/website/common/script/content/loginIncentives.js b/website/common/script/content/loginIncentives.js index 6b205aad7c..ec93fdc09f 100644 --- a/website/common/script/content/loginIncentives.js +++ b/website/common/script/content/loginIncentives.js @@ -1,4 +1,5 @@ import _ from 'lodash'; +import { MAX_INCENTIVES } from '../constants'; module.exports = function getLoginIncentives (api) { let loginIncentives = { @@ -145,13 +146,89 @@ module.exports = function getLoginIncentives (api) { user.items.food.Saddle += 1; }, }, + 55: { + rewardKey: ['Pet_HatchingPotion_Purple'], + reward: [api.hatchingPotions.RoyalPurple], + assignReward: function assignReward (user) { + if (!user.items.hatchingPotions.RoyalPurple) user.items.hatchingPotions.RoyalPurple = 0; + user.items.hatchingPotions.RoyalPurple += 1; + }, + }, + 60: { + rewardKey: ['slim_armor_special_pageArmor'], + reward: [api.gear.flat.armor_special_pageArmor], + assignReward: function assignReward (user) { + user.items.gear.owned.armor_special_pageArmor = true; // eslint-disable-line camelcase + }, + }, + 65: { + rewardKey: ['Pet_HatchingPotion_Purple'], + reward: [api.hatchingPotions.RoyalPurple], + assignReward: function assignReward (user) { + if (!user.items.hatchingPotions.RoyalPurple) user.items.hatchingPotions.RoyalPurple = 0; + user.items.hatchingPotions.RoyalPurple += 1; + }, + }, + 70: { + rewardKey: ['head_special_pageHelm'], + reward: [api.gear.flat.head_special_pageHelm], + assignReward: function assignReward (user) { + user.items.gear.owned.head_special_pageHelm = true; // eslint-disable-line camelcase + }, + }, + 75: { + rewardKey: ['Pet_HatchingPotion_Purple'], + reward: [api.hatchingPotions.RoyalPurple], + assignReward: function assignReward (user) { + if (!user.items.hatchingPotions.RoyalPurple) user.items.hatchingPotions.RoyalPurple = 0; + user.items.hatchingPotions.RoyalPurple += 1; + }, + }, + 80: { + rewardKey: ['weapon_special_pageBanner'], + reward: [api.gear.flat.weapon_special_pageBanner], + assignReward: function assignReward (user) { + user.items.gear.owned.weapon_special_pageBanner = true; // eslint-disable-line camelcase + }, + }, + 85: { + rewardKey: ['Pet_HatchingPotion_Purple'], + reward: [api.hatchingPotions.RoyalPurple], + assignReward: function assignReward (user) { + if (!user.items.hatchingPotions.RoyalPurple) user.items.hatchingPotions.RoyalPurple = 0; + user.items.hatchingPotions.RoyalPurple += 1; + }, + }, + 90: { + rewardKey: ['shield_special_diamondStave'], + reward: [api.gear.flat.shield_special_diamondStave], + assignReward: function assignReward (user) { + user.items.gear.owned.shield_special_diamondStave = true; // eslint-disable-line camelcase + }, + }, + 95: { + rewardKey: ['Pet_HatchingPotion_Purple'], + reward: [api.hatchingPotions.RoyalPurple], + assignReward: function assignReward (user) { + if (!user.items.hatchingPotions.RoyalPurple) user.items.hatchingPotions.RoyalPurple = 0; + user.items.hatchingPotions.RoyalPurple += 1; + }, + }, + 100: { + rewardKey: ['Pet_Food_Saddle'], + reward: [api.food.Saddle], + assignReward: function assignReward (user) { + if (!user.items.food.Saddle) user.items.food.Saddle = 0; + user.items.food.Saddle += 1; + }, + }, }; // Add refence link to next reward and add filler days so we have a map to refernce the next reward from any day // We could also, use a list, but then we would be cloning each of the rewards. // Create a new array if we want the loginIncentives to be immutable in the future let nextRewardKey; - _.range(51).reverse().forEach(function addNextRewardLink (index) { + _.range(MAX_INCENTIVES + 1).reverse().forEach(function addNextRewardLink (index) { if (loginIncentives[index] && loginIncentives[index].rewardKey) { loginIncentives[index].nextRewardAt = nextRewardKey; nextRewardKey = index; @@ -165,7 +242,7 @@ module.exports = function getLoginIncentives (api) { }); let prevRewardKey; - _.range(51).forEach(function addPrevRewardLink (index) { + _.range(MAX_INCENTIVES + 1).forEach(function addPrevRewardLink (index) { loginIncentives[index].prevRewardKey = prevRewardKey; if (loginIncentives[index].rewardKey) prevRewardKey = index; }); diff --git a/website/common/script/index.js b/website/common/script/index.js index 39cc348cd0..232f4ecc3a 100644 --- a/website/common/script/index.js +++ b/website/common/script/index.js @@ -21,12 +21,14 @@ import { MAX_HEALTH, MAX_LEVEL, MAX_STAT_POINTS, + MAX_INCENTIVES, TAVERN_ID, LARGE_GROUP_COUNT_MESSAGE_CUTOFF, SUPPORTED_SOCIAL_NETWORKS, } from './constants'; api.constants = { + MAX_INCENTIVES, LARGE_GROUP_COUNT_MESSAGE_CUTOFF, SUPPORTED_SOCIAL_NETWORKS, }; diff --git a/website/server/libs/cron.js b/website/server/libs/cron.js index 7364158258..842303d51b 100644 --- a/website/server/libs/cron.js +++ b/website/server/libs/cron.js @@ -8,6 +8,7 @@ import nconf from 'nconf'; 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; @@ -129,7 +130,7 @@ function trackCronAnalytics (analytics, user, _progress, options) { } function awardLoginIncentives (user) { - if (user.loginIncentives > 50) return; + if (user.loginIncentives > MAX_INCENTIVES) return; // A/B test 2016-12-21: Should we deliver notifications for upcoming incentives on days when users don't receive rewards? if (!loginIncentives[user.loginIncentives].rewardKey && user._ABtests && user._ABtests.checkInModals === '20161221_noCheckInPreviews') return;