ht-messenger
Version:
Messenger module for heart rate
247 lines (227 loc) • 6.83 kB
JavaScript
var https = require('https'),
express = require('express'),
request = require('request'),
fs = require('fs'),
bodyParser = require('body-parser'),
crypto = require('crypto'),
configF = require(__dirname+'/../../config');
var config = configF.config;
const APP_SECRET = config.appSecret,
VERIFY_TOKEN = config.webhookToken,
PAGE_ACCESS_TOKEN = config.pageToken,
VERIFY_CODE = config.code,
URL = config.url;
var app = express();
app.use(bodyParser.json({ verify: verifyRequestSignature }));
app.use(express.static('public'));
var port = process.env.PORT || 9000;
var opts = {
key: fs.readFileSync('cert/wsskey.pem'),
cert: fs.readFileSync('cert/wsscert.pem'),
ca: fs.readFileSync('cert/cacert.pem')
}
app.get('/', function (req, res){
res.sendFile( __dirname + '/public/error.html');
});
app.get('/webhook', function(req, res) {
if (req.query['hub.mode'] === 'subscribe' && req.query['hub.verify_token'] === VERIFY_TOKEN) {
console.log("Validating webhook");
res.status(200).send(req.query['hub.challenge']);
} else {
console.error("Failed validation. Make sure the validation tokens match.");
res.sendStatus(403);
}
});
app.post('/webhook', function (req, res) {
var data = req.body;
if (data.object === 'page') {
data.entry.forEach(function(entry) {
var pageID = entry.id;
var timeOfEvent = entry.time;
entry.messaging.forEach(function(event) {
if (event.message) {
receivedMessage(event);
} else if (event.postback) {
receivedPostback(event);
} else if (event.delivery) {
receivedDeliveryConfirmation(event);
} else {
console.log("Webhook received unknown event: ", event);
}
});
});
res.sendStatus(200);
}
});
function onPostback(senderID, payload){
}
function onMsg(senderID, messageText){
var command = messageText.toLowerCase();
switch(command){
case 'data':
case 'last':
case 'latest':
request({
method: 'POST',
uri: URL + '/getData',
json: {
user: senderID,
verify: VERIFY_CODE,
mode: 'lastData'
}
}, function(err, response, body){
if(!err){
var uData = body.data;
var msg = "Your last " + uData.length + " measurements:\n" + uData[0].date + ": " + uData[0].result;
if(uData.length > 1){
for(var i = 1; i < uData.length; i++){
msg+="\n" + uData[i].date + ": " + uData[i].result;
}
createMessage('text', senderID, msg, function(messageTS){
callSendAPI(messageTS);
});
}
} else {
console.log("Error getting user data:", err);
createMessage('text', senderID, "Error getting your data. Try again later", function(messageTS){
callSendAPI(messageTS);
});
}
});
break;
default:
var help = "Unknown command. To ask for your latest data send:\nlast";
createMessage('text', senderID, help, function(messageTS){
callSendAPI(messageTS);
});
break;
}
}
function receivedPostback(event) {
var senderID = event.sender.id;
var recipientID = event.recipient.id;
var timeOfPostback = event.timestamp;
var payload = event.postback.payload;
console.log("Received postback for user %d and page %d with payload '%s' " + "at %d", senderID, recipientID, payload, timeOfPostback);
onPostback(senderID, payload);
}
function receivedMessage(event) {
var senderID = event.sender.id;
var recipientID = event.recipient.id;
var timeOfMessage = event.timestamp;
var message = event.message;
console.log("Received message for user %d and page %d at %d with message:", senderID, recipientID, timeOfMessage);
console.log(JSON.stringify(message));
var messageId = message.mid;
var messageText = message.text;
var messageAttachments = message.attachments;
var help = 'Nie przyjmujemy załączników';
if (messageText) {
onMsg(senderID, messageText);
} else {
createMessage('text', senderID, help, function(messageTS){
callSendAPI(messageTS);
});
}
}
function verifyRequestSignature(req, res, buf) {
var signature = req.headers["x-hub-signature"];
if (!signature) {
console.error("Couldn't validate the signature.");
} else {
var elements = signature.split('=');
var method = elements[0];
var signatureHash = elements[1];
var expectedHash = crypto.createHmac('sha1', APP_SECRET)
.update(buf)
.digest('hex');
if (signatureHash != expectedHash) {
throw new Error("Couldn't validate the request signature.");
}
}
}
function receivedDeliveryConfirmation(event) {
var senderID = event.sender.id;
var recipientID = event.recipient.id;
var delivery = event.delivery;
var messageIDs = delivery.mids;
var watermark = delivery.watermark;
var sequenceNumber = delivery.seq;
if (messageIDs) {
messageIDs.forEach(function(messageID) {
console.log("Received delivery confirmation for message ID: %s", messageID);
});
}
console.log("All message before %d were delivered.", watermark);
}
function createMessage(type, id, content, callback){
var message = {
recipient: {
id: id
}
};
console.log(content);
if(type == 'text'){
message['message']={text: content};
}else{
message['message']={
attachment:{
type: 'template',
payload:{
template_type: 'button',
text: content['text'],
buttons: content['buttons']
}
}
}
}
setImmediate(function(){
callback(message);
});
}
function createButtons(tab, callback){
var buttons=[];
for(var i = 0; i < tab.length; i++){
var btn = tab[i];
var singleBTN={};
singleBTN['type']=btn[0];
singleBTN['title']=btn[2];
if(btn[0]=='web_url'){
singleBTN['url']=btn[1];
} else if(btn[0]=='postback'){
singleBTN['payload']=btn[1];
}
console.log(singleBTN);
console.log(JSON.stringify(singleBTN));
buttons.push(singleBTN);
}
setImmediate(function(){
console.log(buttons);
callback(buttons);
});
}
function callSendAPI(messageData) {
request({
uri: 'https://graph.facebook.com/v2.6/me/messages',
qs: { access_token: PAGE_ACCESS_TOKEN },
method: 'POST',
json: messageData
}, function (error, response, body) {
if (!error && response.statusCode == 200) {
var recipientId = body.recipient_id;
var messageId = body.message_id;
if (messageId) {
console.log("Successfully sent message with id %s to recipient %s", messageId, recipientId);
} else {
console.log("Successfully called Send API for recipient %s", recipientId);
}
} else {
console.error("Failed calling Send API", response.statusCode, response.statusMessage, body.error);
}
});
}
function run(){
https.createServer(opts, app).listen(9000);
console.log('Started');
}
exports.mess = run;