UNPKG

bravey

Version:

A simple JavaScript NLP-like library to help you creating your own bot.

219 lines (200 loc) 8.3 kB
window.BOTLoader = function(contact) { contact.setAvatar("avatar/pharma.png"); contact.setDescription("..."); contact.setTips("..."); contact.request("GET", (contact.root + "data/medbot." + contact.settings.language + ".json?a=1").toLowerCase(), 0, function(database) { database = JSON.parse(database); contact.setDescription(database.description); contact.setTips(database.tips); contact.say(database.warning, "error"); var sessionId, contextManager = new Bravey.ContextManager(); function getMedLabel(html, data, skip) { if (data.photo) html = '<img src="' + data.photo + '" width=50> ' + html; for (var a in database.medFields) if ((data[a] !== undefined) && (!skip || !skip[a])) html += " " + database.medFields[a].prefix + " " + data[a]; return html; } function formatTime(time) { var spl = time.split(":"); return spl[0] + ":" + spl[1]; } function replaceText(text, obj) { var html = text; html = html.replace(/\{medtype\}/g, obj.medtype); html = html.replace(/\{color\}/g, obj.color); html = html.replace(/\{time\}/g, formatTime(obj.time)); return html; } function medSummary(context) { var html = "<table style='background-color:#fff; border-collapse: collapse; text-align:center; font-size: 15px;' cellpadding=5 border=1><tr style='font-weight:bold'><td>" + database.number + "</td><td>" + database.time + "</td><td>" + database.medicationTable + "</td></tr>"; for (var i = 0; i < context.meds.length; i++) { var orario = context.meds[i].time.split(":"); html += "<tr><td>" + (i + 1) + "</td><td>" + formatTime(context.meds[i].time) + "</td><td>" + getMedLabel(database.medication, context.meds[i], { time: 1 }) + "</td></tr>"; } html += "</table>"; html += "<br>" + database.medsInfo; return html; } function getQuestion(prod) { for (var a in database.medFields) if (prod[a] === undefined) { return database.medFields[a].question; break; } } function pad(v, n) { v = "" + v; while (v.length < n) v = "0" + v; return v; } var medType = new Bravey.StringEntityRecognizer("medtype"); for (var i in database.medType) for (var j in database.medType[i]) medType.addMatch(i, database.medType[i][j]); var color = new Bravey.StringEntityRecognizer("color"); for (var i in database.color) for (var j in database.color[i]) color.addMatch(i, database.color[i][j]); var time = new Bravey.Language[database.symbol].TimeEntityRecognizer("time"); var number = new Bravey.Language[database.symbol].NumberEntityRecognizer("number"); var getMedNlp = new Bravey.Nlp.Fuzzy("getMed", { stemmer: Bravey.Language[database.symbol].Stemmer, filter: Bravey.Filter.BasicFilter }); getMedNlp.addEntity(medType); getMedNlp.addEntity(color); getMedNlp.addEntity(time); getMedNlp.addEntity(number); for (var a in database.nlp) for (var i = 0; i < database.nlp[a].length; i++) getMedNlp.addDocument(database.nlp[a][i], a, { fromTaggedSentence: true, expandIntent: true }); contextManager.addNlp(getMedNlp); for (var i = 0; i < database.bootstrap.length; i++) contact.say(database.bootstrap[i]); contact.say(database.suggestion); contact.setOnline(true); var lastCheck = ""; setInterval(function() { var date = new Date(); var check = pad(date.getHours(), 2) + ":" + pad(date.getMinutes(), 2) + ":00"; if (sessionId && (check != lastCheck)) { var entries = contextManager.getSessionIdData(sessionId); if (entries && entries.meds) { var out = ""; for (var i = 0; i < entries.meds.length; i++) { if (entries.meds[i].time == check) out += "<li>" + getMedLabel(database.theMedication, entries.meds[i], { time: 1 }) + "</li>"; } if (out) contact.say(database.alert + "<ul>" + out + "</ul>", "notify"); } lastCheck = check; } }, 1000); contact.onReceive = function(text) { var html = "", out = contextManager.testBySessionId(text, sessionId); if (out.result) { sessionId = out.sessionId; var context = { newMed: out.sessionData.newMed || {}, meds: out.sessionData.meds || [] }; switch (out.result.intent) { case "photoMed": { contact.say("", "", function(node) { if (document.getElementById("my_camera")) { node.innerHTML = database.alreadyPhoto; } else { node.innerHTML = database.photo + "<br><br><div id='my_camera' style='width:320px; height:240px;'></div><br>"; var trigger = document.createElement("input"); trigger.type = "button"; trigger.value = database.shoot; trigger.onclick = function() { Webcam.snap(function(data_uri) { node.innerHTML = database.photoDone + '<br><br><img src="' + data_uri + '"/>'; Webcam.reset(); context = contextManager.getSessionIdData(sessionId); context.newMed.photo = data_uri; contextManager.setSessionIdData(sessionId, context); var quest = getQuestion(context.newMed); if (quest) contact.say(quest); }); } node.appendChild(trigger); Webcam.on('error', function(err) { node.innerHTML = database.cameraNotAvailable; }); Webcam.set({ swfURL: 'libs/webcamjs/webcam.swf' }); Webcam.attach('#my_camera'); } }); break; } case "newMed": { for (var a in database.medFields) if (out.result.entitiesIndex[a] !== undefined) context.newMed[a] = out.result.entitiesIndex[a].value; var check = getQuestion(context.newMed); if (check) html += check; else { html = replaceText(database.done, context.newMed); context.meds.push(context.newMed); context.newMed = {}; } contact.say(html); break; } case "listMed": { if (context.meds.length) { html += database.list + "<br><br>" + medSummary(context); } else { html += database.emptyList; } contact.say(html); break; } case "deleteMed": { if (context.meds.length) { var id = out.result.entitiesIndex.number.value - 1; if (context.meds[id]) { var removed = context.meds.splice(id, 1); html = replaceText(database.deletedMed, removed[0]); } else { html += database.cantFind + "<br><br>" + medSummary(context); } } else { html += database.noMeds + " " + database.suggestion; } contact.say(html); break; } case "introMed": { contact.say(database.introMed + "<br>" + database.suggestion); break; } case "closeMed": { contact.say(database.closeMed); break; } default: { contact.say(database.notUnderstand); } } contextManager.setSessionIdData(sessionId, context); } else contact.say(database.notUnderstand); }; }); }