Skip to content

Commit

Permalink
Update internal analytics
Browse files Browse the repository at this point in the history
Adding level session ID where applicable.
Slimming down fields for most common events.
  • Loading branch information
differentmatt committed Jan 15, 2015
1 parent 1ab2ea6 commit 116c7d0
Show file tree
Hide file tree
Showing 8 changed files with 78 additions and 25 deletions.
6 changes: 4 additions & 2 deletions app/core/Tracker.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -79,10 +79,12 @@ module.exports = class Tracker
unless event in ['Simulator Result', 'Started Level Load', 'Finished Level Load']
# Trimming properties we don't use internally
# TODO: delete internalProperites.level for 'Saw Victory' after 2/8/15. Should be using levelID instead.
if event in ['Clicked Level', 'Inventory Play', 'Heard Sprite', 'Started Level', 'Saw Victory', 'Click Play', 'Choose Inventory', 'Loaded World Map', 'Homepage Loaded']
if event in ['Clicked Level', 'Inventory Play', 'Heard Sprite', 'Started Level', 'Saw Victory', 'Click Play', 'Choose Inventory', 'Loaded World Map', 'Homepage Loaded', 'Change Hero']
delete properties.category
delete properties.label

else if event in ['Started Signup', 'Finished Signup', 'Login', 'Facebook Login', 'Google Login']
delete properties.category

