Search code examples
facebook-messenger

Facebook messenger that sends a message manually if the user subscribed


I'm making a bot that let my students get a school meal menu. I'd like it to send a list of menu to students 10 minutes before the lunch time. How should I make a code for this in JavaScript? The main problem I encountered with was how to check the time so that my bot can send a message at that time. I also wonder if its code always runs on the Facebook server, so I can use while loop that always check a time. I'd appreciate an advice. (I use MongoDB and node)

var express = require("express");
var request = require("request");
var bodyParser = require("body-parser");

var hey = ["Yeah! 😃"]
var reply;

var app = express();
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());
app.listen((process.env.PORT || 5000));

app.get("/", function (req, res) {
  res.send("Deployed!");
});

app.get("/webhook", function (req, res) {
  if (req.query["hub.verify_token"] === process.env.VERIFICATION_TOKEN) {
    console.log("Verified webhook");
    res.status(200).send(req.query["hub.challenge"]);
  } else {
    console.error("Verification failed. The tokens do not match.");
    res.sendStatus(403);
  }
});

app.post('/webhook', function (req, res) {
  var data = req.body;

  if (data.object === 'page') {

    if(d.getHours() === 10 && d.getMinutes() === 5)
      sendTextMessage(senderID, "Success!"); 

    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 {
          console.log("Webhook received unknown event: ", event);
        }
      });
    });

    res.sendStatus(200);
  }
});


function receivedMessage(event) {
  var senderID = event.sender.id;
  psid = senderID; 
  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;


  if (messageText) {
    switch (messageText) {

      case 'Check': 
        sendTextMessage(senderID, "isSub: " + isSub);
        sendTextMessage(senderID, "gamerNumber: " + gamerNumber);
        sendTextMessage(senderID, "psid: " + senderID);
        break; 

----(and more)

    function sendGenericMessage(recipientId, payload) {
  var titlee
  var subs
  var image
  switch(payload){
    case "pmorning":
      titlee = "Breakfast"
      subs = //***this is the part where the db value goes in.*** 
      image = "https://cdn.arstechnica.net/wp-content/uploads/sites/3/2016/10/Oculus-Rift-vs-HTC-Vive-vs-PlayStation-VR-1.jpg"
      break;
   ---and more
            }]
          }]
        }
      }
    }
  };  
  sendTypingOn(recipientId);
  callSendAPI(messageData);
}

Solution

  • Take a look at node-cron, which enables you to schedule jobs for running at specific times, specified by a CRON expression