mirror of
https://github.com/sudoxnym/habitica-self-host.git
synced 2026-08-02 04:00:36 +00:00
habitrpg-shared: helpers now working d42ac5d53c
This commit is contained in:
parent
5d1368e794
commit
6a36f4bd1d
9 changed files with 66 additions and 233 deletions
|
|
@ -1,224 +0,0 @@
|
|||
moment = require 'moment'
|
||||
_ = require 'underscore'
|
||||
relative = require 'relative-date'
|
||||
algos = require './algos'
|
||||
items = require('habitrpg-shared/script/items').items
|
||||
|
||||
sod = (timestamp, dayStart=0) ->
|
||||
#sanity-check reset-time (is it 24h time?)
|
||||
dayStart = 0 unless (dayStart = parseInt(dayStart)) and (0 <= dayStart <= 24)
|
||||
moment(timestamp).startOf('day').add('h', dayStart)
|
||||
|
||||
# Absolute diff between two dates
|
||||
daysBetween = (yesterday, now, dayStart) -> Math.abs sod(yesterday, dayStart).diff(now, 'days')
|
||||
|
||||
dayMapping = {0:'su',1:'m',2:'t',3:'w',4:'th',5:'f',6:'s'}
|
||||
|
||||
shouldDo = (day, repeat, dayStart=0) ->
|
||||
return false unless repeat
|
||||
now = +new Date
|
||||
selected = repeat[dayMapping[sod(day, dayStart).day()]]
|
||||
return selected unless moment(day).isSame(now,'d')
|
||||
if dayStart <= moment(now).hour() # we're past the dayStart mark, is it due today?
|
||||
return selected
|
||||
else # we're not past dayStart mark, check if it was due "yesterday"
|
||||
yesterday = moment(now).subtract(1,'d').day()
|
||||
return repeat[dayMapping[yesterday]]
|
||||
|
||||
# http://stackoverflow.com/questions/2532218/pick-random-property-from-a-javascript-object
|
||||
# obj: object
|
||||
# returns random property (the value)
|
||||
randomVal = (obj) ->
|
||||
result = undefined
|
||||
count = 0
|
||||
for key, val of obj
|
||||
result = val if Math.random() < (1 / ++count)
|
||||
result
|
||||
|
||||
removeWhitespace = (str) ->
|
||||
return '' unless str
|
||||
str.replace /\s/g, ''
|
||||
|
||||
username = (auth, override) ->
|
||||
#some people define custom profile name in Avatar -> Profile
|
||||
return override if override
|
||||
|
||||
if auth?.facebook?.displayName?
|
||||
auth.facebook.displayName
|
||||
else if auth?.facebook?
|
||||
fb = auth.facebook
|
||||
if fb._raw then "#{fb.name.givenName} #{fb.name.familyName}" else fb.name
|
||||
else if auth?.local?
|
||||
auth.local.username
|
||||
else
|
||||
'Anonymous'
|
||||
|
||||
viewHelpers = (view) ->
|
||||
view.fn "percent", (x, y) ->
|
||||
x=1 if x==0
|
||||
Math.round(x/y*100)
|
||||
|
||||
view.fn "round", Math.round
|
||||
view.fn "floor", Math.floor
|
||||
view.fn "ceil", Math.ceil
|
||||
view.fn "lt", (a, b) -> a < b
|
||||
view.fn 'gt', (a, b) -> a > b
|
||||
view.fn "mod", (a, b) -> parseInt(a) % parseInt(b) == 0
|
||||
view.fn 'removeWhitespace', removeWhitespace
|
||||
view.fn "notEqual", (a, b) -> (a != b)
|
||||
view.fn "and", -> _.reduce arguments, (cumm, curr) -> cumm && curr
|
||||
view.fn "or", -> _.reduce arguments, (cumm, curr) -> cumm || curr
|
||||
view.fn "truarr", (num) -> num-1
|
||||
view.fn 'count', (arr) -> arr?.length or 0
|
||||
|
||||
view.fn "gems", (gp) -> return gp/0.25
|
||||
|
||||
view.fn "encodeiCalLink", (uid, apiToken) ->
|
||||
loc = window?.location.host or process.env.BASE_URL
|
||||
encodeURIComponent "http://#{loc}/v1/users/#{uid}/calendar.ics?apiToken=#{apiToken}"
|
||||
|
||||
|
||||
###
|
||||
User
|
||||
###
|
||||
view.fn "username", (auth, override) -> username(auth, override)
|
||||
view.fn "tnl", algos.tnl
|
||||
|
||||
###
|
||||
Items
|
||||
###
|
||||
view.fn 'equipped', (type, item=0, preferences={gender:'m', armorSet:'v1'}, backerTier=0) ->
|
||||
{gender, armorSet} = preferences
|
||||
item = parseInt(item)
|
||||
backerTier = parseInt(backerTier)
|
||||
|
||||
switch type
|
||||
when'armor'
|
||||
if item > 5
|
||||
return 'armor_6' if backerTier >= 45
|
||||
item = 5 # set them back if they're trying to cheat
|
||||
if gender is 'f'
|
||||
return if (item is 0) then "f_armor_#{item}_#{armorSet}" else "f_armor_#{item}"
|
||||
else
|
||||
return "m_armor_#{item}"
|
||||
|
||||
when 'head'
|
||||
if item > 5
|
||||
return 'head_6' if backerTier >= 45
|
||||
item = 5
|
||||
if gender is 'f'
|
||||
return if (item > 1) then "f_head_#{item}_#{armorSet}" else "f_head_#{item}"
|
||||
else
|
||||
return "m_head_#{item}"
|
||||
|
||||
when 'shield'
|
||||
if item > 5
|
||||
return 'shield_6' if backerTier >= 45
|
||||
item = 5
|
||||
return "#{preferences.gender}_shield_#{item}"
|
||||
|
||||
when 'weapon'
|
||||
if item > 6
|
||||
return 'weapon_7' if backerTier >= 70
|
||||
item = 6
|
||||
return "#{preferences.gender}_weapon_#{item}"
|
||||
|
||||
view.fn "gold", (num) ->
|
||||
if num
|
||||
return (num).toFixed(1).split('.')[0]
|
||||
else
|
||||
return "0"
|
||||
|
||||
view.fn "silver", (num) ->
|
||||
if num
|
||||
(num).toFixed(2).split('.')[1]
|
||||
else
|
||||
return "00"
|
||||
|
||||
###
|
||||
Tasks
|
||||
###
|
||||
view.fn 'taskClasses', (task, filters, dayStart, lastCron, showCompleted=false) ->
|
||||
return unless task
|
||||
{type, completed, value, repeat} = task
|
||||
|
||||
# completed / remaining toggle
|
||||
return 'hidden' if (type is 'todo') and (completed != showCompleted)
|
||||
|
||||
for filter, enabled of filters
|
||||
if enabled and not task.tags?[filter]
|
||||
# All the other classes don't matter
|
||||
return 'hidden'
|
||||
|
||||
classes = type
|
||||
|
||||
# show as completed if completed (naturally) or not required for today
|
||||
if type in ['todo', 'daily']
|
||||
if completed or (type is 'daily' and !shouldDo(+new Date, task.repeat, dayStart))
|
||||
classes += " completed"
|
||||
else
|
||||
classes += " uncompleted"
|
||||
else if type is 'habit'
|
||||
classes += ' habit-wide' if task.down and task.up
|
||||
|
||||
if value < -20
|
||||
classes += ' color-worst'
|
||||
else if value < -10
|
||||
classes += ' color-worse'
|
||||
else if value < -1
|
||||
classes += ' color-bad'
|
||||
else if value < 1
|
||||
classes += ' color-neutral'
|
||||
else if value < 5
|
||||
classes += ' color-good'
|
||||
else if value < 10
|
||||
classes += ' color-better'
|
||||
else
|
||||
classes += ' color-best'
|
||||
return classes
|
||||
|
||||
view.fn 'ownsPet', (pet, userPets) -> _.isArray(userPets) and userPets.indexOf(pet) != -1
|
||||
|
||||
view.fn 'friendlyTimestamp', (timestamp) -> moment(timestamp).format('MM/DD h:mm:ss a')
|
||||
|
||||
view.fn 'newChatMessages', (messages, lastMessageSeen) ->
|
||||
return false unless messages?.length > 0
|
||||
messages?[0] and (messages[0].id != lastMessageSeen)
|
||||
|
||||
view.fn 'indexOf', (str1, str2) ->
|
||||
return false unless str1 && str2
|
||||
str1.indexOf(str2) != -1
|
||||
|
||||
view.fn 'relativeDate', relative
|
||||
|
||||
view.fn 'noTags', (tags) ->
|
||||
_.isEmpty(tags) or _.isEmpty(_.filter( tags, (t) -> t ) )
|
||||
|
||||
view.fn 'appliedTags', (userTags, taskTags) ->
|
||||
arr = []
|
||||
_.each userTags, (t) ->
|
||||
return unless t?
|
||||
arr.push(t.name) if taskTags?[t.id]
|
||||
arr.join(', ')
|
||||
|
||||
view.fn 'userStr', (level) ->
|
||||
str = (level-1) / 2
|
||||
view.fn 'totalStr', (level, weapon=0) ->
|
||||
str = (level-1) / 2
|
||||
totalStr = (str + items.weapon[weapon].strength)
|
||||
view.fn 'userDef', (level) ->
|
||||
def = (level-1) / 2
|
||||
view.fn 'totalDef', (level, armor=0, helm=0, shield=0) ->
|
||||
def = (level-1) / 2
|
||||
totalDef = (def + items.armor[armor].defense + items.head[helm].defense + items.shield[shield].defense)
|
||||
view.fn 'itemText', (type, item=0) -> items[type][parseInt(item)].text
|
||||
view.fn 'itemStat', (type, item=0) -> if type is 'weapon' then items[type][parseInt(item)].strength else items[type][parseInt(item)].defense
|
||||
|
||||
|
||||
# view.fn 'activeFilters', (filters) ->
|
||||
# debugger
|
||||
# (_.find filters, (f) -> f)?
|
||||
|
||||
|
||||
|
||||
module.exports = { viewHelpers, removeWhitespace, randomVal, daysBetween, shouldDo, username }
|
||||
|
|
@ -17,8 +17,7 @@ i18n.localize app,
|
|||
urlScheme: false
|
||||
checkHeader: true
|
||||
|
||||
helpers = require './helpers'
|
||||
helpers.viewHelpers view
|
||||
require('./viewHelpers').setup view
|
||||
|
||||
_ = require('underscore')
|
||||
|
||||
|
|
|
|||
|
|
@ -1,10 +1,9 @@
|
|||
_ = require('underscore')
|
||||
helpers = require './helpers'
|
||||
helpers = require('habitrpg-shared/script/helpers')
|
||||
|
||||
module.exports.app = (appExports, model, app) ->
|
||||
character = require './character'
|
||||
browser = require './browser'
|
||||
helpers = require './helpers'
|
||||
|
||||
_currentTime = model.at '_currentTime'
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
_ = require 'underscore'
|
||||
{ randomVal } = require './helpers'
|
||||
{ randomVal } = require 'habitrpg-shared/script/helpers'
|
||||
{ pets, hatchingPotions } = require('habitrpg-shared/script/items').items
|
||||
|
||||
###
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
character = require './character'
|
||||
browser = require './browser'
|
||||
helpers = require './helpers'
|
||||
helpers = require 'habitrpg-shared/script/helpers'
|
||||
|
||||
module.exports.app = (appExports, model) ->
|
||||
user = model.at('_user')
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
moment = require 'moment'
|
||||
_ = require 'underscore'
|
||||
{ randomVal } = helpers = require './helpers'
|
||||
{ randomVal } = helpers = require 'habitrpg-shared/script/helpers'
|
||||
browser = require './browser'
|
||||
character = require './character'
|
||||
items = require 'habitrpg-shared/script/items'
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
scoring = require './scoring'
|
||||
helpers = require './helpers'
|
||||
helpers = require 'habitrpg-shared/script/helpers'
|
||||
_ = require 'underscore'
|
||||
moment = require 'moment'
|
||||
character = require './character'
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
_ = require 'underscore'
|
||||
{ randomVal } = require './helpers'
|
||||
{ randomVal } = require 'habitrpg-shared/script/helpers'
|
||||
{ pets, hatchingPotions } = require('habitrpg-shared/script/items').items
|
||||
|
||||
###
|
||||
|
|
|
|||
59
src/app/viewHelpers.coffee
Normal file
59
src/app/viewHelpers.coffee
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
_ = require 'underscore'
|
||||
algos = require './algos'
|
||||
items = require('habitrpg-shared/script/items').items
|
||||
helpers = require('habitrpg-shared/script/helpers')
|
||||
|
||||
module.exports.setup = (view) ->
|
||||
|
||||
#misc
|
||||
view.fn "percent", (x, y) ->
|
||||
x=1 if x==0
|
||||
Math.round(x/y*100)
|
||||
view.fn 'indexOf', (str1, str2) ->
|
||||
return false unless str1 && str2
|
||||
str1.indexOf(str2) != -1
|
||||
view.fn "round", Math.round
|
||||
view.fn "floor", Math.floor
|
||||
view.fn "ceil", Math.ceil
|
||||
view.fn "lt", (a, b) -> a < b
|
||||
view.fn 'gt', (a, b) -> a > b
|
||||
view.fn "mod", (a, b) -> parseInt(a) % parseInt(b) == 0
|
||||
view.fn "notEqual", (a, b) -> (a != b)
|
||||
view.fn "and", -> _.reduce arguments, (cumm, curr) -> cumm && curr
|
||||
view.fn "or", -> _.reduce arguments, (cumm, curr) -> cumm || curr
|
||||
view.fn "truarr", (num) -> num-1
|
||||
view.fn 'count', (arr) -> arr?.length or 0
|
||||
|
||||
#iCal
|
||||
view.fn "encodeiCalLink", helpers.encodeiCalLink
|
||||
|
||||
#User
|
||||
view.fn "gems", (balance) -> return balance/0.25
|
||||
view.fn "username", helpers.username
|
||||
view.fn "tnl", algos.tnl
|
||||
view.fn 'equipped', helpers.equipped
|
||||
view.fn "gold", helpers.gold
|
||||
view.fn "silver", helpers.silver
|
||||
|
||||
#Stats
|
||||
view.fn 'userStr', helpers.userStr
|
||||
view.fn 'totalStr', helpers.totalStr
|
||||
view.fn 'userDef', helpers.userDef
|
||||
view.fn 'totalDef', helpers.totalDef
|
||||
view.fn 'itemText', helpers.itemText
|
||||
view.fn 'itemStat', helpers.itemStat
|
||||
|
||||
#Pets
|
||||
view.fn 'ownsPet', helpers.ownsPet
|
||||
|
||||
#Tasks
|
||||
view.fn 'taskClasses', helpers.taskClasses
|
||||
|
||||
#Chat
|
||||
view.fn 'friendlyTimestamp',helpers.friendlyTimestamp
|
||||
view.fn 'newChatMessages', helpers.newChatMessages
|
||||
view.fn 'relativeDate', helpers.relativeDate
|
||||
|
||||
#Tags
|
||||
view.fn 'noTags', helpers.noTags
|
||||
view.fn 'appliedTags', helpers.appliedTags
|
||||
Loading…
Reference in a new issue