feat(analytics): Party properties

Adds tracking of the user's party ID and size as user-level analytics properties.
This commit is contained in:
Sabe Jones
2015-07-27 14:25:11 -05:00
parent e72543641c
commit 9d7a2a1c24
5 changed files with 23 additions and 7 deletions

View File

@@ -9,6 +9,7 @@ describe('Analytics Service', function () {
user = specHelper.newUser(); user = specHelper.newUser();
user.contributor = {}; user.contributor = {};
user.purchased = { plan: {} }; user.purchased = { plan: {} };
user.flags.tour = { intro: null };
module(function($provide) { module(function($provide) {
$provide.value('User', {user: user}); $provide.value('User', {user: user});
@@ -217,7 +218,8 @@ describe('Analytics Service', function () {
Level: 24, Level: 24,
Mana: 41, Mana: 41,
contributorLevel: 1, contributorLevel: 1,
subscription: 'unique-plan-id' subscription: 'unique-plan-id',
tutorialComplete: true
}; };
beforeEach(function() { beforeEach(function() {
@@ -230,6 +232,7 @@ describe('Analytics Service', function () {
user.stats.mp = 41; user.stats.mp = 41;
user.contributor.level = 1; user.contributor.level = 1;
user.purchased.plan.planId = 'unique-plan-id'; user.purchased.plan.planId = 'unique-plan-id';
user.flags.tour.intro = -2;
analytics.updateUser(); analytics.updateUser();
clock.tick(); clock.tick();

View File

@@ -266,6 +266,9 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '
} }
$scope.message.content = ''; $scope.message.content = '';
$scope._sending = false; $scope._sending = false;
if (group.type == 'party') {
Analytics.updateUser({'partySize':group.memberCount});
}
if (group.privacy == 'public'){ if (group.privacy == 'public'){
Analytics.track({'hitType':'event','eventCategory':'behavior','eventAction':'group chat','groupType':group.type,'privacy':group.privacy,'groupName':group.name,'message':message}); Analytics.track({'hitType':'event','eventCategory':'behavior','eventAction':'group chat','groupType':group.type,'privacy':group.privacy,'groupName':group.name,'message':message});
} else { } else {
@@ -475,17 +478,19 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '
$scope.create = function(group){ $scope.create = function(group){
group.$save(function(){ group.$save(function(){
Analytics.track({'hitType':'event','eventCategory':'behavior','eventAction':'join group','owner':true,'groupType':'party','privacy':'private'}); Analytics.track({'hitType':'event','eventCategory':'behavior','eventAction':'join group','owner':true,'groupType':'party','privacy':'private'});
Analytics.updateUser({'partyID':group.id,'partySize':1});
$rootScope.hardRedirect('/#/options/groups/party'); $rootScope.hardRedirect('/#/options/groups/party');
}); });
} };
$scope.join = function(party){ $scope.join = function(party){
var group = new Groups.Group({_id: party.id, name: party.name}); var group = new Groups.Group({_id: party.id, name: party.name});
group.$join(function(){ group.$join(function(){
Analytics.track({'hitType':'event','eventCategory':'behavior','eventAction':'join group','owner':false,'groupType':'party','privacy':'private'}); Analytics.track({'hitType':'event','eventCategory':'behavior','eventAction':'join group','owner':false,'groupType':'party','privacy':'private'});
Analytics.updateUser({'partyID':party.id});
$rootScope.hardRedirect('/#/options/groups/party'); $rootScope.hardRedirect('/#/options/groups/party');
}); });
} };
// TODO: refactor guild and party leave into one function // TODO: refactor guild and party leave into one function
$scope.leave = function(keep) { $scope.leave = function(keep) {
@@ -494,10 +499,11 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '
$scope.popoverEl.popover('destroy'); $scope.popoverEl.popover('destroy');
} else { } else {
Groups.Group.leave({gid: $scope.selectedGroup._id, keep:keep}, undefined, function(){ Groups.Group.leave({gid: $scope.selectedGroup._id, keep:keep}, undefined, function(){
Analytics.updateUser({'partySize':null,'partyID':null});
$rootScope.hardRedirect('/#/options/groups/party'); $rootScope.hardRedirect('/#/options/groups/party');
}); });
} }
} };
// TODO: refactor guild and party clickLeave into one function // TODO: refactor guild and party clickLeave into one function
$scope.clickLeave = function(group, $event){ $scope.clickLeave = function(group, $event){
@@ -547,7 +553,7 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '
$scope.questAccept = function(party){ $scope.questAccept = function(party){
Groups.questAccept(party); Groups.questAccept(party);
} };
$scope.questReject = function(party){ $scope.questReject = function(party){
Groups.questReject(party); Groups.questReject(party);

View File

@@ -107,6 +107,7 @@
properties.Level = user.stats.lvl; properties.Level = user.stats.lvl;
properties.Mana = Math.floor(user.stats.mp); properties.Mana = Math.floor(user.stats.mp);
} }
if (user.flags.tour && user.flags.tour.intro === '-2') properties.tutorialComplete = true;
if (user.contributor && user.contributor.level) properties.contributorLevel = user.contributor.level; if (user.contributor && user.contributor.level) properties.contributorLevel = user.contributor.level;
if (user.purchased && user.purchased.plan.planId) properties.subscription = user.purchased.plan.planId; if (user.purchased && user.purchased.plan.planId) properties.subscription = user.purchased.plan.planId;
} }

View File

@@ -64,21 +64,25 @@ function($rootScope, ApiUrl, $resource, $q, $http, User, Challenges, Analytics,
}, },
questAccept: function(party){ questAccept: function(party){
Analytics.updateUser({'partySize':party.memberCount,'partyID':party.id});
party.$questAccept() party.$questAccept()
.then(syncUser, logError); .then(syncUser, logError);
}, },
questReject: function(party){ questReject: function(party){
Analytics.updateUser({'partySize':party.memberCount,'partyID':party.id});
party.$questReject() party.$questReject()
.then(syncUser, logError); .then(syncUser, logError);
}, },
questCancel: function(party){ questCancel: function(party){
Analytics.updateUser({'partySize':party.memberCount,'partyID':party.id});
party.$questCancel() party.$questCancel()
.then(syncUser, logError); .then(syncUser, logError);
}, },
questAbort: function(party){ questAbort: function(party){
Analytics.updateUser({'partySize':party.memberCount,'partyID':party.id});
party.$questAbort() party.$questAbort()
.then(syncUser, logError); .then(syncUser, logError);
}, },

View File

@@ -16,6 +16,7 @@
function questsFactory($rootScope,Content,Groups,User,Analytics) { function questsFactory($rootScope,Content,Groups,User,Analytics) {
var user = User.user; var user = User.user;
var party = $rootScope.party;
function lockQuest(quest,ignoreLevel) { function lockQuest(quest,ignoreLevel) {
if (!ignoreLevel){ if (!ignoreLevel){
@@ -86,8 +87,9 @@
function questInit(){ function questInit(){
Analytics.track({'hitType':'event','eventCategory':'behavior','eventAction':'quest','owner':true,'response':'accept','questName':$rootScope.selectedQuest.key}); Analytics.track({'hitType':'event','eventCategory':'behavior','eventAction':'quest','owner':true,'response':'accept','questName':$rootScope.selectedQuest.key});
$rootScope.party.$questAccept({key:$rootScope.selectedQuest.key}, function(){ Analytics.updateUser({'partySize':party.memberCount,'partyID':party.id});
$rootScope.party.$get(); party.$questAccept({key:$rootScope.selectedQuest.key}, function(){
party.$get();
$rootScope.$state.go('options.social.party'); $rootScope.$state.go('options.social.party');
}); });
closeQuest(); closeQuest();