Files
habitica/lib/app/index.js

363 lines
11 KiB
JavaScript

// Generated by CoffeeScript 1.3.3
var content, derby, get, helpers, ready, schema, scoring, view, _ref;
derby = require('derby');
_ref = derby.createApp(module), get = _ref.get, view = _ref.view, ready = _ref.ready;
derby.use(require('derby-ui-boot'));
derby.use(require('../../ui'));
content = require('./content');
scoring = require('./scoring');
schema = require('./schema');
helpers = require('./helpers');
helpers.viewHelpers(view);
get('/:uidParam?', function(page, model, _arg, next) {
var uidParam, userId;
uidParam = _arg.uidParam;
if (uidParam === 'privacy' || uidParam === 'terms') {
return next();
}
userId = model.get('_userId');
return model.subscribe("users." + userId, function(err, user) {
var guid, newUser, task, _i, _len, _ref1;
if (!user.get('id')) {
newUser = require('node.extend')(true, {}, schema.userSchema);
_ref1 = content.defaultTasks;
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
task = _ref1[_i];
guid = task.id = require('derby/node_modules/racer').uuid();
newUser.tasks[guid] = task;
switch (task.type) {
case 'habit':
newUser.habitIds.push(guid);
break;
case 'daily':
newUser.dailyIds.push(guid);
break;
case 'todo':
newUser.todoIds.push(guid);
break;
case 'reward':
newUser.rewardIds.push(guid);
}
}
model.set("users." + userId, newUser);
}
model.ref('_user', user);
model.set('_items', {
armor: content.items.armor[parseInt(user.get('items.armor')) + 1],
weapon: content.items.weapon[parseInt(user.get('items.weapon')) + 1],
potion: content.items.potion,
reroll: content.items.reroll
});
model.fn('_user._tnl', '_user.stats.lvl', function(lvl) {
return (50 * Math.pow(lvl, 2) - 150 * lvl + 200) / 5;
});
model.refList("_habitList", "_user.tasks", "_user.habitIds");
model.refList("_dailyList", "_user.tasks", "_user.dailyIds");
model.refList("_todoList", "_user.tasks", "_user.todoIds");
model.refList("_completedList", "_user.tasks", "_user.completedIds");
model.refList("_rewardList", "_user.tasks", "_user.rewardIds");
return page.render();
});
});
ready(function(model) {
var poormanscron, setupSortable, step, tour, type, _i, _j, _len, _len1, _ref1, _ref2;
$('#purl-link').val(window.location.toString() + model.get('_userId'));
$('[rel=popover]').popover();
model.on('set', '*', function() {
return $('[rel=popover]').popover();
});
if (!(model.get('_mobileDevice') === true)) {
setupSortable = function(type) {
return $("ul." + type + "s").sortable({
dropOnEmpty: false,
cursor: "move",
items: "li",
opacity: 0.4,
scroll: true,
axis: 'y',
update: function(e, ui) {
var domId, id, item, to;
item = ui.item[0];
domId = item.id;
id = item.getAttribute('data-id');
to = $("ul." + type + "s").children().index(item);
return model.at("_" + type + "List").pass({
ignore: domId
}).move({
id: id
}, to);
}
});
};
_ref1 = ['habit', 'daily', 'todo', 'reward'];
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
type = _ref1[_i];
setupSortable(type);
}
}
tour = new Tour();
_ref2 = content.tourSteps;
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
step = _ref2[_j];
tour.addStep({
element: step.element,
title: step.title,
content: step.content,
placement: step.placement
});
}
tour.start();
model.on('set', '_user.tasks.*.completed', function(i, completed, previous, isLocal, passed) {
var direction, from, fromIds, task, to, toIds, _ref3, _ref4;
if ((passed != null) && passed.cron) {
return;
}
direction = function() {
if (completed === true && previous === false) {
return 'up';
}
if (completed === false && previous === true) {
return 'down';
}
throw new Error("Direction neither 'up' nor 'down' on checkbox set.");
};
task = model.at("_user.tasks." + i);
scoring.score({
user: model.at('_user'),
task: task,
direction: direction()
});
if (task.get('type') === 'todo') {
_ref3 = direction() === 'up' ? ['todo', 'completed'] : ['completed', 'todo'], from = _ref3[0], to = _ref3[1];
_ref4 = ["_user." + from + "Ids", "_user." + to + "Ids"], from = _ref4[0], to = _ref4[1];
fromIds = model.get(from);
fromIds.splice(fromIds.indexOf(i), 1);
model.set(from, fromIds);
toIds = model.get(to);
toIds.push(i);
return model.set(to, toIds);
}
});
exports.addTask = function(e, el, next) {
var list, newModel, text;
type = $(el).attr('data-task-type');
list = model.at("_" + type + "List");
newModel = model.at('_new' + type.charAt(0).toUpperCase() + type.slice(1));
if (!(text = view.escapeHtml(newModel.get()))) {
return;
}
newModel.set('');
switch (type) {
case 'habit':
return list.push({
type: type,
text: text,
notes: '',
value: 0,
up: true,
down: true
});
case 'reward':
return list.push({
type: type,
text: text,
notes: '',
value: 20
});
case 'daily':
case 'todo':
return list.push({
type: type,
text: text,
notes: '',
value: 0,
completed: false
});
}
};
exports.del = function(e, el) {
var history, result, task;
task = model.at(e.target);
history = task.get('history');
if (history && history.length > 3 && task.get('value') < 0) {
result = confirm("Are you sure? Deleting this task will hurt you (to prevent deleting, then re-creating red tasks).");
if (result !== true) {
return;
} else {
task.set('type', 'habit');
scoring.score({
user: model.at('_user'),
task: task,
direction: 'down'
});
}
}
model.del('_user.tasks.' + task.get('id'));
return task.remove();
};
exports.clearCompleted = function(e, el) {
return _.each(model.get('_completedList'), function(task) {
model.del('_user.tasks.' + task.id);
return model.set('_user.completedIds', []);
});
};
exports.toggleTaskEdit = function(e, el) {
var hideId, toggleId;
hideId = $(el).attr('data-hide-id');
toggleId = $(el).attr('data-toggle-id');
$(document.getElementById(hideId)).hide();
return $(document.getElementById(toggleId)).toggle();
};
exports.toggleChart = function(e, el) {
var chart, chartSelector, data, date, hideSelector, historyPath, matrix, obj, options, readableDate, _k, _len2, _ref3;
hideSelector = $(el).attr('data-hide-id');
chartSelector = $(el).attr('data-toggle-id');
historyPath = $(el).attr('data-history-path');
$(document.getElementById(hideSelector)).hide();
$(document.getElementById(chartSelector)).toggle();
matrix = [['Date', 'Score']];
_ref3 = model.get(historyPath);
for (_k = 0, _len2 = _ref3.length; _k < _len2; _k++) {
obj = _ref3[_k];
date = new Date(obj.date);
readableDate = date.toISOString();
matrix.push([readableDate, obj.value]);
}
data = google.visualization.arrayToDataTable(matrix);
options = {
title: 'History',
backgroundColor: 'whiteSmoke'
};
chart = new google.visualization.LineChart(document.getElementById(chartSelector));
return chart.draw(data, options);
};
exports.buyItem = function(e, el, next) {
var hp, index, money, task, taskId, user, value, _ref3, _results;
user = model.at('_user');
money = user.get('stats.money');
_ref3 = [$(el).attr('data-type'), $(el).attr('data-value'), $(el).attr('data-index')], type = _ref3[0], value = _ref3[1], index = _ref3[2];
if (money < value) {
return;
}
user.set('stats.money', money - value);
if (type === 'armor') {
user.set('items.armor', index);
return model.set('_items.armor', content.items.armor[parseInt(index) + 1]);
} else if (type === 'weapon') {
user.set('items.weapon', index);
return model.set('_items.weapon', content.items.weapon[parseInt(index) + 1]);
} else if (type === 'potion') {
hp = user.get('stats.hp');
hp += 15;
if (hp > 50) {
hp = 50;
}
return user.set('stats.hp', hp);
} else if (type === 'reroll') {
_results = [];
for (taskId in user.get('tasks')) {
task = model.at('_user.tasks.' + taskId);
if (task.get('type') !== 'reward') {
_results.push(task.set('value', 0));
} else {
_results.push(void 0);
}
}
return _results;
}
};
exports.vote = function(e, el, next) {
var direction, task, user;
direction = $(el).attr('data-direction');
if (direction === 'true/') {
direction = 'up';
}
if (direction === 'false/') {
direction = 'down';
}
user = model.at('_user');
task = model.at($(el).parents('li')[0]);
return scoring.score({
user: user,
task: task,
direction: direction
});
};
exports.revive = function(e, el) {
var stats;
stats = model.at('_user.stats');
stats.set('hp', 50);
stats.set('lvl', 1);
stats.set('exp', 0);
stats.set('money', 0);
model.set('_user.items.armor', 0);
model.set('_user.items.weapon', 0);
model.set('_items.armor', content.items.armor[1]);
return model.set('_items.weapon', content.items.weapon[1]);
};
exports.poormanscron = poormanscron = function() {
var daysPassed, lastCron, today;
today = new Date();
model.setNull('_user.lastCron', today);
lastCron = model.get('_user.lastCron');
daysPassed = helpers.daysBetween(lastCron, today);
if (daysPassed > 0) {
model.set('_user.lastCron', today);
return _(daysPassed).times(function() {
return scoring.tally(model.at('_user'));
});
}
};
setTimeout(function() {
return poormanscron();
}, 2000);
setInterval(function() {
return poormanscron();
}, 3600000);
exports.endOfDayTally = function(e, el) {
return scoring.tally(model);
};
exports.updateSchema = function(e, el) {
return schema.updateSchema(model);
};
return exports.shortcuts = function(e) {
var code, command;
if (!(e.metaKey || e.ctrlKey)) {
return;
}
code = e.which;
if (!(command = ((function() {
switch (code) {
case 66:
return 'bold';
case 73:
return 'italic';
case 32:
return 'removeFormat';
case 220:
return 'removeFormat';
default:
return null;
}
})()))) {
return;
}
document.execCommand(command, false, null);
if (e.preventDefault) {
e.preventDefault();
}
return false;
};
});