codecombat/app/core/application.coffee

116 lines
4.7 KiB
CoffeeScript
Raw Normal View History

FacebookHandler = require 'core/social-handlers/FacebookHandler'
GPlusHandler = require 'core/social-handlers/GPlusHandler'
GitHubHandler = require 'core/social-handlers/GitHubHandler'
ModuleLoader = require 'core/ModuleLoader'
locale = require 'locale/locale'
{me} = require 'core/auth'
Tracker = require 'core/Tracker'
CocoModel = require 'models/CocoModel'
2014-01-03 13:32:13 -05:00
marked.setOptions {gfm: true, sanitize: true, smartLists: true, breaks: false}
# TODO, add C-style macro constants like this?
window.SPRITE_RESOLUTION_FACTOR = 3
window.SPRITE_PLACEHOLDER_WIDTH = 60
# Prevent Ctrl/Cmd + [ / ], P, S
ctrlDefaultPrevented = [219, 221, 80, 83]
preventBackspace = (event) ->
if event.keyCode is 8 and not elementAcceptsKeystrokes(event.srcElement or event.target)
event.preventDefault()
else if (event.ctrlKey or event.metaKey) and not event.altKey and event.keyCode in ctrlDefaultPrevented
console.debug "Prevented keystroke", key, event
event.preventDefault()
elementAcceptsKeystrokes = (el) ->
# http://stackoverflow.com/questions/1495219/how-can-i-prevent-the-backspace-key-from-navigating-back
el ?= document.activeElement
tag = el.tagName.toLowerCase()
type = el.type?.toLowerCase()
textInputTypes = ['text', 'password', 'file', 'number', 'search', 'url', 'tel', 'email', 'date', 'month', 'week', 'time', 'datetimelocal']
# not radio, checkbox, range, or color
2014-06-30 22:16:26 -04:00
return (tag is 'textarea' or (tag is 'input' and type in textInputTypes) or el.contentEditable in ['', 'true']) and not (el.readOnly or el.disabled)
COMMON_FILES = ['/images/pages/base/modal_background.png', '/images/level/popover_background.png', '/images/level/code_palette_wood_background.png', '/images/level/code_editor_background_border.png']
2014-01-03 13:32:13 -05:00
preload = (arrayOfImages) ->
$(arrayOfImages).each ->
$('<img/>')[0].src = @
# IE9 doesn't expose console object unless debugger tools are loaded
window.console ?=
info: ->
log: ->
error: ->
debug: ->
console.debug ?= console.log # Needed for IE10 and earlier
Application = {
initialize: ->
Router = require('core/Router')
@isProduction = -> document.location.href.search('https?://localhost') is -1
@isIPadApp = webkit?.messageHandlers? and navigator.userAgent?.indexOf('CodeCombat-iPad') isnt -1
$('body').addClass 'ipad' if @isIPadApp
$('body').addClass 'picoctf' if window.serverConfig.picoCTF
if $.browser.msie and parseInt($.browser.version) is 10
$("html").addClass("ie10")
@tracker = new Tracker()
@facebookHandler = new FacebookHandler()
@gplusHandler = new GPlusHandler()
@githubHandler = new GitHubHandler()
@moduleLoader = new ModuleLoader()
@moduleLoader.loadLanguage(me.get('preferredLanguage', true))
$(document).bind 'keydown', preventBackspace
preload(COMMON_FILES)
CocoModel.pollAchievements()
unless me.get('anonymous')
# TODO: Remove logging later, once this system has proved stable
me.on 'change:earned', (user, newEarned) ->
oldEarned = user.previous('earned')
if oldEarned.gems isnt newEarned.gems
console.log 'Gems changed', oldEarned.gems, '->', newEarned.gems
newLevels = _.difference(newEarned.levels, oldEarned.levels)
if newLevels.length
console.log 'Levels added', newLevels
newItems = _.difference(newEarned.items, oldEarned.items)
if newItems.length
console.log 'Items added', newItems
newHeroes = _.difference(newEarned.heroes, oldEarned.heroes)
if newHeroes.length
console.log 'Heroes added', newHeroes
me.on 'change:points', (user, newPoints) ->
console.log 'Points changed', user.previous('points'), '->', newPoints
@checkForNewAchievement()
$.i18n.init {
lng: me.get('preferredLanguage', true)
fallbackLng: 'en'
resStore: locale
useDataAttrOptions: true
#debug: true
#sendMissing: true
#sendMissingTo: 'current'
#resPostPath: '/languages/add/__lng__/__ns__'
}, (t) =>
@router = new Router()
onIdleChanged = (to) => => Backbone.Mediator.publish 'application:idle-changed', idle: @userIsIdle = to
@idleTracker = new Idle
onAway: onIdleChanged true
onAwayBack: onIdleChanged false
onHidden: onIdleChanged true
onVisible: onIdleChanged false
awayTimeout: 5 * 60 * 1000
@idleTracker.start()
checkForNewAchievement: ->
if me.get('lastAchievementChecked')
startFrom = new Date(me.get('lastAchievementChecked'))
else
startFrom = me.created()
daysSince = moment.duration(new Date() - startFrom).asDays()
if daysSince > 1
me.checkForNewAchievement().then => @checkForNewAchievement()
}
2014-01-03 13:32:13 -05:00
module.exports = Application
window.application = Application