Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jakelumetta/e0f6bc27ba290ac3ff649df7a1d7bb4e to your computer and use it in GitHub Desktop.
Save jakelumetta/e0f6bc27ba290ac3ff649df7a1d7bb4e to your computer and use it in GitHub Desktop.
Full code for integrating olark and buttercms
const WRITE_TOKEN = 'your-buttercms-write-api-key'
const express = require("express")
const request = require("request")
const bodyParser = require("body-parser")
const slug = require("slug")
const app = express();
app.use(bodyParser.urlencoded({extended: true}))
/**
* Turns a list of JSON objects like this:
* {
body: 'hey there!',
timestamp: '1561209998.139551',
kind: 'MessageToVisitor',
nickname: 'Fernando',
operatorId: '1046479'
}
*
* Into something easier to read, like this:
* < (1561214253.621349): hey there!
< (1561214255.636326): I have a question for you!
< (1561214261.976311): if you can answer it please
< (1561214266.057416): that woudl be awesome!
> (1561214274.637839): hey there, sure I can
> (1561214277.006478): tell me about it
< (1561214296.327043): what's your name?
> (1561214298.993349): fernando
*
*/
function getConvoTranscript(items) {
return items.map( i => {
let transcript = []
if(i.kind == 'MessageToVisitor') transcript.push("> ")
else transcript.push("< ")
transcript.push("(" + i.timestamp + "): ")
transcript.push(i.body)
return transcript.join(" ")
}).join("\n")
}
app.post('/olark-hook', async function (req, res) {
/**
* 1. get olark payload
* 2. check for tags containing "faq" tag
* 3. create a new FAQ item in butter
* - Title: Olark Question: ID
* - Question: empty
* - Answer: empty
* - Transcript: full convo transcript
*
* Future improvements:
* 1. Keep track of received convo ids, and their items
* - If already received convo ID is sent again, only process new items
*/
let body = JSON.parse(req.body.data)
if(body.tags.map( t => t.toLowerCase() ).indexOf("faq") != -1) {
let pTitle = "Olark question: " + body.id
let newPage = {
title: pTitle,
slug: slug(pTitle),
"page-type": "faq",
fields: {
"en": {
question: "",
answer: "",
transcript: getConvoTranscript(body.items)
}
}
}
let postURL = 'https://api.buttercms.com/v2/pages/'
request.post({ //perform the page creation
url: postURL,
headers: {
"Authorization": "Token " + WRITE_TOKEN
},
json: true,
body: newPage,
}, (err, resp) => { //We're done!
if(err) {
console.log("There was an error: ", err)
return res.json(err)
}
console.log("Done, new page successfully created in ButterCMS!")
console.log(resp)
res.json({ integrationUrl: "http://your-host.com/olark-hook"})
})
}
})
app.listen(3000, function () {
console.log('Example app listening on port 3000!');
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment