From 224fbe2d85b820fce3bcf6ef6490bc3c18d862b9 Mon Sep 17 00:00:00 2001 From: Alice Harris Date: Sun, 31 Aug 2014 09:00:39 +1000 Subject: [PATCH 1/5] increase number of gems for contributors AND report actions taken and results https://github.com/HabitRPG/habitrpg/issues/3933 --- ...ncrease_gems_for_previous_contributions.js | 79 +++++++++++++++++++ ..._for_previous_contributions_FINAL_CHECK.js | 43 ++++++++++ 2 files changed, 122 insertions(+) create mode 100644 migrations/20140831_increase_gems_for_previous_contributions.js create mode 100644 migrations/20140831_increase_gems_for_previous_contributions_FINAL_CHECK.js diff --git a/migrations/20140831_increase_gems_for_previous_contributions.js b/migrations/20140831_increase_gems_for_previous_contributions.js new file mode 100644 index 0000000000..b8e30691ae --- /dev/null +++ b/migrations/20140831_increase_gems_for_previous_contributions.js @@ -0,0 +1,79 @@ +// IMPORTANT: +// +// run like this to capture all output: +// node 20140831_increase_gems_for_previous_contributions.js > 20140831_increase_gems_for_previous_contributions_output.txt + + +var migrationName = '20140831_increase_gems_for_previous_contributions'; +// author: Alys (d904bd62-da08-416b-a816-ba797c9ee265) + +/** + * https://github.com/HabitRPG/habitrpg/issues/3933 + * Increase Number of Gems for Contributors + * + * Increase everyone's gems per their contribution level. + * Originally they were given 2 gems per tier. + * Now they are given 3 gems per tier for tiers 1,2,3 + * and 4 gems per tier for tiers 4,5,6,7 + * So that means an EXTRA 1 for tier 1, + * 2 for tier 2, + * 3 for tier 3, + * 5 for tier 4, + * 7 for tier 5, + * 9 for tier 6, + * 11 for tier 7, + * 11 for tier 8 (moderators = tier 7 + admin privileges), + * none for tier 9 (staff) + */ + +var mongo = require('mongoskin'); +var _ = require('lodash'); + + +/////////////////// UNCOMMENT *ONE* OF THESE LINES: /////////////////// +// var dbUsers = mongo.db('lefnire:mAdn3s5s@charlotte.mongohq.com:10015/habitrpg_large?auto_reconnect').collection('users'); // @lefnire production? +// var dbUsers = mongo.db('localhost:27017/habitrpg_old?auto_reconnect').collection('users'); // @lefnire habitrpg_old +// var dbUsers = mongo.db('localhost:27017/habitrpg?auto_reconnect').collection('users'); // for local testing by script author (e.g., vagrant install) + + +var fields = {'migration':1, + 'contributor.level':1, + 'auth.local.username':1, + 'balance':1, + }; + +dbUsers.findEach({ $and: [ + { 'contributor.level': {$gt:0} }, + { 'contributor.level': {$lt:9} } +]}, fields, {batchSize:250}, function(err, user){ + if (!user) err = '!user'; + if (err) {return console.error(err);} + + var set = {'migration': migrationName}; + + var tier = user.contributor.level; + var extraGems = tier; // tiers 1,2,3 + if (tier > 3) { + extraGems = 3 + (tier - 3) * 2; + } + if (tier == 8) { + extraGems = 11; // mods (tier 8) are tier 7 in terms of gems awarded + } + extraBalance = extraGems / 4; + set['balance'] = user.balance + extraBalance; + + // Display current state of user: + console.log("\n" + user._id + " " + user.auth.local.username + ":\n" + + " contrib tier : " + tier + "\n" + + " balance before : " + user.balance + "\n" + + " balance (gems) added : " + extraBalance + " (" + + extraGems + ")" + "\n" + + " expected balance after: " + (user.balance + extraBalance)); + + //console.log(JSON.stringify(user, null, " ")); + //console.log("set: " + JSON.stringify(set, null, " ")); + + dbUsers.update({_id:user._id}, {$set:set, $inc:{_v:1}}); + + // No progress counter because we print output for every user. +}); diff --git a/migrations/20140831_increase_gems_for_previous_contributions_FINAL_CHECK.js b/migrations/20140831_increase_gems_for_previous_contributions_FINAL_CHECK.js new file mode 100644 index 0000000000..d11e1b29fc --- /dev/null +++ b/migrations/20140831_increase_gems_for_previous_contributions_FINAL_CHECK.js @@ -0,0 +1,43 @@ +// IMPORTANT: +// +// run like this to capture all output: +// node 20140831_increase_gems_for_previous_contributions_FINAL_CHECK.js > 20140831_increase_gems_for_previous_contributions_FINAL_CHECK_output.txt + + + +// 20140831_increase_gems_for_previous_contributions_FINAL_CHECK.js +// author: Alys (d904bd62-da08-416b-a816-ba797c9ee265) + +/** + * Run this script immediately after + * 20140831_increase_gems_for_previous_contributions.js + * to capture the actual gem balance in case we need it later for + * handling complaints that the right number of gems weren't added. + */ + +var mongo = require('mongoskin'); +var _ = require('lodash'); + +/////////////////// UNCOMMENT *ONE* OF THESE LINES: /////////////////// +// var dbUsers = mongo.db('lefnire:mAdn3s5s@charlotte.mongohq.com:10015/habitrpg_large?auto_reconnect').collection('users'); // @lefnire production? +// var dbUsers = mongo.db('localhost:27017/habitrpg_old?auto_reconnect').collection('users'); // @lefnire habitrpg_old +var dbUsers = mongo.db('localhost:27017/habitrpg?auto_reconnect').collection('users'); // for local testing by script author (e.g., vagrant install) + + +var fields = { + 'auth.local.username':1, + 'balance':1, + }; + +dbUsers.findEach({ $and: [ + { 'contributor.level': {$gt:0} }, + { 'contributor.level': {$lt:9} } +]}, fields, {batchSize:250}, function(err, user){ + if (!user) err = '!user'; + if (err) {return console.error(err);} + + console.log("\n" + user._id + " " + user.auth.local.username + ":\n" + + " actual balance after : " + user.balance); + + // No progress counter because we print output for every user. +}); From 1370080217d300cb8444d523a4f0b13e291db154 Mon Sep 17 00:00:00 2001 From: Alice Harris Date: Sun, 31 Aug 2014 17:27:09 +1000 Subject: [PATCH 2/5] improve code, remove need for second script --- ...ncrease_gems_for_previous_contributions.js | 113 +++++++++++++----- ..._for_previous_contributions_FINAL_CHECK.js | 43 ------- 2 files changed, 83 insertions(+), 73 deletions(-) delete mode 100644 migrations/20140831_increase_gems_for_previous_contributions_FINAL_CHECK.js diff --git a/migrations/20140831_increase_gems_for_previous_contributions.js b/migrations/20140831_increase_gems_for_previous_contributions.js index b8e30691ae..081da935c4 100644 --- a/migrations/20140831_increase_gems_for_previous_contributions.js +++ b/migrations/20140831_increase_gems_for_previous_contributions.js @@ -1,15 +1,16 @@ // IMPORTANT: // // run like this to capture all output: +// // node 20140831_increase_gems_for_previous_contributions.js > 20140831_increase_gems_for_previous_contributions_output.txt var migrationName = '20140831_increase_gems_for_previous_contributions'; -// author: Alys (d904bd62-da08-416b-a816-ba797c9ee265) /** * https://github.com/HabitRPG/habitrpg/issues/3933 * Increase Number of Gems for Contributors + * author: Alys (d904bd62-da08-416b-a816-ba797c9ee265) * * Increase everyone's gems per their contribution level. * Originally they were given 2 gems per tier. @@ -30,50 +31,102 @@ var mongo = require('mongoskin'); var _ = require('lodash'); -/////////////////// UNCOMMENT *ONE* OF THESE LINES: /////////////////// -// var dbUsers = mongo.db('lefnire:mAdn3s5s@charlotte.mongohq.com:10015/habitrpg_large?auto_reconnect').collection('users'); // @lefnire production? -// var dbUsers = mongo.db('localhost:27017/habitrpg_old?auto_reconnect').collection('users'); // @lefnire habitrpg_old -// var dbUsers = mongo.db('localhost:27017/habitrpg?auto_reconnect').collection('users'); // for local testing by script author (e.g., vagrant install) +/////////////////// UNCOMMENT ONE OF THESE LINES: /////////////////// +// var dbUsers = mongo.db('lefnire:mAdn3s5s@charlotte.mongohq.com:10015/habitrpg_large?auto_reconnect').collection('users'); // @lefnire habitrpg_large +// var dbUsers = mongo.db('localhost:27017/habitrpg_old?auto_reconnect').collection('users'); // @lefnire habitrpg_old +// var dbUsers = mongo.db('localhost:27017/habitrpg?auto_reconnect').collection('users'); // for local testing by script author (e.g., vagrant install) +if (typeof dbUsers == 'undefined') { exiting(1, 'Uncomment one of the "var dbUsers" lines!'); } +var query = { $and: [ + { 'migration': {$ne: migrationName} }, + { 'contributor.level': {$gt: 0} }, + { 'contributor.level': {$lt: 9} } +]}; + var fields = {'migration':1, 'contributor.level':1, 'auth.local.username':1, 'balance':1, - }; +}; -dbUsers.findEach({ $and: [ - { 'contributor.level': {$gt:0} }, - { 'contributor.level': {$lt:9} } -]}, fields, {batchSize:250}, function(err, user){ - if (!user) err = '!user'; - if (err) {return console.error(err);} +var userResults = {}; // each key is a UUID, each value is a string + // describing what changed for that user + +console.warn('Updating users...'); +var progressCount = 50; +var count = 0; +dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { + if (err) { return exiting(1, 'ERROR! ' + err); } + if (!user) { + console.warn('All users found. Fetching final balances...'); + return fetchFinalBalances(); + } + count++; var set = {'migration': migrationName}; var tier = user.contributor.level; var extraGems = tier; // tiers 1,2,3 - if (tier > 3) { - extraGems = 3 + (tier - 3) * 2; - } - if (tier == 8) { - extraGems = 11; // mods (tier 8) are tier 7 in terms of gems awarded - } + if (tier > 3) { extraGems = 3 + (tier - 3) * 2; } + if (tier == 8) { extraGems = 11; } extraBalance = extraGems / 4; set['balance'] = user.balance + extraBalance; - // Display current state of user: - console.log("\n" + user._id + " " + user.auth.local.username + ":\n" + - " contrib tier : " + tier + "\n" + - " balance before : " + user.balance + "\n" + - " balance (gems) added : " + extraBalance + " (" + - extraGems + ")" + "\n" + - " expected balance after: " + (user.balance + extraBalance)); - - //console.log(JSON.stringify(user, null, " ")); - //console.log("set: " + JSON.stringify(set, null, " ")); + // Capture current state of user: + userResults[user._id] = + user._id + ' ' + user.auth.local.username + ':\n' + + ' contrib tier : ' + tier + '\n' + + ' balance before : ' + user.balance + '\n' + + ' balance (gems) added : ' + extraBalance + ' (' + + extraGems + ')' + '\n' + + ' expected balance after: ' + (user.balance + extraBalance) + '\n'; + // Update user: dbUsers.update({_id:user._id}, {$set:set, $inc:{_v:1}}); - - // No progress counter because we print output for every user. + if (count%progressCount == 0) console.warn(count + ' ' + user._id); }); + + +function fetchFinalBalances() { + var query = {_id: {$in: Object.keys(userResults)}}; + var fields = { + 'auth.local.username':1, + 'balance':1, + }; + + var count1 = 0; + dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { + if (err) { return exiting(1, 'ERROR! ' + err); } + if (!user) { + console.warn('All final balances found.'); + return displayData(); + } + count1++; + userResults[user._id] = userResults[user._id] + + user._id + ' ' + user.auth.local.username + ':\n' + + ' actual balance after : ' + user.balance + '\n'; + if (count1%progressCount == 0) console.warn(count1 + ' ' + user._id); + }); +} + + +function displayData() { + _.each(userResults, function(text, uuid) { + console.log(text); // text contains uuid + }); + console.log('\n' + count + + ' users processed (should be roughly 335 according to the Hall)\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); +} diff --git a/migrations/20140831_increase_gems_for_previous_contributions_FINAL_CHECK.js b/migrations/20140831_increase_gems_for_previous_contributions_FINAL_CHECK.js deleted file mode 100644 index d11e1b29fc..0000000000 --- a/migrations/20140831_increase_gems_for_previous_contributions_FINAL_CHECK.js +++ /dev/null @@ -1,43 +0,0 @@ -// IMPORTANT: -// -// run like this to capture all output: -// node 20140831_increase_gems_for_previous_contributions_FINAL_CHECK.js > 20140831_increase_gems_for_previous_contributions_FINAL_CHECK_output.txt - - - -// 20140831_increase_gems_for_previous_contributions_FINAL_CHECK.js -// author: Alys (d904bd62-da08-416b-a816-ba797c9ee265) - -/** - * Run this script immediately after - * 20140831_increase_gems_for_previous_contributions.js - * to capture the actual gem balance in case we need it later for - * handling complaints that the right number of gems weren't added. - */ - -var mongo = require('mongoskin'); -var _ = require('lodash'); - -/////////////////// UNCOMMENT *ONE* OF THESE LINES: /////////////////// -// var dbUsers = mongo.db('lefnire:mAdn3s5s@charlotte.mongohq.com:10015/habitrpg_large?auto_reconnect').collection('users'); // @lefnire production? -// var dbUsers = mongo.db('localhost:27017/habitrpg_old?auto_reconnect').collection('users'); // @lefnire habitrpg_old -var dbUsers = mongo.db('localhost:27017/habitrpg?auto_reconnect').collection('users'); // for local testing by script author (e.g., vagrant install) - - -var fields = { - 'auth.local.username':1, - 'balance':1, - }; - -dbUsers.findEach({ $and: [ - { 'contributor.level': {$gt:0} }, - { 'contributor.level': {$lt:9} } -]}, fields, {batchSize:250}, function(err, user){ - if (!user) err = '!user'; - if (err) {return console.error(err);} - - console.log("\n" + user._id + " " + user.auth.local.username + ":\n" + - " actual balance after : " + user.balance); - - // No progress counter because we print output for every user. -}); From 152b68a0a9d526b79b37d341571c6042983865d9 Mon Sep 17 00:00:00 2001 From: Alice Harris Date: Wed, 17 Sep 2014 04:51:25 +1000 Subject: [PATCH 3/5] remove username from output of script --- ...40831_increase_gems_for_previous_contributions.js | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/migrations/20140831_increase_gems_for_previous_contributions.js b/migrations/20140831_increase_gems_for_previous_contributions.js index 081da935c4..b79f3957c9 100644 --- a/migrations/20140831_increase_gems_for_previous_contributions.js +++ b/migrations/20140831_increase_gems_for_previous_contributions.js @@ -31,11 +31,7 @@ var mongo = require('mongoskin'); var _ = require('lodash'); -/////////////////// UNCOMMENT ONE OF THESE LINES: /////////////////// -// var dbUsers = mongo.db('lefnire:mAdn3s5s@charlotte.mongohq.com:10015/habitrpg_large?auto_reconnect').collection('users'); // @lefnire habitrpg_large -// var dbUsers = mongo.db('localhost:27017/habitrpg_old?auto_reconnect').collection('users'); // @lefnire habitrpg_old -// var dbUsers = mongo.db('localhost:27017/habitrpg?auto_reconnect').collection('users'); // for local testing by script author (e.g., vagrant install) -if (typeof dbUsers == 'undefined') { exiting(1, 'Uncomment one of the "var dbUsers" lines!'); } +var dbUsers = mongo.db('localhost:27017/habitrpg?auto_reconnect').collection('users'); var query = { $and: [ @@ -46,7 +42,6 @@ var query = { $and: [ var fields = {'migration':1, 'contributor.level':1, - 'auth.local.username':1, 'balance':1, }; @@ -75,7 +70,7 @@ dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { // Capture current state of user: userResults[user._id] = - user._id + ' ' + user.auth.local.username + ':\n' + + user._id + ' ' + ':\n' + ' contrib tier : ' + tier + '\n' + ' balance before : ' + user.balance + '\n' + ' balance (gems) added : ' + extraBalance + ' (' + @@ -91,7 +86,6 @@ dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { function fetchFinalBalances() { var query = {_id: {$in: Object.keys(userResults)}}; var fields = { - 'auth.local.username':1, 'balance':1, }; @@ -104,7 +98,7 @@ function fetchFinalBalances() { } count1++; userResults[user._id] = userResults[user._id] + - user._id + ' ' + user.auth.local.username + ':\n' + + user._id + ' ' + ':\n' + ' actual balance after : ' + user.balance + '\n'; if (count1%progressCount == 0) console.warn(count1 + ' ' + user._id); }); From 2f566071144d27d4d9084d25085de87cf7ada0a8 Mon Sep 17 00:00:00 2001 From: Alice Harris Date: Thu, 18 Sep 2014 13:34:43 +1000 Subject: [PATCH 4/5] increase number of gems given to each contrib tier - https://github.com/HabitRPG/habitrpg/issues/3933 --- src/controllers/hall.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/controllers/hall.js b/src/controllers/hall.js index d3a2796476..6fc104b0a1 100644 --- a/src/controllers/hall.js +++ b/src/controllers/hall.js @@ -55,9 +55,17 @@ api.updateHero = function(req,res,next) { function(member, cb){ if (!member) return res.json(404, {err: "User not found"}); member.balance = req.body.balance || 0; - if (req.body.contributor.level > (member.contributor && member.contributor.level || 0)) { + newTier = req.body.contributor.level; // tier = level in this context + oldTier = member.contributor && member.contributor.level || 0; + if (newTier > oldTier) { member.flags.contributor = true; - member.balance += (req.body.contributor.level - (member.contributor.level || 0))*.5 // +2 gems per tier + gemsPerTier = {1:3, 2:3, 3:3, 4:4, 5:4, 6:4, 7:4, 8:0, 9:0}; // e.g., tier 5 gives 4 gems. Tier 8 = moderator. Tier 9 = staff + tierDiff = newTier - oldTier; // can be 2+ tier increases at once + while (tierDiff) { + member.balance += gemsPerTier[newTier] / 4; // balance is in $ + tierDiff--; + newTier--; // give them gems for the next tier down if they weren't aready that tier + } } member.contributor = req.body.contributor; member.purchased.ads = req.body.purchased.ads; @@ -74,4 +82,4 @@ api.updateHero = function(req,res,next) { if (err) return next(err); res.json(204); }) -} \ No newline at end of file +} From 35308853a53590c38dac27e5707dfc9832598dab Mon Sep 17 00:00:00 2001 From: Tyler Renelle Date: Fri, 24 Oct 2014 18:56:11 -0600 Subject: [PATCH 5/5] feat(contributors): small update to alys's script --- ...increase_gems_for_previous_contributions.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/migrations/20140831_increase_gems_for_previous_contributions.js b/migrations/20140831_increase_gems_for_previous_contributions.js index b79f3957c9..694409a5b7 100644 --- a/migrations/20140831_increase_gems_for_previous_contributions.js +++ b/migrations/20140831_increase_gems_for_previous_contributions.js @@ -34,15 +34,15 @@ var _ = require('lodash'); var dbUsers = mongo.db('localhost:27017/habitrpg?auto_reconnect').collection('users'); -var query = { $and: [ - { 'migration': {$ne: migrationName} }, - { 'contributor.level': {$gt: 0} }, - { 'contributor.level': {$lt: 9} } -]}; +var query = { + 'contributor.level': {$gt: 0, $lt: 9}, + 'migration': {$ne: migrationName} +}; -var fields = {'migration':1, +var fields = { + 'migration':1, 'contributor.level':1, - 'balance':1, + 'balance':1 }; var userResults = {}; // each key is a UUID, each value is a string @@ -51,7 +51,7 @@ var userResults = {}; // each key is a UUID, each value is a string console.warn('Updating users...'); var progressCount = 50; var count = 0; -dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { +dbUsers.findEach(query, fields, function(err, user) { if (err) { return exiting(1, 'ERROR! ' + err); } if (!user) { console.warn('All users found. Fetching final balances...'); @@ -90,7 +90,7 @@ function fetchFinalBalances() { }; var count1 = 0; - dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { + dbUsers.findEach(query, fields, function(err, user) { if (err) { return exiting(1, 'ERROR! ' + err); } if (!user) { console.warn('All final balances found.');