1 | 'use strict'
|
2 |
|
3 | const config = require('./lib/rc')().get()
|
4 |
|
5 | const _ = require('lodash')
|
6 | const async = require('async')
|
7 |
|
8 | const ada = require('./lib/index.js')
|
9 | const store = require('./lib/store.js')
|
10 |
|
11 | const twilio = require('twilio')
|
12 | const twilioClient = twilio(config.twilio.accountSid, config.twilio.authToken)
|
13 |
|
14 | const express = require('express')
|
15 | const bodyParser = require('body-parser')
|
16 | const app = express()
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 | app.use(bodyParser.urlencoded({ extended: false }))
|
26 | app.listen(config.server.port)
|
27 |
|
28 | app.post('/', (request, response) => {
|
29 | const from = request.body.From
|
30 | const body = request.body.Body
|
31 | console.log(from, body)
|
32 |
|
33 | const restart = ['restart', 'reset', '💣']
|
34 | if (_.includes(restart, body.trim().toLowerCase())) {
|
35 | return store.deleteState(from, () => mapResponseToAnswer('restart', from))
|
36 | }
|
37 | mapResponseToAnswer(body, from)
|
38 | })
|
39 |
|
40 | const sendResult = (telephoneNumber, result) => {
|
41 | const message = [result.summary]
|
42 |
|
43 | message.concat(result.conditionReports.map((condition) => {
|
44 | return `${condition.seriousnessAdvice}: ${condition.name}`
|
45 | }))
|
46 |
|
47 | sendText(telephoneNumber, message.join('\n'), () => {
|
48 | console.log('done 🎉')
|
49 | })
|
50 | }
|
51 |
|
52 | const mapResponseToAnswer = (response, telephoneNumber) => {
|
53 | store.getState(telephoneNumber, (err, state) => {
|
54 | if (!state) {
|
55 | console.log('!state ', telephoneNumber)
|
56 | return ask(telephoneNumber)
|
57 | }
|
58 | if (err) throw err
|
59 | if (state.answerType === 'TEXT') {
|
60 | console.log('state.answerType === TEXT')
|
61 | console.log('telephoneNumber ', telephoneNumber)
|
62 | console.log('response ', response)
|
63 | return ask(telephoneNumber, response)
|
64 | }
|
65 |
|
66 | response = response.replace(/[^0-9]+/gi, '')
|
67 | const highestResponse = state.answerOptions.length
|
68 | if (response > highestResponse || !response.length) {
|
69 | const warn = `Please enter a number from 1 - ${highestResponse}. Thanks <3 ️`
|
70 | return sendText(telephoneNumber, warn, () => {})
|
71 | }
|
72 | console.log('telephoneNumber ', telephoneNumber)
|
73 | console.log('state.answerOptions[response - 1] ', state.answerOptions[response - 1])
|
74 | return ask(telephoneNumber, state.answerOptions[response - 1])
|
75 | })
|
76 | }
|
77 |
|
78 | const ask = (telephoneNumber, answerObj) => {
|
79 | ada(telephoneNumber, answerObj, false, (err, question) => {
|
80 | if (err) throw err
|
81 | if (question.summary) return sendResult(telephoneNumber, question)
|
82 | if (question.isOver) return sendText(question.gibberish.join(' '))
|
83 |
|
84 | const send = []
|
85 | send.push(_.flattenDeep([].concat(question.question)).join(' '))
|
86 |
|
87 | if (question.answerType === 'SELECT') {
|
88 | send.push(question.answerOptions.map((answer, index) => {
|
89 | return `${++index}. ${answer.text || answer.patientName}`
|
90 | }).join('\n'))
|
91 | }
|
92 |
|
93 | async.eachSeries(send, sendText.bind(undefined, telephoneNumber), (err) => {
|
94 | if (err) console.error(err)
|
95 |
|
96 |
|
97 |
|
98 |
|
99 |
|
100 | })
|
101 | })
|
102 | }
|
103 |
|
104 | const sendText = (number, message, cb) => {
|
105 |
|
106 |
|
107 |
|
108 | twilioClient.sendMessage({
|
109 | to: number,
|
110 | from: config.twilio.from,
|
111 | body: message
|
112 | }, (err, responseData) => {
|
113 | if (err) cb(err)
|
114 | console.log('Message ', responseData.status)
|
115 | cb()
|
116 | })
|
117 | }
|