calculations.js
1 const satsPerBtc = 100000000 // one hundred million per btc 2 import cryptoUtils from './crypto.js' 3 4 function access(active, memberBoost, charged){ 5 if (active <= 0 || charged < 0){ 6 return false 7 } 8 let newBalance = memberBoost - charged 9 return newBalance >= 0 10 } 11 12 function crawlerHash(tasks, taskId){ 13 return cryptoUtils.createHash(Buffer.from(crawler(tasks, taskId))) 14 } 15 16 function crawler(tasks, taskId){ 17 let history = [] 18 tasks.forEach(task => { 19 if(task.taskId === taskId) { 20 let crawler = [taskId] 21 do { 22 let newCards = [] 23 crawler.forEach(t => { 24 if(history.indexOf(t) >= 0) return 25 history.push(t) 26 let subTask = tasks.filter(pst => pst.taskId === t)[0] 27 if (subTask){ 28 newCards = newCards.concat(subTask.subTasks).concat(subTask.priorities).concat(subTask.completed) 29 } 30 }) 31 crawler = newCards 32 } while(crawler.length > 0) 33 } 34 }) 35 return history 36 } 37 38 function shortName(name) { 39 let limit = 280 40 let shortened = name.substring(0, limit).toLowerCase() 41 if(name.length > limit) { 42 shortened += '…' 43 } 44 return shortened 45 } 46 47 function cardColorCSS(color) { 48 return { 49 redwx : color == 'red', 50 bluewx : color == 'blue', 51 greenwx : color == 'green', 52 yellowwx : color == 'yellow', 53 purplewx : color == 'purple', 54 blackwx : color == 'black', 55 } 56 } 57 58 function blankMember(memberId, name, fob, secret, lastUsed){ 59 return { 60 memberId, 61 name, 62 fob, 63 secret, 64 lastUsed, 65 active: 0, 66 muted: true, 67 tooltips: false, 68 stacks: 1, 69 payments: 0, 70 boats: false, 71 action: false, 72 guides:true, 73 } 74 } 75 76 function blankCard(taskId, name, color, createdTs, deck = [], priorities = []) { 77 let newCard = { 78 lastUsed: createdTs, 79 createdTs, 80 taskId, 81 color, 82 deck, 83 priorities, 84 name: name.trim(), 85 btcAddr: false, 86 bolt11: false, 87 book: {}, 88 boost: 0, 89 subTasks: [], 90 completed: [], 91 claimed: [], 92 actions: [], 93 guild: false, 94 lastClaimed: 0, 95 completeValue: 0, 96 payment_hash: '', 97 highlights: [], 98 claims: [], 99 stackView: { 100 all: 0, 101 red: 0, 102 blue: 0, 103 yellow: 0, 104 green: 0, 105 purple: 0, 106 completed: false, 107 }, 108 payments: [], 109 } 110 return newCard 111 } 112 113 function safeMerge(cardA, cardZ) { 114 cardA.subTasks = [...new Set(cardA.subTasks.concat(cardZ.subTasks))] 115 cardA.priorities = [...new Set(cardA.priorities.concat(cardZ.priorities))] 116 cardA.completed = [...new Set(cardA.completed.concat(cardZ.completed))] 117 cardA.guild = cardZ.guild 118 // XXX only add in merge for now 119 // XXX bolt11 / address need to clearly indicate origin ao 120 // XXX book should be a list? 121 } 122 123 function cadToSats(cadAmt, spot){ 124 let sats = parseFloat( cadAmt ) / parseFloat( spot ) * satsPerBtc 125 return parseInt(sats) 126 } 127 128 function satsToCad(sats, spot){ 129 let cad = sats * (spot / satsPerBtc) 130 return cad.toFixed(2) 131 } 132 133 function calculateMsThisMonth(){ 134 let today = new Date() 135 let daysThisMonth = new Date(today.getYear(), today.getMonth(), 0).getDate() 136 return daysThisMonth * 24 * 60 * 60 * 1000 137 } 138 139 function getMeridienTime(ts){ 140 141 let d = new Date( parseInt(ts) ) 142 let hour24 = d.getHours() 143 144 let rollover = 0 145 if (hour24 >= 24){ 146 rollover = 1 147 hour24 %= 24 148 } 149 150 let hour, meridien 151 if (hour24 > 12){ 152 meridien = 'pm' 153 hour = hour24 - 12 154 } else { 155 meridien = 'am' 156 hour = hour24 157 } 158 159 let date = d.getDate() + rollover 160 let month = d.getMonth() + 1 161 let minute = d.getMinutes() 162 let year = d.getFullYear() 163 164 let weekday = d.toString().slice(0,3) 165 166 return { weekday, year, month, date, hour, minute, meridien } 167 } 168 169 export default { 170 cadToSats, 171 satsToCad, 172 getMeridienTime, 173 shortName, 174 cardColorCSS, 175 blankCard, 176 blankMember, 177 // safeClone, 178 safeMerge, 179 crawler, 180 crawlerHash, 181 access, 182 calculateMsThisMonth, 183 }