Merge branch 'develop' into hairlessbear-quest_invite_modal_on_user_sync

This commit is contained in:
Blade Barringer
2015-06-14 16:33:38 -05:00
679 changed files with 14883 additions and 11486 deletions
+12 -6
View File
@@ -40,6 +40,7 @@ var populateQuery = function(type, q, additionalFields){
q.populate('members', partyFields + (additionalFields ? (' ' + additionalFields) : ''));
else
q.populate(guildPopulate);
q.populate('leader', nameFields);
q.populate('invites', nameFields);
q.populate({
path: 'challenges',
@@ -834,13 +835,18 @@ questStart = function(req, res, next) {
updates['$set']['party.quest.progress.collect'] = collected;
updates['$set']['party.quest.completed'] = null;
questMembers[m] = true;
User.findOne({_id: m}, {pushDevices: 1}, function(err, user){
pushNotify.sendNotify(user, "HabitRPG", shared.i18n.t('questStarted') + ": "+ quest.text() );
});
} else {
updates['$set']['party.quest'] = Group.cleanQuestProgress();
}
parallel.push(function(cb2){
User.update({_id:m},updates,cb2);
});
})
});
group.quest.active = true;
if (quest.boss) {
@@ -917,10 +923,6 @@ api.questAccept = function(req, res, next) {
} else {
User.update({_id:m},{$set: {'party.quest.RSVPNeeded': true, 'party.quest.key': group.quest.key}}).exec();
group.quest.members[m] = undefined;
User.findById(m, function(err,groupMember){
pushNotify.sendNotify(groupMember, shared.i18n.t('questInvitationTitle'), shared.i18n.t('questInvitationInfo', { quest: quest.text() }));
});
}
});
@@ -928,7 +930,7 @@ api.questAccept = function(req, res, next) {
_id: {
$in: _.without(group.members, user._id)
}
}, {auth: 1, preferences: 1, profile: 1}, function(err, members){
}, {auth: 1, preferences: 1, profile: 1, pushDevices: 1}, function(err, members){
if(err) return next(err);
var inviterVars = utils.getUserInfo(user, ['name', 'email']);
@@ -944,6 +946,10 @@ api.questAccept = function(req, res, next) {
{name: 'PARTY_URL', content: '/#/options/groups/party'}
]);
_.each(members, function(groupMember){
pushNotify.sendNotify(groupMember, shared.i18n.t('questInvitationTitle'), shared.i18n.t('questInvitationInfo', { quest: quest.text() }));
});
questStart(req,res,next);
});
@@ -72,6 +72,7 @@ exports.createSubscription = function(data, cb) {
if (!data.gift) utils.txnEmail(data.user, 'subscription-begins');
utils.ga.event('commerce', 'subscribe', data.paymentMethod, block.price).send();
utils.ga.transaction(data.user._id, block.price).item(block.price, 1, data.paymentMethod.toLowerCase() + '-subscription', data.paymentMethod).send();
utils.mixpanel.track('purchase',{'distinct_id':data.user._id,'itemPurchased':block.key,'purchaseValue':block.price})
}
data.user.purchased.txnCount++;
if (data.gift){
@@ -123,6 +124,7 @@ exports.buyGems = function(data, cb) {
if(isProduction) {
if (!data.gift) utils.txnEmail(data.user, 'donation');
utils.ga.event('commerce', 'checkout', data.paymentMethod, amt).send();
utils.mixpanel.track('purchase',{'distinct_id':data.user._id,'itemPurchased':'Gems','purchaseValue':amt})
//TODO ga.transaction to reflect whether this is gift or self-purchase
utils.ga.transaction(data.user._id, amt).item(amt, 1, data.paymentMethod.toLowerCase() + "-checkout", "Gems > " + data.paymentMethod).send();
}
+1 -1
View File
@@ -334,7 +334,7 @@ api.update = function(req, res, next) {
api.cron = function(req, res, next) {
var user = res.locals.user,
progress = user.fns.cron({ga:ga}),
progress = user.fns.cron({ga:ga, mixpanel:utils.mixpanel}),
ranCron = user.isModified(),
quest = shared.content.quests[user.party.quest.key];
+1 -1
View File
@@ -127,7 +127,7 @@ var getUserLanguage = function(req, res, next){
}else if(req.locals && req.locals.user){
getFromUser(req.locals.user);
}else if(req.session && req.session.userId){
User.findOne({_id: req.session.userId}, function(err, user){
User.findOne({_id: req.session.userId}, 'preferences.language', function(err, user){
if(err) return next(err);
getFromUser(user);
});
+2 -1
View File
@@ -199,7 +199,8 @@ module.exports.locals = function(req, res, next) {
mods: require('./models/user').mods,
tavern: tavern, // for world boss
worldDmg: (tavern && tavern.quest && tavern.quest.extra && tavern.quest.extra.worldDmg) || {},
_: _
_: _,
MP_ID: nconf.get('MP_ID')
});
// Put query-string party (& guild but use partyInvite for backward compatibility)
+6 -2
View File
@@ -8,6 +8,7 @@ var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var shared = require('../../../common');
var _ = require('lodash');
var moment = require('moment');
// Task Schema
// -----------
@@ -50,10 +51,13 @@ var checklist = [{
var DailySchema = new Schema(
_.defaults({
type: {type:String, 'default': 'daily'},
type: {type: String, 'default': 'daily'},
frequency: {type: String, 'default': 'weekly', enum: ['daily', 'weekly']},
everyX: {type: Number, 'default': 1}, // e.g. once every X weeks
startDate: {type: Date, 'default': moment().startOf('day').toDate()},
history: Array,
completed: {type: Boolean, 'default': false},
repeat: {
repeat: { // used only for 'weekly' frequency,
m: {type: Boolean, 'default': true},
t: {type: Boolean, 'default': true},
w: {type: Boolean, 'default': true},
+19 -5
View File
@@ -34,7 +34,8 @@ var UserSchema = new Schema({
originalUser: Boolean,
helpedHabit: Boolean, //TODO: Deprecate this. Superseded by habitSurveys
habitSurveys: Number,
ultimateGear: Boolean,
ultimateGear: Boolean, //TODO: Deprecate this. Superseded by ultimateGearSets
ultimateGearSets: Schema.Types.Mixed,
beastMaster: Boolean,
beastMasterCount: Number,
mountMaster: Boolean,
@@ -129,7 +130,11 @@ var UserSchema = new Schema({
party: {type: Number, 'default': -1},
guilds: {type: Number, 'default': -1},
challenges: {type: Number, 'default': -1},
market: {type: Number, 'default': -1}
market: {type: Number, 'default': -1},
pets: {type: Number, 'default': -1},
mounts: {type: Number, 'default': -1},
hall: {type: Number, 'default': -1},
equipment: {type: Number, 'default': -1}
},
dropsEnabled: {type: Boolean, 'default': false},
itemsEnabled: {type: Boolean, 'default': false},
@@ -148,8 +153,14 @@ var UserSchema = new Schema({
recaptureEmailsPhase: {type: Number, 'default': 0},
// Needed to track the tip to send inside the email
weeklyRecapEmailsPhase: {type: Number, 'default': 0},
// Used to track when the next weekly recap should be sent
lastWeeklyRecap: {type: Date, 'default': Date.now},
communityGuidelinesAccepted: {type: Boolean, 'default': false},
cronCount: {type:Number, 'default':0}
cronCount: {type:Number, 'default':0},
welcomed: {type: Boolean, 'default': false},
armoireEnabled: {type: Boolean, 'default': false},
armoireOpened: {type: Boolean, 'default': false},
armoireEmpty: {type: Boolean, 'default': false}
},
history: {
exp: Array, // [{date: Date, value: Number}], // big peformance issues if these are defined
@@ -315,6 +326,7 @@ var UserSchema = new Schema({
advancedCollapsed: {type: Boolean, 'default': false},
toolbarCollapsed: {type:Boolean, 'default':false},
background: String,
displayInviteToPartyWhenPartyIs1: { type:Boolean, 'default':true},
webhooks: {type: Schema.Types.Mixed, 'default': {}},
// For this fields make sure to use strict comparison when searching for falsey values (=== false)
// As users who didn't login after these were introduced may have them undefined/null
@@ -395,7 +407,7 @@ var UserSchema = new Schema({
rewards: {type:[TaskSchemas.RewardSchema]},
extra: Schema.Types.Mixed,
pushDevices: {type: [{
regId: {type: String},
type: {type: String}
@@ -448,7 +460,9 @@ UserSchema.pre('save', function(next) {
newTask.name = newTask.name(self.preferences.language);
}else{
newTask.text = newTask.text(self.preferences.language);
newTask.notes = newTask.notes(self.preferences.language);
if(newTask.notes) {
newTask.notes = newTask.notes(self.preferences.language);
}
if(newTask.checklist){
newTask.checklist = _.map(newTask.checklist, function(checklistItem){
+5
View File
@@ -179,6 +179,11 @@ module.exports.setupConfig = function(){
baseUrl = nconf.get('BASE_URL');
module.exports.ga = require('universal-analytics')(nconf.get('GA_ID'));
var mixpanel = isProd && require('mixpanel');
module.exports.mixpanel = mixpanel
? mixpanel.init(nconf.get('MP_ID'))
: { track: function() {} };
};
var algorithm = 'aes-256-ctr';