mirror of
https://github.com/sudoxnym/habitica-self-host.git
synced 2026-08-01 03:30:25 +00:00
67 lines
2 KiB
CoffeeScript
67 lines
2 KiB
CoffeeScript
|
|
{get, view, ready} = require('derby').createApp module
|
||
|
|
|
||
|
|
## ROUTES ##
|
||
|
|
|
||
|
|
start = +new Date()
|
||
|
|
|
||
|
|
# Derby routes can be rendered on the client and the server
|
||
|
|
get '/:roomName?', (page, model, {roomName}) ->
|
||
|
|
roomName ||= 'home'
|
||
|
|
|
||
|
|
# Subscribes the model to any updates on this room's object. Calls back
|
||
|
|
# with a scoped model equivalent to:
|
||
|
|
# room = model.at "rooms.#{roomName}"
|
||
|
|
model.subscribe "rooms.#{roomName}", (err, room) ->
|
||
|
|
model.ref '_room', room
|
||
|
|
|
||
|
|
# setNull will set a value if the object is currently null or undefined
|
||
|
|
room.setNull 'welcome', "Welcome to #{roomName}!"
|
||
|
|
|
||
|
|
room.incr 'visits'
|
||
|
|
|
||
|
|
# This value is set for when the page initially renders
|
||
|
|
model.set '_timer', '0.0'
|
||
|
|
# Reset the counter when visiting a new route client-side
|
||
|
|
start = +new Date()
|
||
|
|
|
||
|
|
# Render will use the model data as well as an optional context object
|
||
|
|
page.render
|
||
|
|
roomName: roomName
|
||
|
|
randomUrl: parseInt(Math.random() * 1e9).toString(36)
|
||
|
|
|
||
|
|
|
||
|
|
## CONTROLLER FUNCTIONS ##
|
||
|
|
|
||
|
|
ready (model) ->
|
||
|
|
timer = null
|
||
|
|
|
||
|
|
# Expose the model as a global variable in the browser. This is fun in
|
||
|
|
# development, but it should be removed when writing an app
|
||
|
|
window.model = model
|
||
|
|
|
||
|
|
# Exported functions are exposed as a global in the browser with the same
|
||
|
|
# name as the module that includes Derby. They can also be bound to DOM
|
||
|
|
# events using the "x-bind" attribute in a template.
|
||
|
|
exports.stop = ->
|
||
|
|
|
||
|
|
# Any path name that starts with an underscore is private to the current
|
||
|
|
# client. Nothing set under a private path is synced back to the server.
|
||
|
|
model.set '_stopped', true
|
||
|
|
clearInterval timer
|
||
|
|
|
||
|
|
do exports.start = ->
|
||
|
|
model.set '_stopped', false
|
||
|
|
timer = setInterval ->
|
||
|
|
model.set '_timer', (((+new Date()) - start) / 1000).toFixed(1)
|
||
|
|
, 100
|
||
|
|
|
||
|
|
|
||
|
|
model.set '_showReconnect', true
|
||
|
|
exports.connect = ->
|
||
|
|
# Hide the reconnect link for a second after clicking it
|
||
|
|
model.set '_showReconnect', false
|
||
|
|
setTimeout (-> model.set '_showReconnect', true), 1000
|
||
|
|
model.socket.socket.connect()
|
||
|
|
|
||
|
|
exports.reload = -> window.location.reload()
|