From 95b16f869020a7dcb39488275fe2dc42bb5b2b00 Mon Sep 17 00:00:00 2001 From: Alice Harris Date: Fri, 29 Aug 2014 18:45:02 +1000 Subject: [PATCH 1/4] change headAccessory to eyewear --- database_reports/count_users_who_own_specified_gear.js | 10 +++++----- src/models/coupon.js | 4 ++-- src/models/user.js | 2 ++ views/shared/header/avatar.jade | 6 ++++++ 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/database_reports/count_users_who_own_specified_gear.js b/database_reports/count_users_who_own_specified_gear.js index 7da478bfe8..6721069981 100644 --- a/database_reports/count_users_who_own_specified_gear.js +++ b/database_reports/count_users_who_own_specified_gear.js @@ -1,6 +1,6 @@ var itemsOfInterest = [ - 'headAccessory_special_wondercon_red', - 'headAccessory_special_wondercon_black', + 'eyewear_special_wondercon_red', + 'eyewear_special_wondercon_black', 'back_special_wondercon_black', 'back_special_wondercon_red', 'body_special_wondercon_red', @@ -55,15 +55,15 @@ print("\n"); CSV DATA: -"date","headAccessory_special_wondercon_red","headAccessory_special_wondercon_black","back_special_wondercon_black","back_special_wondercon_red","body_special_wondercon_red","body_special_wondercon_black","body_special_wondercon_gold" +"date","eyewear_special_wondercon_red","eyewear_special_wondercon_black","back_special_wondercon_black","back_special_wondercon_red","body_special_wondercon_red","body_special_wondercon_black","body_special_wondercon_gold" "2014-08-17","5","4","3","3","3","3","3" READABLE DATA: 2014-08-17 { - "headAccessory_special_wondercon_red": 5, - "headAccessory_special_wondercon_black": 4, + "eyewear_special_wondercon_red": 5, + "eyewear_special_wondercon_black": 4, "back_special_wondercon_black": 3, "back_special_wondercon_red": 3, "body_special_wondercon_red": 3, diff --git a/src/models/coupon.js b/src/models/coupon.js index 692cb91be9..38982fa6ca 100644 --- a/src/models/coupon.js +++ b/src/models/coupon.js @@ -29,8 +29,8 @@ CouponSchema.statics.apply = function(user, code, next){ if (coupon.user) return cb("Coupon already used"); switch (coupon.event) { case 'wondercon': - user.items.gear.owned.headAccessory_special_wondercon_red = true; - user.items.gear.owned.headAccessory_special_wondercon_black = true; + user.items.gear.owned.eyewear_special_wondercon_red = true; + user.items.gear.owned.eyewear_special_wondercon_black = true; user.items.gear.owned.back_special_wondercon_black = true; user.items.gear.owned.back_special_wondercon_red = true; user.items.gear.owned.body_special_wondercon_red = true; diff --git a/src/models/user.js b/src/models/user.js index a9e981b420..8990d10a96 100644 --- a/src/models/user.js +++ b/src/models/user.js @@ -139,6 +139,7 @@ var UserSchema = new Schema({ shield: {type: String, 'default': 'shield_base_0'}, back: String, headAccessory: String, + eyewear: String, body: String }, costume: { @@ -148,6 +149,7 @@ var UserSchema = new Schema({ shield: {type: String, 'default': 'shield_base_0'}, back: String, headAccessory: String, + eyewear: String, body: String }, }, diff --git a/views/shared/header/avatar.jade b/views/shared/header/avatar.jade index b0afded30d..afee0d95da 100644 --- a/views/shared/header/avatar.jade +++ b/views/shared/header/avatar.jade @@ -21,6 +21,7 @@ mixin avatar(opts) // Avatar span(class='skin_{{profile.preferences.skin}}', ng-if='!profile.preferences.sleep') span(class='skin_{{profile.preferences.skin}}_sleep', ng-if='profile.preferences.sleep') + // Shirt span(class='{{profile.preferences.size}}_shirt_{{profile.preferences.shirt}}') @@ -32,6 +33,7 @@ mixin avatar(opts) span(class='{{profile.items.gear.equipped.back}}_collar', ng-if='!profile.preferences.costume') span(class='{{profile.items.gear.costume.back}}_collar', ng-if='profile.preferences.costume') + // Body span(class='{{profile.items.gear.equipped.body}}', ng-if='!profile.preferences.costume') span(class='{{profile.items.gear.costume.body}}', ng-if='profile.preferences.costume') @@ -42,6 +44,10 @@ mixin avatar(opts) span(class='hair_mustache_{{profile.preferences.hair.mustache}}_{{profile.preferences.hair.color}}') span(class='hair_beard_{{profile.preferences.hair.beard}}_{{profile.preferences.hair.color}}') + // Eyewear + span(class='{{profile.items.gear.equipped.eyewear}}', ng-if='!profile.preferences.costume') + span(class='{{profile.items.gear.costume.eyewear}}', ng-if='profile.preferences.costume') + // Helm span(class='{{profile.items.gear.equipped.head}}', ng-if='!profile.preferences.costume') span(class='{{profile.items.gear.costume.head}}', ng-if='profile.preferences.costume') From 6791d875ff09200047d24fa08592e5c4eba0fecd Mon Sep 17 00:00:00 2001 From: Alice Harris Date: Fri, 29 Aug 2014 19:41:56 +1000 Subject: [PATCH 2/4] create migration scirpt for moving existing uses of headAccessories to eyewear --- ...0140829_change_headAccessory_to_eyewear.js | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 migrations/20140829_change_headAccessory_to_eyewear.js diff --git a/migrations/20140829_change_headAccessory_to_eyewear.js b/migrations/20140829_change_headAccessory_to_eyewear.js new file mode 100644 index 0000000000..de2eefb099 --- /dev/null +++ b/migrations/20140829_change_headAccessory_to_eyewear.js @@ -0,0 +1,84 @@ +// node .migrations/20140829_change_headAccessory_to_eyewear.js +// XXX tabs->spaces + +var migrationName = '20140829_change_headAccessory_to_eyewear'; +var authorName = 'Alys'; // in case script author needs to know when their ... +var authorUuid = 'd904bd62-da08-416b-a816-ba797c9ee265'; //... own data is done + +/** + * XXX change: https://github.com/HabitRPG/habitrpg/pull/666 + */ +var mongo = require('mongoskin'); +var _ = require('lodash'); + + +/////////////////// UNCOMMENT *ONE* OF THESE LINES: /////////////////// +// var liveUsers = mongo.db('lefnire:mAdn3s5s@charlotte.mongohq.com:10015/habitrpg_large?auto_reconnect').collection('users'); // @lefnire production? +// var liveUsers = mongo.db('localhost:27017/habitrpg_old?auto_reconnect').collection('users'); // @lefnire habitrpg_old +var liveUsers = mongo.db('localhost:27017/habitrpg?auto_reconnect').collection('users'); // for local testing by script author (e.g., vagrant install) + + +var fields = {'migration':1, + 'items.gear.costume.headAccessory':1, + 'items.gear.equipped.headAccessory':1, + 'items.gear.owned.headAccessory_special_wondercon_black':1, + 'items.gear.owned.headAccessory_special_wondercon_red':1, + 'items.gear.owned.headAccessory_special_summerRogue':1, + 'items.gear.owned.headAccessory_special_summerWarrior':1 + }; + +var progressCount = 1000; +var progressCount = 1; +var count = 0; +liveUsers.findEach({ $and: [ + { migration: {$ne:migrationName} }, + { $or: [ + {'items.gear.owned.headAccessory_special_summerRogue': {'$exists':true}}, + {'items.gear.owned.headAccessory_special_summerWarrior':{'$exists':true}}, + {'items.gear.owned.headAccessory_special_wondercon_red':{'$exists':true}}, + {'items.gear.owned.headAccessory_special_wondercon_black':{'$exists':true}} + ]} +]}, fields, {batchSize:250}, function(err, user){ + count++; + if (!user) err = '!user'; + if (err) {return console.error(err);} + + var set = {'migration': migrationName}; + var unset = {}; + + var oldToNew = { + 'headAccessory_special_summerRogue': 'eyewear_special_summerRogue', + 'headAccessory_special_summerWarrior': 'eyewear_special_summerWarrior', + 'headAccessory_special_wondercon_red': 'eyewear_special_wondercon_red', + 'headAccessory_special_wondercon_black':'eyewear_special_wondercon_black' + }; + + // items.gear.costume, items.gear.equipped: + _.each(['costume','equipped'],function(type){ + _.each(oldToNew,function(newName,oldName){ + if (user.items.gear[type].headAccessory === oldName) { + unset['items.gear.'+type+'.headAccessory'] = ""; + set['items.gear.'+type+'.eyewear'] = newName; + } + }); + }); + + // items.gear.owned: + _.each(oldToNew,function(newName,oldName){ + if (oldName in user.items.gear.owned) { + unset['items.gear.owned.'+oldName] = ""; + set['items.gear.owned.'+newName] = user.items.gear.owned[oldName]; + } + }); + + //console.log(JSON.stringify(user, null, " ")); // testing + //console.log("set: " + JSON.stringify(set, null, " ")); // testing + //console.log("unset: " + JSON.stringify(unset, null, " ")); // testing + + liveUsers.update({_id:user._id}, {$unset:unset, $inc:{_v:1}}); + liveUsers.update({_id:user._id}, {$set:set, $inc:{_v:1}}); + + if (count%progressCount == 0) console.log(count + ' ' + user._id); + if (user._id == '9') console.log('lefnire processed'); + if (user._id == authorUuid) console.log(authorName + ' processed'); +}); From 7a7fc831eb589c13bf8a956b847a27dbe4a8610f Mon Sep 17 00:00:00 2001 From: Alice Harris Date: Sat, 30 Aug 2014 11:46:53 +1000 Subject: [PATCH 3/4] tidy up migration script --- ...0140829_change_headAccessory_to_eyewear.js | 97 +++++++++---------- 1 file changed, 48 insertions(+), 49 deletions(-) diff --git a/migrations/20140829_change_headAccessory_to_eyewear.js b/migrations/20140829_change_headAccessory_to_eyewear.js index de2eefb099..f9998a8660 100644 --- a/migrations/20140829_change_headAccessory_to_eyewear.js +++ b/migrations/20140829_change_headAccessory_to_eyewear.js @@ -1,12 +1,11 @@ // node .migrations/20140829_change_headAccessory_to_eyewear.js -// XXX tabs->spaces var migrationName = '20140829_change_headAccessory_to_eyewear'; var authorName = 'Alys'; // in case script author needs to know when their ... var authorUuid = 'd904bd62-da08-416b-a816-ba797c9ee265'; //... own data is done /** - * XXX change: https://github.com/HabitRPG/habitrpg/pull/666 + * https://github.com/HabitRPG/habitrpg/issues/3645 */ var mongo = require('mongoskin'); var _ = require('lodash'); @@ -15,17 +14,17 @@ var _ = require('lodash'); /////////////////// UNCOMMENT *ONE* OF THESE LINES: /////////////////// // var liveUsers = mongo.db('lefnire:mAdn3s5s@charlotte.mongohq.com:10015/habitrpg_large?auto_reconnect').collection('users'); // @lefnire production? // var liveUsers = mongo.db('localhost:27017/habitrpg_old?auto_reconnect').collection('users'); // @lefnire habitrpg_old -var liveUsers = mongo.db('localhost:27017/habitrpg?auto_reconnect').collection('users'); // for local testing by script author (e.g., vagrant install) +// var liveUsers = mongo.db('localhost:27017/habitrpg?auto_reconnect').collection('users'); // for local testing by script author (e.g., vagrant install) var fields = {'migration':1, - 'items.gear.costume.headAccessory':1, - 'items.gear.equipped.headAccessory':1, - 'items.gear.owned.headAccessory_special_wondercon_black':1, - 'items.gear.owned.headAccessory_special_wondercon_red':1, - 'items.gear.owned.headAccessory_special_summerRogue':1, - 'items.gear.owned.headAccessory_special_summerWarrior':1 - }; + 'items.gear.costume.headAccessory':1, + 'items.gear.equipped.headAccessory':1, + 'items.gear.owned.headAccessory_special_wondercon_black':1, + 'items.gear.owned.headAccessory_special_wondercon_red':1, + 'items.gear.owned.headAccessory_special_summerRogue':1, + 'items.gear.owned.headAccessory_special_summerWarrior':1 + }; var progressCount = 1000; var progressCount = 1; @@ -33,52 +32,52 @@ var count = 0; liveUsers.findEach({ $and: [ { migration: {$ne:migrationName} }, { $or: [ - {'items.gear.owned.headAccessory_special_summerRogue': {'$exists':true}}, - {'items.gear.owned.headAccessory_special_summerWarrior':{'$exists':true}}, - {'items.gear.owned.headAccessory_special_wondercon_red':{'$exists':true}}, - {'items.gear.owned.headAccessory_special_wondercon_black':{'$exists':true}} + {'items.gear.owned.headAccessory_special_summerRogue': {'$exists':true}}, + {'items.gear.owned.headAccessory_special_summerWarrior':{'$exists':true}}, + {'items.gear.owned.headAccessory_special_wondercon_red':{'$exists':true}}, + {'items.gear.owned.headAccessory_special_wondercon_black':{'$exists':true}} ]} ]}, fields, {batchSize:250}, function(err, user){ - count++; - if (!user) err = '!user'; - if (err) {return console.error(err);} + count++; + if (!user) err = '!user'; + if (err) {return console.error(err);} - var set = {'migration': migrationName}; - var unset = {}; + var set = {'migration': migrationName}; + var unset = {}; - var oldToNew = { - 'headAccessory_special_summerRogue': 'eyewear_special_summerRogue', - 'headAccessory_special_summerWarrior': 'eyewear_special_summerWarrior', - 'headAccessory_special_wondercon_red': 'eyewear_special_wondercon_red', - 'headAccessory_special_wondercon_black':'eyewear_special_wondercon_black' - }; + var oldToNew = { + 'headAccessory_special_summerRogue': 'eyewear_special_summerRogue', + 'headAccessory_special_summerWarrior': 'eyewear_special_summerWarrior', + 'headAccessory_special_wondercon_red': 'eyewear_special_wondercon_red', + 'headAccessory_special_wondercon_black':'eyewear_special_wondercon_black' + }; - // items.gear.costume, items.gear.equipped: - _.each(['costume','equipped'],function(type){ - _.each(oldToNew,function(newName,oldName){ - if (user.items.gear[type].headAccessory === oldName) { - unset['items.gear.'+type+'.headAccessory'] = ""; - set['items.gear.'+type+'.eyewear'] = newName; - } - }); - }); + // items.gear.costume, items.gear.equipped: + _.each(['costume','equipped'],function(type){ + _.each(oldToNew,function(newName,oldName){ + if (user.items.gear[type].headAccessory === oldName) { + unset['items.gear.'+type+'.headAccessory'] = ""; + set['items.gear.'+type+'.eyewear'] = newName; + } + }); + }); - // items.gear.owned: - _.each(oldToNew,function(newName,oldName){ - if (oldName in user.items.gear.owned) { - unset['items.gear.owned.'+oldName] = ""; - set['items.gear.owned.'+newName] = user.items.gear.owned[oldName]; - } - }); + // items.gear.owned: + _.each(oldToNew,function(newName,oldName){ + if (oldName in user.items.gear.owned) { + unset['items.gear.owned.'+oldName] = ""; + set['items.gear.owned.'+newName] = user.items.gear.owned[oldName]; + } + }); - //console.log(JSON.stringify(user, null, " ")); // testing - //console.log("set: " + JSON.stringify(set, null, " ")); // testing - //console.log("unset: " + JSON.stringify(unset, null, " ")); // testing + //console.log(JSON.stringify(user, null, " ")); + //console.log("set: " + JSON.stringify(set, null, " ")); + //console.log("unset: " + JSON.stringify(unset, null, " ")); - liveUsers.update({_id:user._id}, {$unset:unset, $inc:{_v:1}}); - liveUsers.update({_id:user._id}, {$set:set, $inc:{_v:1}}); + liveUsers.update({_id:user._id}, {$unset:unset, $inc:{_v:1}}); + liveUsers.update({_id:user._id}, {$set:set, $inc:{_v:1}}); - if (count%progressCount == 0) console.log(count + ' ' + user._id); - if (user._id == '9') console.log('lefnire processed'); - if (user._id == authorUuid) console.log(authorName + ' processed'); + if (count%progressCount == 0) console.log(count + ' ' + user._id); + if (user._id == '9') console.log('lefnire processed'); + if (user._id == authorUuid) console.log(authorName + ' processed'); }); From 6e712fc0f9f4b0288203142644881e89e8014998 Mon Sep 17 00:00:00 2001 From: Alice Harris Date: Sat, 30 Aug 2014 13:00:46 +1000 Subject: [PATCH 4/4] set correct progressCount in migration script --- migrations/20140829_change_headAccessory_to_eyewear.js | 1 - 1 file changed, 1 deletion(-) diff --git a/migrations/20140829_change_headAccessory_to_eyewear.js b/migrations/20140829_change_headAccessory_to_eyewear.js index f9998a8660..3632a393cd 100644 --- a/migrations/20140829_change_headAccessory_to_eyewear.js +++ b/migrations/20140829_change_headAccessory_to_eyewear.js @@ -27,7 +27,6 @@ var fields = {'migration':1, }; var progressCount = 1000; -var progressCount = 1; var count = 0; liveUsers.findEach({ $and: [ { migration: {$ne:migrationName} },