text: import os
  import sys
  import json
  from datetime import datetime
  import pun_grabber
  import message_repeater
  
  import requests
  from flask import Flask, request
  
  app = Flask(__name__)
  
  mode = "PUN"
  
  @app.route('/', methods=['GET'])
  def verify():
      # when the endpoint is registered as a webhook, it must echo back
      # the 'hub.challenge' value it receives in the query arguments
      if request.args.get("hub.mode") == "subscribe" and request.args.get("hub.challenge"):
          if not request.args.get("hub.verify_token") == os.environ["VERIFY_TOKEN"]:
              return "Verification token mismatch", 403
          return request.args["hub.challenge"], 200
  
      return "Hello world", 200
  
  
  @app.route('/', methods=['POST'])
  def webhook():
  
      # endpoint for processing incoming messaging events
  
      data = request.get_json()
      log(data)  # you may not want to log every incoming message in production, but it's good for testing
      global mode
  
      if data["object"] == "page":
  
          for entry in data["entry"]:
              for messaging_event in entry["messaging"]:
  
                  if messaging_event.get("message"):  # someone sent us a message
  
                      sender_id = messaging_event["sender"]["id"]        # the facebook ID of the person sending you the message
                      recipient_id = messaging_event["recipient"]["id"]  # the recipient's ID, which should be your page's facebook ID
                      message_text = messaging_event["message"]["text"]  # the message's text
  
                      print(mode)
                      reply = "Invalid command"
  
                      if(message_text == "HELP"):
                          reply = "Say \"MODE PUN\" to set to Pun Mode, or \"MODE REPEAT\" to set to Repeat Mode"
                      elif(message_text == "MODE"):
                          reply = "The mode is: " + mode
                      elif(len(message_text.strip().split()) == 2 and (message_text.strip().split()[0] == "MODE")):
                          new_mode = message_text.strip().split()[1]
                          if(new_mode == "PUN"):
                              mode = "PUN"
                              reply = "Set to Pun Mode"
                          elif(new_mode == "REPEAT"):
                              mode = "REPEAT"
                              reply = "Set to Repeat Mode"
                      elif(mode == "PUN"):
                          print("punning")
                          reply = pun_grabber.generate_pun(message_text)
                      elif(mode == "REPEAT"):
                          print("repeating")
                          reply = message_repeater.generate_repeat(message_text)
  
                      send_message(sender_id, reply)
  
                  if messaging_event.get("delivery"):  # delivery confirmation
                      pass
  
                  if messaging_event.get("optin"):  # optin confirmation
                      pass
  
                  if messaging_event.get("postback"):  # user clicked/tapped "postback" button in earlier message
                      pass
  
      return "ok", 200
  
  
  def send_message(recipient_id, message_text):
  
      log("sending message to {recipient}: {text}".format(recipient=recipient_id, text=message_text))
  
      params = {
          "access_token": os.environ["PAGE_ACCESS_TOKEN"]
      }
      headers = {
          "Content-Type": "application/json"
      }
      data = json.dumps({
          "recipient": {
              "id": recipient_id
          },
          "message": {
              "text": message_text
          }
      })
      r = requests.post("https://graph.facebook.com/v2.6/me/messages", params=params, headers=headers, data=data)
      if r.status_code != 200:
          log(r.status_code)
          log(r.text)
  
  
  def log(msg, *args, **kwargs):  # simple wrapper for logging to stdout on heroku
      try:
          if type(msg) is dict:
              msg = json.dumps(msg)
          else:
              msg = '' #str(msg, 'utf-8').format(*args, **kwargs)
          print(u"{}: {}".format(datetime.now(), msg))
      except UnicodeEncodeError:
          pass  # squash logging errors in case of non-ascii text
      sys.stdout.flush()
  
  
  if __name__ == '__main__':
      app.run(debug=True)
  