/ src / server / reactions.js
reactions.js
  1  import chalk from 'chalk'
  2  import cryptoUtils from '../crypto.js'
  3  //import { getResource } from './utils.js'
  4  import events from './events.js'
  5  import state from './state.js'
  6  import lightning from './lightning.js'
  7  
  8  const { serverState } = state
  9  //const ChromecastAPI = require('chromecast-api')
 10  //const cast = new ChromecastAPI()
 11  
 12  // I disabled Chromecast because I don't think I'll use it.
 13  
 14  let castDeviceIds = []
 15  let castDeviceMap = {}
 16  
 17  //cast.on('device', d => {
 18  //    let taskId = cryptoUtils.createCardHash(d.friendlyName)
 19  //    castDeviceIds.push(taskId)
 20  //    castDeviceMap[taskId] = d.friendlyName
 21  //    console.log(chalk.bold.red(d.friendlyName), 'castable')
 22  //})
 23  
 24  function checkForChargedEvent( resourceId ){
 25      let charged
 26      serverState.bookings.forEach( b => {
 27          if (resourceId === b.resourceId) {
 28              let dnow = new Date()
 29              let now = dnow.getTime()
 30              let tsUntilStart = parseInt(b.startTs) - now
 31              let tsUntilEnd = parseInt(b.endTs) - now
 32              let current = (tsUntilStart < 0 && tsUntilEnd > 0)
 33              if (current && b.charge > 0){
 34                  charged = b.charge
 35              }
 36          }
 37      })
 38      return charged
 39  }
 40  
 41  let channelSatTotalTracker = 0
 42  let outputSatTotalTracker = 0
 43  let mostRecentAccount = null
 44  let i = 0
 45  
 46  function reactions(ev){
 47      process.nextTick( err => {
 48          switch (ev.type) {
 49              case 'task-boosted':
 50              case 'task-boosted-lightning':
 51                  let optionList = []
 52                  let defaultPrice
 53                  let resourceId
 54                  let resourceList = serverState.resources.map(r => r.resourceId)
 55                  let amount = parseFloat(ev.amount)
 56  
 57                  serverState.tasks.some(t => {
 58                      if (resourceList.indexOf(t.taskId) > -1 && t.priorities.indexOf(ev.taskId) > -1){
 59                          resourceId = t.taskId
 60                          return true
 61                      }
 62                  })
 63                  if (resourceId){
 64                      console.log("got resourceId, attempting trigger", resourceId)
 65                      serverState.resources.some(r => {
 66                        if (r.resourceId === resourceId){
 67                          defaultPrice = r.charge
 68                          return true
 69                        }
 70                      })
 71                      serverState.tasks.some(t => {
 72                        if (ev.taskId === t.taskId){
 73                          let str = t.name
 74                          let cashTagLocation = str.search(/\$/)
 75                          let customPrice = parseFloat( str.slice(cashTagLocation + 1, cashTagLocation + 5) )
 76                          if (customPrice > 0){
 77                            console.log("using custom price, ", customPrice)
 78                            defaultPrice = customPrice
 79                          }
 80                          let hopper = t.name.split(':')[0]
 81                          events.resourceUsed(resourceId, 'lightning', defaultPrice, hopper, console.log)
 82                          return true
 83                        }
 84                      })
 85                  }
 86                  break
 87              case 'task-claimed':
 88              //    let fName = castDeviceMap[ev.inId]
 89              //    let d = cast.devices.filter(d => d.friendlyName === fName)[0]
 90              //    if (fName && d){
 91              //          let mediaUrl = serverState.tasks[serverState.hashMap[ev.taskId]].name
 92              //          try {
 93              //              d.play(mediaUrl)
 94              //          } catch(err) {
 95              //              cast.update()
 96              //          }
 97              //    }else {
 98              //        cast.update()
 99              //    }
100                  break
101              case 'member-field-updated':
102                  break
103              case 'member-paid':
104                  break
105              case 'resource-stocked':
106                  events.memberActivated(ev.memberId)
107                  break
108              case 'member-created':
109                  break
110              case 'resource-created':
111                  break
112              case 'task-created':
113                  break
114              case 'resource-created':
115                  break
116              case 'get-node-info':
117                  if (ev.info.lightningblocks === 0) return 
118                  let channelReducer = (accumulator,current) => accumulator + current.channel_sat
119                  let outputReducer = (accumulator,current) => {
120                      if (current.status !== "confirmed"){
121                          return accumulator
122                      }
123                      return accumulator + current.value
124                  }
125                  let totalInChannels = ev.info.channels.reduce(channelReducer, 0)
126                  let totalInOutputs = ev.info.outputs.reduce(outputReducer, 0)
127                  let changeLightning = totalInChannels - channelSatTotalTracker
128                  let changeChain = totalInOutputs - outputSatTotalTracker
129                  if (i === 0){
130                      console.log('wallet balance:', chalk.bold.yellow('(sats)'))
131                  }
132                  i ++
133                  if (changeLightning === totalInChannels  && i === 1){
134                      console.log('', chalk.bold.yellow(totalInChannels.toLocaleString()), "in channels")
135                  } else if (changeLightning > 0){
136                      console.log('', chalk.bold.yellow(totalInChannels.toLocaleString()), "in channels", chalk.bold.green('+', changeLightning ))
137                  } else if (changeLightning < 0){
138                      console.log('', chalk.bold.yellow(totalInChannels.toLocaleString()), "in channels", chalk.bold.red('-', - changeLightning ))
139                  }
140                  if (changeChain === totalInOutputs  && i === 1){
141                      console.log('', chalk.bold.yellow(totalInOutputs.toLocaleString()), "on chain")
142                  } else if (changeChain > 0){
143                      console.log('', chalk.bold.yellow(totalInOutputs.toLocaleString()), "on chain", chalk.bold.green('+', changeChain))
144                  } else if (changeChain < 0){
145                      console.log('', chalk.bold.yellow(totalInOutputs.toLocaleString()), "on chain", chalk.bold.red('-', - changeChain))
146                  }
147                  outputSatTotalTracker = totalInOutputs
148                  channelSatTotalTracker = totalInChannels
149                  break
150              default:
151                  let name = '~'
152                  serverState.members.some(m => {
153                      if (ev.blame === m.memberId  || ev.memberId === m.memberId){
154                          name = m.name
155                          return true
156                      }
157                  })
158                  if (mostRecentAccount !== name){
159                      mostRecentAccount = name
160                  }
161                  break
162          }
163      })
164  }
165  
166  export default reactions