console.log 'Tracking internal analytics event:', event, properties if debugAnalytics
request = @supermodel.addRequestResource 'log_event', {
url: '/db/analytics_log_event/-/log_event'
Expand Down
4 changes: 2 additions & 2 deletions app/lib/scripts/ScriptManager.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ module.exports = ScriptManager = class ScriptManager extends CocoClass
@scriptInProgress = true
@currentTimeouts = []
scriptLabel = "#{nextNoteGroup.scriptID} - #{nextNoteGroup.name}"
application.tracker?.trackEvent 'Script Started', {levelID: @levelID, label: scriptLabel}, ['Google Analytics']
application.tracker?.trackEvent 'Script Started', {levelID: @levelID, label: scriptLabel, ls: @session?.get('_id')}, ['Google Analytics']
console.debug "SCRIPT: Starting note group '#{nextNoteGroup.name}'" if @debugScripts
for module in nextNoteGroup.modules
@processNote(note, nextNoteGroup) for note in module.startNotes()
Expand Down Expand Up @@ -284,7 +284,7 @@ module.exports = ScriptManager = class ScriptManager extends CocoClass
@ending = true
return unless @currentNoteGroup?
scriptLabel = "#{@currentNoteGroup.scriptID} - #{@currentNoteGroup.name}"
application.tracker?.trackEvent 'Script Ended', {levelID: @levelID, label: scriptLabel}, ['Google Analytics']
application.tracker?.trackEvent 'Script Ended', {levelID: @levelID, label: scriptLabel, ls: @session?.get('_id')}, ['Google Analytics']
console.debug "SCRIPT: Ending note group '#{@currentNoteGroup.name}'" if @debugScripts
clearTimeout(timeout) for timeout in @currentTimeouts
for module in @currentNoteGroup.modules
Expand Down
7 changes: 6 additions & 1 deletion app/views/play/level/LevelDialogueView.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ module.exports = class LevelDialogueView extends CocoView
'click': 'onClick'
'click a': 'onClickLink'

constructor: (options) ->
super options
@level = options.level
@sessionID = options.sessionID

onClick: (e) ->
Backbone.Mediator.publish 'tome:focus-editor', {}

Expand All @@ -33,7 +38,7 @@ module.exports = class LevelDialogueView extends CocoView
$('body').addClass('dialogue-view-active')
@setMessage e.message, e.mood, e.responses

window.tracker?.trackEvent 'Heard Sprite', {message: e.message, label: e.message}, ['Google Analytics']
window.tracker?.trackEvent 'Heard Sprite', {message: e.message, label: e.message, ls: @sessionID}, ['Google Analytics']

onDialogueSoundCompleted: ->
@$el.removeClass 'speaking'
Expand Down
6 changes: 4 additions & 2 deletions app/views/play/level/PlayLevelView.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ module.exports = class PlayLevelView extends RootView
@insertSubView new LevelFlagsView levelID: @levelID, world: @world if @$el.hasClass 'flags'
@insertSubView new GoldView {}
@insertSubView new HUDView {level: @level}
@insertSubView new LevelDialogueView {level: @level}
@insertSubView new LevelDialogueView {level: @level, sessionID: @session.id}
@insertSubView new ChatView levelID: @levelID, sessionID: @session.id, session: @session
@insertSubView new ProblemAlertView session: @session, level: @level, supermodel: @supermodel
worldName = utils.i18n @level.attributes, 'name'
Expand Down Expand Up @@ -335,7 +335,8 @@ module.exports = class PlayLevelView extends RootView
if @options.realTimeMultiplayerSessionID?
Backbone.Mediator.publish 'playback:real-time-playback-waiting', {}
@realTimeMultiplayerContinueGame @options.realTimeMultiplayerSessionID
application.tracker?.trackEvent 'Started Level', category:'Play Level', levelID: @levelID
# TODO: Is it possible to create a Mongoose ObjectId for 'ls', instead of the string returned from get()?
application.tracker?.trackEvent 'Started Level', category:'Play Level', levelID: @levelID, ls: @session?.get('_id')

playAmbientSound: ->
return if @destroyed
Expand Down Expand Up @@ -418,6 +419,7 @@ module.exports = class PlayLevelView extends RootView
level: @level.get('name')
label: @level.get('name')
levelID: @levelID
ls: @session?.get('_id')
application.tracker?.trackTiming victoryTime, 'Level Victory Time', @levelID, @levelID, 100

showVictory: ->
Expand Down
4 changes: 2 additions & 2 deletions app/views/play/level/tome/ProblemAlertView.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ module.exports = class ProblemAlertView extends CocoView
@onWindowResize()
@render()
@onJiggleProblemAlert()
application.tracker?.trackEvent 'Show problem alert', levelID: @level.get('slug')
application.tracker?.trackEvent 'Show problem alert', {levelID: @level.get('slug'), ls: @session?.get('_id')}

onJiggleProblemAlert: ->
return unless @problem?
Expand All @@ -90,7 +90,7 @@ module.exports = class ProblemAlertView extends CocoView
@onRemoveClicked()

onClickProblemAlertHelp: ->
application.tracker?.trackEvent 'Problem alert help clicked', levelID: @level.get('slug')
application.tracker?.trackEvent 'Problem alert help clicked', {levelID: @level.get('slug'), ls: @session?.get('_id')}
@openModalView new GameMenuModal showTab: 'guide', level: @level, session: @session, supermodel: @supermodel

onRemoveClicked: ->
Expand Down
5 changes: 3 additions & 2 deletions app/views/play/menu/GuideView.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ module.exports = class LevelGuideView extends CocoView

constructor: (options) ->
@levelID = options.level.get('slug')
@sessionID = options.session.get('_id')
@helpVideos = options.level.get('helpVideos') ? []
@trackedHelpVideoStart = @trackedHelpVideoFinish = false

Expand Down Expand Up @@ -85,12 +86,12 @@ module.exports = class LevelGuideView extends CocoView

onStartHelpVideo: ->
unless @trackedHelpVideoStart
window.tracker?.trackEvent 'Start help video', level: @levelID, style: @helpVideos[@helpVideosIndex].style
window.tracker?.trackEvent 'Start help video', level: @levelID, ls: @sessionID, style: @helpVideos[@helpVideosIndex].style
@trackedHelpVideoStart = true

onFinishHelpVideo: ->
unless @trackedHelpVideoFinish
window.tracker?.trackEvent 'Finish help video', level: @levelID, style: @helpVideos[@helpVideosIndex].style
window.tracker?.trackEvent 'Finish help video', level: @levelID, ls: @sessionID, style: @helpVideos[@helpVideosIndex].style
@trackedHelpVideoFinish = true

setupVideoPlayer: () ->
Expand Down
70 changes: 56 additions & 14 deletions server/analytics/analytics_log_event_handler.coffee
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
log = require 'winston'
mongoose = require 'mongoose'
utils = require '../lib/utils'
AnalyticsLogEvent = require './AnalyticsLogEvent'
Campaign = require '../campaigns/Campaign'
Level = require '../levels/Level'
Handler = require '../commons/Handler'
log = require 'winston'
utils = require '../lib/utils'

class AnalyticsLogEventHandler extends Handler
modelClass: AnalyticsLogEvent
Expand Down Expand Up @@ -54,17 +55,10 @@ class AnalyticsLogEventHandler extends Handler
if eventID > 0
# TODO: properties slimming is pretty ugly
slimProperties = _.cloneDeep properties
if event is 'Saw Victory'
delete slimProperties.level
if slimProperties.levelID?
# levelID: string => l: string ID
utils.getAnalyticsStringID slimProperties.levelID, (levelStringID) ->
if levelStringID > 0
delete slimProperties.levelID
slimProperties.l = levelStringID
saveDoc eventID, slimProperties
return
else if event is 'Started Level'
if event in ['Clicked Level', 'Show problem alert', 'Started Level', 'Saw Victory', 'Problem alert help clicked', 'Spell palette help clicked']
delete slimProperties.level if event is 'Saw Victory'
properties.ls = mongoose.Types.ObjectId properties.ls if properties.ls
slimProperties.ls = mongoose.Types.ObjectId slimProperties.ls if slimProperties.ls
if slimProperties.levelID?
# levelID: string => l: string ID
utils.getAnalyticsStringID slimProperties.levelID, (levelStringID) ->
Expand All @@ -74,7 +68,9 @@ class AnalyticsLogEventHandler extends Handler
saveDoc eventID, slimProperties
return
else if event in ['Script Started', 'Script Ended']
if slimProperties.levelID?
properties.ls = mongoose.Types.ObjectId properties.ls if properties.ls
slimProperties.ls = mongoose.Types.ObjectId slimProperties.ls if slimProperties.ls
if slimProperties.levelID? and slimProperties.label?
# levelID: string => l: string ID
# label: string => lb: string ID
utils.getAnalyticsStringID slimProperties.levelID, (levelStringID) ->
Expand All @@ -87,6 +83,52 @@ class AnalyticsLogEventHandler extends Handler
slimProperties.lb = labelStringID
saveDoc eventID, slimProperties
return
else if event is 'Heard Sprite'
properties.ls = mongoose.Types.ObjectId properties.ls if properties.ls
slimProperties.ls = mongoose.Types.ObjectId slimProperties.ls if slimProperties.ls
if slimProperties.message?
# message: string => m: string ID
utils.getAnalyticsStringID slimProperties.message, (messageStringID) ->
if messageStringID > 0
delete slimProperties.message
slimProperties.m = messageStringID
saveDoc eventID, slimProperties
return
else if event in ['Start help video', 'Finish help video']
properties.ls = mongoose.Types.ObjectId properties.ls if properties.ls
slimProperties.ls = mongoose.Types.ObjectId slimProperties.ls if slimProperties.ls
if slimProperties.level and slimProperties.style?
# level: string => l: string ID
# style: string => s: string ID
utils.getAnalyticsStringID slimProperties.level, (levelStringID) ->
if levelStringID > 0
delete slimProperties.level
slimProperties.l = levelStringID
utils.getAnalyticsStringID slimProperties.style, (styleStringID) ->
if styleStringID > 0
delete slimProperties.style
slimProperties.s = styleStringID
saveDoc eventID, slimProperties
return
else if event is 'Show subscription modal'
delete properties.category
delete slimProperties.category
if slimProperties.label?
# label: string => lb: string ID
utils.getAnalyticsStringID slimProperties.label, (labelStringID) ->
if labelStringID > 0
delete slimProperties.label
slimProperties.lb = labelStringID
if slimProperties.level?
# level: string => l: string ID
utils.getAnalyticsStringID slimProperties.level, (levelStringID) ->
if levelStringID > 0
delete slimProperties.level
slimProperties.l = levelStringID
saveDoc eventID, slimProperties
return
saveDoc eventID, slimProperties
return
saveDoc eventID, slimProperties
else
log.warn "Unable to get analytics string ID for " + event
Expand Down
1 change: 1 addition & 0 deletions server/lib/utils.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ module.exports =
# Create an ObjectId with that hex timestamp
mongoose.Types.ObjectId(hexSeconds + "0000000000000000")
getAnalyticsStringID: (str, callback) ->
return callback -1 unless str?
@analyticsStringCache ?= {}
return callback @analyticsStringCache[str] if @analyticsStringCache[str]

Expand Down

0 comments on commit 116c7d0

Please sign in to comment.