Merge branch 'develop' into hairlessbear-quest_invite_modal_on_user_sync
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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
@@ -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);
|
||||
});
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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},
|
||||
|
||||
@@ -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){
|
||||
|
||||
@@ -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';
|
||||
|
||||
Reference in New Issue
Block a user