/ src / actions.js
actions.js
  1  import calculations from './calculations.js'
  2  
  3  let inAddressConnect, outAddressConnect, color, colors
  4  
  5  function aoActions(aos, ev) {
  6    switch (ev.type) {
  7      case "ao-inbound-connected":
  8        inAddressConnect = aos.some(a => {
  9          if (a.address === ev.address) {
 10            a.alias = ev.alias
 11            a.inboundSecret = ev.secret
 12            a.lastContact = Date.now()
 13            return true
 14          }
 15        })
 16        if (!inAddressConnect) {
 17          let newEv = {
 18            alias: ev.alias,
 19            address: ev.address,
 20            outboundSecret: false,
 21            inboundSecret: ev.secret,
 22            lastContact: Date.now(),
 23          }
 24          aos.push(newEv)
 25        }
 26        break
 27      case "ao-outbound-connected":
 28        outAddressConnect = aos.some(a => {
 29          if (a.address === ev.address) {
 30            a.outboundSecret = ev.secret
 31            a.lastContact = Date.now()
 32            return true
 33          }
 34        })
 35        if (!outAddressConnect) {
 36          let newEv = {
 37            address: ev.address,
 38            outboundSecret: ev.secret,
 39            inboundSecret: false,
 40            lastContact: Date.now(),
 41            alias: 'ao',
 42          }
 43          aos.push(newEv)
 44        }
 45        break
 46      case "ao-disconnected":
 47        aos.some((ao, i) => {
 48          if (ao.address === ev.address) {
 49            aos.splice(i, 1)
 50            return true
 51          }
 52        })
 53        break
 54    }
 55  }
 56  
 57  function cashActions(cash, ev) {
 58    switch (ev.type) {
 59      case "spot-updated":
 60        cash.spot = ev.spot
 61        break
 62      case "currency-switched":
 63        cash.currency = ev.currency
 64        break
 65      case "rent-set":
 66        cash.rent = parseFloat(ev.amount)
 67        break
 68      case "cap-set":
 69        cash.cap = ev.amount
 70        break
 71      case "task-boosted": // keep on card?
 72        cash.usedTxIds.push(ev.txid)
 73        break
 74      case "task-boosted-lightning":
 75        cash.pay_index = ev.pay_index
 76        break
 77      case "get-node-info":
 78        cash.info = ev.info
 79        break
 80      case "task-guilded":
 81        cash.pins = cash.pins.filter(p => p !== ev.taskId)
 82        if (ev.guild && ev.guild.split(':')[0]){
 83            cash.pins.push(ev.taskId)
 84        }
 85        break
 86      case "task-removed": 
 87        cash.pins = cash.pins.filter(p => p !== ev.taskId)
 88        break 
 89      case "tasks-received":
 90        ev.tasks.forEach(t => {
 91          cash.pins = cash.pins.filter(p => p !== ev.taskId)
 92        })
 93        ev.tasks.forEach(t => {
 94          if (t.guild && t.guild.split(':')[0]){
 95            cash.pins.push(t.taskId)
 96          }
 97        })
 98        break
 99    }
100  }
101  
102  function membersActions(members, ev) {
103    switch (ev.type) {
104      case "task-claimed":
105          members.forEach(member => {
106              if (member.memberId === ev.memberId  && member.action === ev.taskId) {
107                  member.action = false
108              }
109          })
110          break
111      case "ao-outbound-connected":
112        break
113      case "ao-disconnected":
114        break
115      case "member-created":
116        members.push(calculations.blankMember(ev.memberId, ev.name, ev.fob, ev.secret, ev.timestamp))
117        break
118      case "member-activated":
119        members.forEach(member => {
120          if (member.memberId === ev.memberId) {
121            if (member.active < 0) {
122              member.active = -1 * member.active
123            } else {
124              member.active++
125            }
126          }
127        })
128        break
129      case "task-boosted":
130        members.forEach(member => {
131          if (member.memberId === ev.taskId) {
132            if (member.active < 0) {
133              member.active = -1 * member.active
134            } else {
135              member.active++
136            }
137          }
138        })
139        break
140      case "task-boosted-lightning":
141        members.forEach(member => {
142          if (member.memberId === ev.taskId) {
143            if (member.active < 0) {
144              member.active = -1 * member.active
145            } else {
146              member.active++
147            }
148          }
149        })
150        break
151      case "member-deactivated":
152        members.forEach(member => {
153          if (member.memberId === ev.memberId) {
154            if (member.active > 0) {
155              member.active = -1 * member.active - 1
156            }
157          }
158        })
159        break
160      case "member-purged":
161        members.forEach((member, i) => {
162          if (member.memberId === ev.memberId) {
163            members.splice(i, 1)
164          }
165        })
166        break
167      case "member-field-updated":
168        members.forEach(member => {
169          if (member.memberId === ev.memberId) {
170            member[ev.field] = ev.newfield
171          }
172        })
173        break
174    }
175    members.forEach(member => {
176        if (member.memberId === ev.memberId  || ev.blame === member.memberId) {
177            member.lastUsed = ev.timestamp
178        }
179    })
180  }
181  let resourceIds
182  function resourcesActions(resources, ev) {
183    switch (ev.type) {
184      case "resource-created":
185        resourceIds = resources.map(r => r.resourceId)
186        if (resourceIds.indexOf(ev.resourceId) === -1) {
187          resources.push(ev)
188        } else {
189          console.log("BAD data duplicate resource rejected in mutation, dup resource task likely created")
190        }
191        break
192      case "resource-used":
193        resources.forEach(resource => {
194          if (resource.resourceId == ev.resourceId) {
195            resource.stock -= parseInt(ev.amount)
196          }
197        })
198        break
199      case "resource-purged":
200        resources.forEach((r, i) => {
201          if (r.resourceId === ev.resourceId) {
202            resources.splice(i, 1)
203          }
204        })
205        break
206      case "resource-stocked":
207        resources.forEach(resource => {
208          if (resource.resourceId == ev.resourceId) {
209            resource.stock += parseInt(ev.amount)
210          }
211        })
212        break
213    }
214  }
215  
216  let idHasSession
217  function sessionsActions(sessions, ev) {
218    switch (ev.type) {
219      case "session-created":
220        idHasSession = sessions.some(session => {
221          // replace that sessions creds,
222          let match = false
223          if (session.ownerId === ev.ownerId) {
224            match = true
225            Object.assign(session, ev)
226          }
227          return match // true terminates the some loop & idHasSession->true too
228        })
229  
230        if (idHasSession) {
231          // edited in session
232        } else {
233          // id didn't previously have session
234          sessions.push(ev)
235        }
236        break
237      case "session-killed":
238        sessions.forEach((s, i) => {
239          if (s.session == ev.session) {
240            sessions.splice(i, 1)
241          }
242        })
243        break
244      case "ao-outbound-connected":
245        sessions.push({
246          ownerId: ev.address,
247          token: ev.secret,
248          session: ev.address,
249        })
250        break
251      case "member-purged": 
252        sessions.forEach((s, i) => {
253          if (s.ownerId == ev.memberId) {
254            sessions.splice(i, 1)
255          }
256        })
257        break 
258      case "ao-disconnected": 
259        sessions.forEach((s, i) => {
260          if (s.ownerId == ev.address) {
261            sessions.splice(i, 1)
262          }
263        })
264        break 
265    }
266  }
267  
268  function hashMapActions(hashMap, ev){
269      let i
270      switch(ev.type){
271          case "ao-outbound-connected":
272              if (!hashMap[ev.address]) {
273                  hashMap[ev.address] = ev.i
274              }
275              break
276          case "ao-inbound-connected":
277              if (!hashMap[ev.address]) {
278                  hashMap[ev.address] = ev.i
279              }
280              break
281          case "task-created":
282              hashMap[ev.taskId] = ev.i
283              break
284          case "member-created":
285              hashMap[ev.memberId] = ev.i
286              break
287          case "resource-created":
288              hashMap[ev.resourceId] = ev.i
289              break
290          case "tasks-received":{
291              i = 0
292              ev.tasks.forEach(t => {
293                  if (!(hashMap[t.taskId] >= 0)){
294                      hashMap[t.taskId] = ev.i + i
295                      i ++
296                  }
297              })
298              }break
299          case "task-removed":
300              delete hashMap[ev.taskId]
301              Object.keys(hashMap).forEach(tId => {
302                  if (hashMap[tId] > ev.i){
303                      hashMap[tId] --
304                  }
305              })
306              break
307          case "ao-disconnected":
308              i = hashMap[ev.address]
309              delete hashMap[ev.address]
310              Object.keys(hashMap).forEach(tId => {
311                  if (hashMap[tId] > i){
312                      hashMap[tId] --
313                  }
314              })
315              break
316          case "member-purged":
317              i = hashMap[ev.memberId]
318              delete hashMap[ev.memberId]
319              Object.keys(hashMap).forEach(tId => {
320                  if (hashMap[tId] > i){
321                      hashMap[tId] --
322                  }
323              })
324              break
325          case "resource-purged":
326              i =  hashMap[ev.resourceId]
327              delete hashMap[ev.resourceId]
328              Object.keys(hashMap).forEach(tId => {
329                  if (hashMap[tId] > i){
330                      hashMap[tId] --
331                  }
332              })
333              break
334      }
335  }
336  
337  let explodingTask, absorbingTask, pirate, task, isExist, isExisting
338  function tasksActions(tasks, ev) {
339    switch (ev.type) {
340      case "task-colored":
341          tasks.forEach(task => {
342              if (task.taskId === ev.taskId) {
343                  task.color = ev.color
344              }
345              if (task.taskId === ev.inId){
346                  if (task.stackView[ev.color] !== -1){
347                      task.stackView[ev.color] = task.subTasks.length
348                  }
349                  task.subTasks = task.subTasks.filter(tId => tId !== ev.taskId)
350                  task.priorities = task.priorities.filter(tId => tId !== ev.taskId)
351                  task.subTasks.push(ev.taskId)
352                  tasks.forEach( taskLoop2 => { // dirty O(n^2)  ??
353                      if ( task.priorities.indexOf(taskLoop2.taskId) >= 0){
354                          taskLoop2.priorities = taskLoop2.priorities.filter(tId => tId !== ev.taskId)
355                      }
356                  })
357              }
358          })
359          break
360      case "ao-outbound-connected":
361          isExist = tasks.some(x => {
362              if (x.taskId === ev.address){
363                  return true
364              }
365          })
366          if (!isExist){
367              tasks.push(calculations.blankCard(ev.address, ev.address, 'blue', ev.timestamp))
368          }
369          break
370      case "ao-inbound-connected":
371          isExisting = tasks.some(x => {
372              if (x.taskId === ev.address){
373                  return true
374              }
375          })
376          if (!isExisting){
377              tasks.push(calculations.blankCard(ev.address, ev.address, 'red', ev.timestamp))
378          }
379          break
380      case "member-field-updated":
381        if (ev.field === 'action') {
382          tasks.forEach(task => {
383            if (task.taskId === ev.newfield) {
384              let editInline = task.actions.some(a => {
385                if (a.memberId === ev.memberId) {
386                  a.isActive = true
387                  a.timestamp = ev.timestamp
388                  return true
389                }
390              })
391              if (!editInline) {
392                task.actions.push({
393                  memberId: ev.memberId,
394                  timestamp: ev.timestamp,
395                  isActive: true,
396                  total: 0
397                })
398              }
399            } else {
400              task.actions.forEach(a => {
401                if (a.memberId === ev.memberId && a.isActive) {
402                  a.isActive = false
403                  a.total += (ev.timestamp - a.timestamp)
404                }
405              })
406            }
407          })
408        }
409        break
410      case "task-seized":
411  
412        tasks.forEach(task => {
413          if (task.taskId === ev.inId) {
414            pirate = task.priorities[task.priorities.indexOf(ev.taskId) + 1]
415            task.priorities = task.priorities.filter(taskId => taskId !== ev.taskId)
416          }
417        })
418        if (!pirate) pirate = ev.inId
419        tasks.forEach(task => {
420          if (task.taskId === pirate) {
421            task.priorities = task.priorities.filter(taskId => taskId !== ev.taskId)
422            task.priorities.push(ev.taskId)
423          }
424        })
425        break
426      case "task-touched":
427        tasks.forEach(task => {
428          if (task.taskId === ev.taskId) {
429            task.stackView[ev.stack] = ev.position
430          }
431        })
432        break
433      case "task-valued":
434        tasks.forEach(task => {
435          if (task.taskId === ev.taskId) {
436            task.completeValue = Number(ev.value)
437          }
438        })
439        break
440      case "task-popped":
441        tasks.forEach(task => {
442          if (task.taskId === ev.taskId) {
443            explodingTask = task
444          }
445          if (task.taskId === ev.inId) {
446            absorbingTask = task
447          }
448        })
449  
450        colors = []
451        tasks.forEach(task => { // im sorry
452            if (explodingTask.subTasks.indexOf(task.taskId) > -1){
453                colors.push(task.color)
454            }
455        })
456        if (explodingTask, absorbingTask) {
457          absorbingTask.priorities = absorbingTask.priorities.filter(taskId => taskId !== ev.taskId)
458          absorbingTask.subTasks = absorbingTask.subTasks.filter(taskId => taskId !== ev.taskId)
459          absorbingTask.completed = absorbingTask.completed.filter(taskId => taskId !== ev.taskId)
460          absorbingTask.subTasks = [...new Set(absorbingTask.subTasks.concat(explodingTask.subTasks))]
461          absorbingTask.priorities = [...new Set(absorbingTask.priorities.concat(explodingTask.priorities))]
462          colors.forEach(c => {
463              absorbingTask.stackView[c] = absorbingTask.subTasks.length - 1
464          })
465        }
466        break
467      case "pile-prioritized":
468        tasks.forEach(task => {
469          if (task.taskId === ev.inId) {
470            ev.tasks.forEach(tId => {
471                task.priorities.push(tId)
472            })
473            task.priorities = [...new Set(task.priorities)]
474          }
475        })
476        break
477      case "pile-refocused":
478        tasks.forEach(task => {
479          if (task.taskId === ev.inId) {
480            task.priorities.forEach(stId => {
481              tasks.forEach(st => {
482                if (st.taskId === stId) {
483                  task.subTasks.push(stId)
484                }
485              })
486              task.priorities = []
487            })
488          }
489        })
490        break
491      case "pile-de-sub-tasked":
492        tasks.forEach(task => {
493          if (task.taskId === ev.inId) {
494              task.subTasks = task.subTasks.filter(tId => ev.tasks.indexOf(tId) === -1)
495              task.priorities = task.priorities.filter(tId => ev.tasks.indexOf(tId) === -1)
496          }
497        })
498        break
499      case "pile-sub-tasked":
500        colors = []
501        tasks.forEach(task => {
502            if (ev.tasks.indexOf(task.taskId) >= 0){
503                colors.push(task.color)
504            }
505        })
506        tasks.forEach(task => {
507          if (task.taskId === ev.inId) {
508            task.subTasks = task.subTasks.filter(tId => ev.tasks.indexOf(tId) === -1)
509            task.priorities = task.priorities.filter(tId => ev.tasks.indexOf(tId) === -1)
510            task.subTasks = task.subTasks.concat(ev.tasks)
511            colors.forEach( c => {
512                task.stackView[c] = task.subTasks.length - 1
513            })
514          }
515        })
516        break
517      case "completed-toggled":
518          tasks.forEach(task => {
519              if (task.taskId === ev.taskId) {
520                  if (task.stackView.completed){
521                      task.highlights = []
522                  }
523                  task.stackView.completed = !task.stackView.completed
524              }
525          })
526          break
527      case "highlighted":
528        tasks.forEach(task => {
529          if (task.taskId === ev.taskId) {
530              let didUpdateInline = false
531              task.highlights.forEach((h, i) => {
532                if (h.memberId === ev.memberId) {
533                  didUpdateInline = true
534                  if (h.valence === ev.valence) {
535                    task.highlights.splice(i, 1)
536                  } else {
537                    h.valence = ev.valence
538                  }
539                }
540              })
541              if (!didUpdateInline) {
542                task.highlights.push({
543                  memberId: ev.memberId,
544                  valence: ev.valence
545                })
546              }
547              if (task.highlights.length > 0){
548                  task.stackView.completed = true
549              } 
550          }
551        })
552        break
553      case "resource-created":
554        tasks.push(calculations.blankCard(ev.resourceId, ev.resourceId, 'red', ev.timestamp, [ev.memberId], [ev.resourceId]))
555        break
556      case "member-created":
557        tasks.push(calculations.blankCard(ev.memberId, ev.memberId, 'purple', ev.timestamp))
558        break
559      case "task-created":
560        tasks.push(calculations.blankCard(ev.taskId, ev.name, ev.color, ev.timestamp, ev.deck))
561        tasks.forEach(task => {
562          if (task.taskId === ev.inId) {
563            task.subTasks = task.subTasks.filter(tId => tId !== ev.taskId)
564            task.subTasks.push(ev.taskId)
565            if (task.deck.indexOf(ev.memberId) === -1){
566                task.deck.push(ev.memberId)
567            }
568            task.stackView.completed = false
569            if (task.stackView[ev.color] > -1){
570                task.stackView[ev.color] = task.subTasks.length - 1
571            }
572          }
573        })
574        break
575      case "address-updated":
576        tasks.forEach(t => {
577          if (t.taskId === ev.taskId) {
578            t.btcAddr = ev.btcAddr
579          }
580        })
581        break
582      case "task-grabbed":
583        tasks.forEach(task => {
584          if (task.taskId === ev.taskId) {
585            if (task.deck.indexOf(ev.memberId) === -1) {
586              if (ev.taskId !== ev.memberId && ev.memberId) {
587                task.deck.push(ev.memberId)
588              }
589            }
590          }
591        })
592        break
593      case "pile-grabbed":
594        if (!ev.memberId) { // what?
595            break
596        }
597        tasks.forEach(task => {
598          if (task.taskId === ev.taskId) {
599            let crawler = [ev.taskId]
600            let history = []
601            let newCards = []
602            do {
603              newCards = []
604              crawler = crawler.forEach(t => {
605                if (history.indexOf(t) >= 0) return
606                let subTask = tasks.filter(pst => pst.taskId === t)
607                if (subTask.length < 1) {
608                  console.log("missing subtask, this is messy", t)
609                  return
610                }
611                if (subTask.length > 1) {
612                  console.log("duplicate task found, this is very bad")
613                }
614                subTask = subTask[0]
615                if (subTask === undefined || subTask.subTasks === undefined || subTask.priorities === undefined || subTask.completed === undefined) {
616                  console.log("invalid task data found, this is very bad")
617                  return
618                }
619  
620                history.push(t)
621  
622                if (subTask.deck.indexOf(ev.memberId) === -1 && ev.taskId !== ev.memberId) {
623                  subTask.deck.push(ev.memberId)
624                }
625                newCards = newCards.concat(subTask.subTasks).concat(subTask.priorities).concat(subTask.completed)
626              })
627              crawler = newCards
628            } while (crawler.length > 0)
629          }
630        })
631        break
632      case "task-dropped":
633        tasks.forEach(task => {
634          if (task.taskId === ev.taskId) {
635            task.deck = task.deck.filter(d => d !== ev.memberId)
636          }
637        })
638        break
639      case "pile-dropped":
640        if (!ev.memberId) {
641          break
642        }
643        tasks.forEach(task => {
644          if (task.taskId === ev.taskId) {
645            let crawler = [ev.taskId]
646            let history = []
647            let newCards = []
648            do {
649              newCards = []
650              crawler = crawler.forEach(t => {
651                if (history.indexOf(t) >= 0) return
652                let subTask = tasks.filter(pst => pst.taskId === t)
653                if (subTask.length < 1) {
654                  console.log('missing subtask, this is messy', t)
655                  return
656                }
657                if (subTask.length > 1) {
658                  console.log('duplicate task found, this is very bad')
659                }
660                subTask = subTask[0]
661                if (subTask === undefined || subTask.subTasks === undefined || subTask.priorities === undefined || subTask.completed === undefined) {
662                  console.log('invalid task data found, this is very bad')
663                  return
664                }
665  
666                history.push(t)
667  
668                if (subTask.deck.indexOf(ev.memberId) >= 0 && ev.taskId !== ev.memberId) {
669                  subTask.deck = subTask.deck.filter(d => d !== ev.memberId)
670                }
671                newCards = newCards.concat(subTask.subTasks).concat(subTask.priorities).concat(subTask.completed)
672              })
673              crawler = newCards
674            } while (crawler.length > 0)
675          }
676        })
677        break
678      case "ao-disconnected":
679        tasks.forEach((task, i) => {
680          if (task.taskId === ev.address) {
681            tasks.splice(i, 1)
682          }
683        })
684        tasks.forEach(t => {
685            t.subTasks = t.subTasks.filter(st => st !== ev.address)
686            t.priorities = t.priorities.filter(st => st !== ev.address)
687            t.completed = t.completed.filter(st => st !== ev.address)
688            t.claimed = t.claimed.filter(st => st !== ev.address)
689            t.claims = t.claims.filter(cl => cl.memberId !== ev.address)
690            t.deck = t.deck.filter(st => st !== ev.address)
691            if (t.book & (t.book.resourceId === ev.address || t.book.memberId === ev.address)) t.book = {}
692        })
693        break
694      case "member-purged":
695        tasks.forEach((task, i) => {
696          if (task.taskId === ev.memberId) {
697            tasks.splice(i, 1)
698          }
699        })
700        tasks.forEach(t => {
701            t.subTasks = t.subTasks.filter(st => st !== ev.memberId)
702            t.priorities = t.priorities.filter(st => st !== ev.memberId)
703            t.completed = t.completed.filter(st => st !== ev.memberId)
704            t.claimed = t.claimed.filter(st => st !== ev.memberId )
705            t.claims = t.claims.filter(cl => cl.memberId !== ev.memberId)
706            t.deck = t.deck.filter(st => st !== ev.memberId)
707            if (t.book & (t.book.resourceId === ev.memberId || t.book.memberId === ev.memberId)) t.book = {}
708        })
709        break
710      case "task-removed":
711        tasks.forEach((task, i) => {
712          if (task.taskId === ev.taskId) {
713            tasks.splice(i, 1)
714          }
715        })
716        tasks.forEach(t => {
717          t.subTasks = t.subTasks.filter(st => st !== ev.taskId)
718          t.priorities = t.priorities.filter(st => st !== ev.taskId)
719          t.completed = t.completed.filter(st => st !== ev.taskId)
720          t.claims = t.claims.filter(cl => cl.taskId !== ev.taskId)
721        })
722        break
723      case "task-prioritized":
724        tasks.forEach(task => {
725          if (task.taskId === ev.fromId){
726              task.subTasks = task.subTasks.filter(taskId => taskId !== ev.taskId)
727              task.priorities = task.priorities.filter(taskId => taskId !== ev.taskId)
728              tasks.forEach( taskLoop2 => {
729                  if ( task.priorities.indexOf(taskLoop2.taskId) >= 0){
730                      taskLoop2.priorities = taskLoop2.priorities.filter(tId => tId !== ev.taskId)
731                  }
732              })
733          }
734          if (task.taskId === ev.inId) {
735            task.priorities = task.priorities.filter(taskId => taskId !== ev.taskId)
736            task.subTasks = task.subTasks.filter(taskId => taskId !== ev.taskId)
737            task.priorities.push(ev.taskId)
738          }
739          if (task.taskId === ev.taskId && task.deck.indexOf(ev.blame) === -1){
740              task.deck.push(ev.blame)
741          }
742        })
743        break
744      case "task-completed":
745        tasks.forEach(task => {
746          if (task.taskId === ev.inId) {
747            task.priorities = task.priorities.filter(taskId => taskId !== ev.taskId)
748            task.subTasks = task.subTasks.filter(taskId => taskId !== ev.taskId)
749            task.completed = task.completed.filter(taskId => taskId !== ev.taskId)
750            task.completed.push(ev.taskId)
751          }
752        })
753        break
754      case "task-sub-tasked":
755        color = false
756        tasks.forEach(task => { // sorry need hashmap
757          if (task.taskId === ev.taskId){
758              color = task.color
759          }
760        })
761        tasks.forEach(task => {
762          if (task.taskId === ev.taskId && task.deck.indexOf(ev.blame) === -1){
763                task.deck.push(ev.blame)
764          }
765          if (task.taskId === ev.inId) {
766            task.priorities = task.priorities.filter(taskId => taskId !== ev.taskId)
767            task.subTasks = task.subTasks.filter(tId => tId !== ev.taskId)
768            task.subTasks.push(ev.taskId)
769            if (color){
770                task.stackView[color] = task.subTasks.length - 1
771            }
772          }
773        })
774        break
775      case "task-de-sub-tasked":
776        tasks.forEach(task => {
777          if (task.taskId === ev.inId) {
778              task.priorities = task.priorities.filter(tId => tId !== ev.taskId)
779              task.subTasks = task.subTasks.filter(tId => tId !== ev.taskId)
780          }
781        })
782        break
783      case "task-guilded":
784        tasks.forEach(task => {
785          if (task.taskId === ev.taskId) {
786            task.guild = ev.guild
787          }
788        })
789        break
790      case "task-claimed":
791        tasks.forEach(task => {
792          if (task.taskId === ev.taskId) {
793            if (task.deck.indexOf(ev.memberId) === -1) {
794              if (ev.taskId !== ev.memberId && ev.memberId) {
795                task.deck.push(ev.memberId)
796              }
797            }
798            if (task.claimed.indexOf(ev.memberId) === -1) {
799              task.claimed.push(ev.memberId)
800            }
801            task.claims.push(ev)
802            task.lastClaimed = ev.timestamp
803          }
804  
805          if (ev.inId !== ev.taskId && task.taskId === ev.inId) {
806              if (task.completed.indexOf(ev.taskId) === -1){
807                  task.completed.push(ev.taskId)
808                  if (task.deck.indexOf(ev.memberId) === -1) {
809                      task.deck.push(ev.memberId)
810                  }
811              }
812          }
813  
814        })
815        break
816      case "task-unclaimed":
817        tasks.forEach(task => {
818          if (task.taskId === ev.taskId) {
819              task.claimed = task.claimed.filter(mId => mId !== ev.memberId)
820          }
821          if (task.taskId === ev.inId){
822              task.completed = task.completed.filter(taskId => taskId !== ev.taskId)
823          }
824        })
825        break
826      case "task-boosted":
827        tasks.forEach(task => {
828          if (task.taskId === ev.taskId) {
829            let amount = Number(ev.amount)
830            let boost = Number(task.boost)
831            if (amount + boost > 0) {
832              task.boost = amount + boost
833            }
834            task.payments.push(ev)
835          }
836        })
837        break
838      case "task-boosted-lightning":
839        tasks.forEach(task => {
840          if (task.payment_hash === ev.payment_hash  && ev.taskId === task.taskId) {
841            let amount = parseFloat(ev.amount)
842            let boost = parseFloat(task.boost)
843            if (amount > 0) {
844              task.boost = amount + boost
845              task.bolt11 = ""
846              task.payment_hash = ""
847            }
848            task.payments.push(ev)
849          }
850        })
851        break
852      case "resource-booked":
853        tasks.forEach(task => {
854          if (task.taskId === ev.resourceId) {
855            task.book = ev
856          }
857        })
858        break
859      case "resource-used":
860        tasks.forEach(task => {
861          let charged = parseFloat(ev.charged)
862          if (task.taskId === ev.memberId) {
863            if (charged > 0) {
864              task.boost -= charged
865            }
866            task.claims.push(ev) //
867          }
868          if (task.taskId === ev.resourceId) {
869              task.claims.push(ev) //
870          }
871        })
872        break
873      case "invoice-created":
874        tasks.forEach(task => {
875          if (task.taskId === ev.taskId) {
876            task.payment_hash = ev.payment_hash
877            task.bolt11 = ev.bolt11
878          }
879        })
880        break
881      case "task-swapped":
882        tasks.forEach((t) => {
883          if (t.taskId === ev.taskId) {
884            task = t
885          }
886        })
887  
888        if (task) {
889          let originalIndex = task.subTasks.indexOf(ev.swapId1)
890          let swapIndex = task.subTasks.indexOf(ev.swapId2)
891          let originalIndexCompleted = task.completed.indexOf(ev.swapId1)
892          let swapIndexCompleted = task.completed.indexOf(ev.swapId2)
893  
894          if (originalIndex > -1 && swapIndex > -1 && originalIndex > swapIndex) {
895            let newST = task.subTasks.slice()
896            newST[originalIndex] = ev.swapId2
897            newST[swapIndex] = ev.swapId1
898            task.subTasks = newST
899          }
900  
901          if (originalIndexCompleted > -1 && swapIndexCompleted > -1 && originalIndexCompleted > swapIndexCompleted) {
902            let newCompleted = task.completed.slice()
903            newCompleted[originalIndexCompleted] = ev.swapId2
904            newCompleted[swapIndexCompleted] = ev.swapId1
905            task.completed = newCompleted
906          }
907        }
908        break
909      case "tasks-received":
910        ev.tasks.forEach(newT => {
911          if (!tasks.some(cur => {
912              if (cur.taskId === newT.taskId) {
913                calculations.safeMerge(cur, newT)
914                return true
915              }
916            })) {
917            tasks.push(newT)
918          }
919        })
920        break
921      case "member-charged":
922        tasks.forEach(task => {
923          if (task.taskId === ev.memberId) {
924            task.boost -= parseFloat(ev.charged)
925            if (task.boost < 0) {
926              task.boost = 0
927            }
928          }
929        })
930        break
931    }
932    tasks.forEach( t => {
933        if (t.taskId === ev.inId) {
934            t.lastUsed = ev.timestamp
935        }
936    })
937  }
938  
939  export default {
940    aoActions,
941    cashActions,
942    membersActions,
943    resourcesActions,
944    sessionsActions,
945    tasksActions,
946    hashMapActions
947  }