mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-11-25 00:28:31 -05:00
38 lines
No EOL
1.8 KiB
CoffeeScript
38 lines
No EOL
1.8 KiB
CoffeeScript
CocoModel = require './CocoModel'
|
|
schema = require 'schemas/models/campaign.schema'
|
|
Level = require 'models/Level'
|
|
CocoCollection = require 'collections/CocoCollection'
|
|
|
|
module.exports = class Campaign extends CocoModel
|
|
@className: 'Campaign'
|
|
@schema: schema
|
|
urlRoot: '/db/campaign'
|
|
saveBackups: true
|
|
@denormalizedLevelProperties: _.keys(_.omit(schema.properties.levels.additionalProperties.properties, ['unlocks', 'position', 'rewards']))
|
|
@denormalizedCampaignProperties: ['name', 'i18n', 'slug']
|
|
|
|
statsForSessions: (sessions) ->
|
|
# common code for crunching stats for a user's progress on a campaign/course
|
|
return null unless sessions
|
|
stats = {}
|
|
sessions = sessions.models or sessions
|
|
sessions = _.sortBy sessions, (s) -> s.get('changed')
|
|
levels = _.values(@get('levels'))
|
|
levels = (level for level in levels when not _.contains(level.type, 'ladder'))
|
|
levelOriginals = _.pluck(levels, 'original')
|
|
sessionOriginals = (session.get('level').original for session in sessions when session.get('state').complete)
|
|
levelsLeft = _.size(_.difference(levelOriginals, sessionOriginals))
|
|
lastSession = _.last(sessions)
|
|
stats.levels = {
|
|
size: _.size(levels)
|
|
left: levelsLeft
|
|
done: levelsLeft is 0
|
|
numDone: _.size(levels) - levelsLeft
|
|
pctDone: (100 * (_.size(levels) - levelsLeft) / _.size(levels)).toFixed(1) + '%'
|
|
lastPlayed: if lastSession then _.findWhere levels, { original: lastSession.get('level').original } else null
|
|
first: _.first(levels)
|
|
arena: _.find _.values(@get('levels')), (level) -> _.contains(level.type, 'ladder')
|
|
}
|
|
sum = (nums) -> _.reduce(nums, (s, num) -> s + num) or 0
|
|
stats.playtime = sum((session.get('playtime') or 0 for session in sessions))
|
|
return stats |