2014-06-30 22:16:26 -04:00
CocoModel = require ' ./CocoModel '
2014-01-03 13:32:13 -05:00
module.exports = class LevelSession extends CocoModel
2014-06-30 22:16:26 -04:00
@className: ' LevelSession '
2014-04-22 14:11:08 -04:00
@schema: require ' schemas/models/level_session '
2014-06-30 22:16:26 -04:00
urlRoot: ' /db/level.session '
2014-01-03 13:32:13 -05:00
initialize: ->
super ( )
@ on ' sync ' , (e) =>
state = @ get ( ' state ' ) or { }
state . scripts ? = { }
@ set ( ' state ' , state )
2014-04-22 14:11:08 -04:00
2014-01-03 13:32:13 -05:00
updatePermissions: ->
2014-09-01 12:11:10 -04:00
permissions = @ get ' permissions ' , true
2014-01-03 13:32:13 -05:00
permissions = ( p for p in permissions when p . target isnt ' public ' )
if @ get ( ' multiplayer ' )
2014-06-30 22:16:26 -04:00
permissions . push { target: ' public ' , access: ' write ' }
2014-01-03 13:32:13 -05:00
@ set ' permissions ' , permissions
getSourceFor: (spellKey) ->
# spellKey ex: 'tharin/plan'
code = @ get ( ' code ' )
parts = spellKey . split ' / '
code ? [ parts [ 0 ] ] ? [ parts [ 1 ] ]
2014-05-05 19:59:12 -04:00
readyToRank: ->
return false unless @ get ( ' levelID ' ) # If it hasn't been denormalized, then it's not ready.
return false unless c1 = @ get ( ' code ' )
return false unless team = @ get ( ' team ' )
return true unless c2 = @ get ( ' submittedCode ' )
2014-06-30 22:16:26 -04:00
thangSpellArr = ( s . split ( ' / ' ) for s in @ get ( ' teamSpells ' ) [ team ] )
2014-05-05 19:59:12 -04:00
for item in thangSpellArr
thang = item [ 0 ]
spell = item [ 1 ]
2014-06-20 23:52:50 -04:00
return true if c1 [ thang ] [ spell ] isnt c2 [ thang ] ? [ spell ]
2014-05-05 19:59:12 -04:00
false
2014-07-29 10:50:07 -04:00
2014-08-03 17:58:51 -04:00
isMultiplayer: ->
2014-07-29 14:11:45 -04:00
@ get ( ' team ' ) ? # Only multiplayer level sessions have teams defined
2014-08-07 16:03:00 -04:00
completed: ->
@ get ( ' state ' ) ? . complete || false
2014-09-04 14:04:16 -04:00
shouldAvoidCorruptData: (attrs) ->
return false unless me . team is ' humans '
if _ . string . startsWith ( attrs ? . code ? @ get ( ' code ' ) ) ? . anya ? . makeBid ? ' ' , ' var __interceptThis '
noty text: " Not saving session--it ' s trying to overwrite Anya ' s code with transpiled output. Please let us know and help us reproduce this bug! " , layout: ' topCenter ' , type: ' error ' , killer: false , timeout: 120000
return true
false
save: (attrs, options) ->
return if @ shouldAvoidCorruptData attrs
super attrs , options
2015-01-05 13:44:17 -05:00
increaseDifficulty: ->
state = @ get ( ' state ' ) ? { }
state.difficulty = ( state . difficulty ? 0 ) + 1
delete state . lastUnsuccessfulSubmissionTime
@ set ' state ' , state
timeUntilResubmit: ->
state = @ get ( ' state ' ) ? { }
return 0 unless last = state . lastUnsuccessfulSubmissionTime
last = new Date ( last ) if _ . isString last
# Wait at least this long before allowing submit button active again.
( last - new Date ( ) ) + 22 * 60 * 60 * 1000