From 8c45e22741b197c732ef237580fced30fb76f84d Mon Sep 17 00:00:00 2001 From: Nick Winter Date: Thu, 4 Sep 2014 11:04:16 -0700 Subject: [PATCH 1/4] Protection and logging for #1463. Fixed an issue with spectate camera script bounds. --- app/models/LevelSession.coffee | 11 +++++++++++ app/views/play/SpectateView.coffee | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/app/models/LevelSession.coffee b/app/models/LevelSession.coffee index ba87aef23..5d59d1bc2 100644 --- a/app/models/LevelSession.coffee +++ b/app/models/LevelSession.coffee @@ -42,3 +42,14 @@ module.exports = class LevelSession extends CocoModel completed: -> @get('state')?.complete || false + + 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 diff --git a/app/views/play/SpectateView.coffee b/app/views/play/SpectateView.coffee index 8cd6a79cb..f4d7514ba 100644 --- a/app/views/play/SpectateView.coffee +++ b/app/views/play/SpectateView.coffee @@ -217,7 +217,7 @@ module.exports = class SpectateLevelView extends RootView initScriptManager: -> if @world.scripts nonVictoryPlaybackScripts = _.reject @world.scripts, (script) -> - script.id.indexOf('Set Camera Boundaries and Goals') == -1 + script.id.indexOf('Set Camera Boundaries') is -1 else console.log 'World scripts don\'t exist!' nonVictoryPlaybackScripts = [] From ef8342efdd4a115c9de76ac3c5d67dca2e15f5e6 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Thu, 4 Sep 2014 11:16:01 -0700 Subject: [PATCH 2/4] Refactored the achievement schema, un-nesting definitions and bringing the query operator into force. --- app/schemas/models/achievement.coffee | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/app/schemas/models/achievement.coffee b/app/schemas/models/achievement.coffee index fe45e03b5..37690cadf 100644 --- a/app/schemas/models/achievement.coffee +++ b/app/schemas/models/achievement.coffee @@ -2,8 +2,7 @@ c = require './../schemas' # TODO add these: http://docs.mongodb.org/manual/reference/operator/query/ MongoQueryOperatorSchema = - title: 'MongoDB Query operator' - id: 'mongoQueryOperator' + title: 'Query Operator' type: 'object' properties: '$gt': type: 'number' @@ -13,26 +12,23 @@ MongoQueryOperatorSchema = '$lte': type: 'number' '$ne': type: ['number', 'string'] '$nin': type: 'array' - additionalProperties: true # TODO set to false when the schema's done + '$exists': type: 'boolean' + additionalProperties: false MongoFindQuerySchema = - title: 'MongoDB Query' - id: 'mongoFindQuery' + title: 'Query' type: 'object' patternProperties: - #'^[-a-zA-Z0-9_]*$': - '^[-a-zA-Z0-9\.]*$': - oneOf: [ - #{$ref: '#/definitions/' + MongoQueryOperatorSchema.id}, + '^[-a-zA-Z0-9.]*$': + anyOf: [ + {$ref: '#/definitions/mongoQueryOperator'}, {type: 'string'} {type: 'object'} {type: 'boolean'} ] - additionalProperties: true # TODO make Treema accept new pattern matched keys + additionalProperties: false definitions: {} -MongoFindQuerySchema.definitions[MongoQueryOperatorSchema.id] = MongoQueryOperatorSchema - AchievementSchema = c.object() c.extendNamedProperties AchievementSchema c.extendBasicProperties AchievementSchema, 'achievement' @@ -48,7 +44,7 @@ AchievementSchema.default = _.extend AchievementSchema.properties, query: #type:'object' - $ref: '#/definitions/' + MongoFindQuerySchema.id + $ref: '#/definitions/mongoFindQuery' worth: c.float collection: {type: 'string'} description: c.shortString() @@ -93,6 +89,7 @@ _.extend AchievementSchema, # Let's have these on the bottom additionalProperties: false AchievementSchema.definitions = {} -AchievementSchema.definitions[MongoFindQuerySchema.id] = MongoFindQuerySchema +AchievementSchema.definitions['mongoQueryOperator'] = MongoQueryOperatorSchema +AchievementSchema.definitions['mongoFindQuery'] = MongoFindQuerySchema module.exports = AchievementSchema From fca9a92167e63cfac798ff061f0c732bf73bc4c0 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Thu, 4 Sep 2014 11:16:41 -0700 Subject: [PATCH 3/4] Flattened the queries the NewAchievementModal creates. --- .../level/modals/NewAchievementModal.coffee | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/app/views/editor/level/modals/NewAchievementModal.coffee b/app/views/editor/level/modals/NewAchievementModal.coffee index 69847e26b..565f91af2 100644 --- a/app/views/editor/level/modals/NewAchievementModal.coffee +++ b/app/views/editor/level/modals/NewAchievementModal.coffee @@ -28,22 +28,13 @@ module.exports = class NewAchievementModal extends NewModelModal createQuery: -> checked = @$el.find('[name=queryOptions]:checked') checkedValues = ($(check).val() for check in checked) - subQueries = [] + query = {} for id in checkedValues switch id when 'misc-level-completion' - subQueries.push state: complete: true - else # It's a goal - q = state: goalStates: {} - q.state.goalStates[id] = {} - q.state.goalStates[id].status = 'success' - subQueries.push q - unless subQueries.length - query = {} - else if subQueries.length is 1 - query = subQueries[0] - else - query = $or: subQueries + query['state.complete'] = true + else + query["state.goalStates.#{id}.status"] = 'success' query['level.original'] = @level.get 'original' query From b698200cf063246af736358dff6d008bc3b368b8 Mon Sep 17 00:00:00 2001 From: Nick Winter Date: Thu, 4 Sep 2014 15:14:27 -0700 Subject: [PATCH 4/4] A few minor fixes. --- app/schemas/models/level_component.coffee | 5 +---- app/styles/play/level/hud.sass | 2 +- app/views/play/level/LevelHUDView.coffee | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/app/schemas/models/level_component.coffee b/app/schemas/models/level_component.coffee index 352573ad0..1bf647015 100644 --- a/app/schemas/models/level_component.coffee +++ b/app/schemas/models/level_component.coffee @@ -148,10 +148,7 @@ _.extend LevelComponentSchema.properties, type: 'boolean' title: 'Official' description: 'Whether this is an official CodeCombat Component.' - searchStrings: { - type: 'array' - items: { type: 'string' } - } + searchStrings: {type: 'string'} c.extendBasicProperties LevelComponentSchema, 'level.component' c.extendSearchableProperties LevelComponentSchema diff --git a/app/styles/play/level/hud.sass b/app/styles/play/level/hud.sass index fd30f304f..0b9f3dc8f 100644 --- a/app/styles/play/level/hud.sass +++ b/app/styles/play/level/hud.sass @@ -121,7 +121,7 @@ background-position-x: -4 * $iconSize &.prop-label-icon-attackDamage background-position-x: -5 * $iconSize - &.prop-label-icon-attackRange + &.prop-label-icon-attackRange, &.prop-label-icon-attackNearbyEnemyRange background-position-x: -6 * $iconSize &.prop-label-icon-maxSpeed background-position-x: -7 * $iconSize diff --git a/app/views/play/level/LevelHUDView.coffee b/app/views/play/level/LevelHUDView.coffee index 3f5c7f0ba..97cd9cad0 100644 --- a/app/views/play/level/LevelHUDView.coffee +++ b/app/views/play/level/LevelHUDView.coffee @@ -265,7 +265,7 @@ module.exports = class LevelHUDView extends CocoView return null # included in the bar context = prop: prop - hasIcon: prop in ['health', 'pos', 'target', 'collectedThangIDs', 'gold', 'bountyGold', 'visualRange', 'attackDamage', 'attackRange', 'maxSpeed'] + hasIcon: prop in ['health', 'pos', 'target', 'collectedThangIDs', 'gold', 'bountyGold', 'visualRange', 'attackDamage', 'attackRange', 'maxSpeed', 'attackNearbyEnemyRange'] hasBar: prop in ['health'] $(prop_template(context))