mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-03-14 07:00:01 -04:00
Update internal analytics
Adding level session ID where applicable. Slimming down fields for most common events.
This commit is contained in:
parent
1ab2ea6910
commit
116c7d0bf2
8 changed files with 78 additions and 25 deletions
|
@ -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'
|
||||
|
|
|
@ -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()
|
||||
|
@ -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
|
||||
|
|
|
@ -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', {}
|
||||
|
||||
|
@ -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'
|
||||
|
|
|
@ -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'
|
||||
|
@ -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
|
||||
|
@ -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: ->
|
||||
|
|
|
@ -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?
|
||||
|
@ -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: ->
|
||||
|
|
|
@ -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
|
||||
|
||||
|
@ -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: () ->
|
||||
|
|
|
@ -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
|
||||
|
@ -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) ->
|
||||
|
@ -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) ->
|
||||
|
@ -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
|
||||
|
|
|
@ -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]
|
||||
|
||||
|
|
Loading…
Reference in a new issue