UNPKG

3.48 kBJavaScriptView Raw
1'use strict'
2
3const config = require('./lib/rc')().get()
4
5const _ = require('lodash')
6const async = require('async')
7
8const ada = require('./lib/index.js')
9const store = require('./lib/store.js')
10
11const twilio = require('twilio')
12const twilioClient = twilio(config.twilio.accountSid, config.twilio.authToken)
13
14const express = require('express')
15const bodyParser = require('body-parser')
16const app = express()
17
18// for debugging:
19// const readline = require('readline')
20// const rl = readline.createInterface({
21// input: process.stdin,
22// output: process.stdout
23// })
24
25app.use(bodyParser.urlencoded({ extended: false }))
26app.listen(config.server.port)
27
28app.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
40const 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
52const 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
78const 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 // for debugging:
96 // rl.question('? ', (answer) => {
97 // mapResponseToAnswer(answer, '06604099366')
98 // rl.pause()
99 // })
100 })
101 })
102}
103
104const sendText = (number, message, cb) => {
105 // for debugging:
106 // console.log(message)
107 // cb()
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}