whatsapp.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import argparse
  2. import logging
  3. import signal
  4. import sys
  5. from flask import Flask, request
  6. from twilio.twiml.messaging_response import MessagingResponse
  7. from embedchain.helper_classes.json_serializable import register_deserializable
  8. from .base import BaseBot
  9. @register_deserializable
  10. class WhatsAppBot(BaseBot):
  11. def __init__(self):
  12. super().__init__()
  13. def handle_message(self, message):
  14. if message.startswith("add "):
  15. response = self.add_data(message)
  16. else:
  17. response = self.ask_bot(message)
  18. return response
  19. def add_data(self, message):
  20. data = message.split(" ")[-1]
  21. try:
  22. self.add(data)
  23. response = f"Added data from: {data}"
  24. except Exception:
  25. logging.exception(f"Failed to add data {data}.")
  26. response = "Some error occurred while adding data."
  27. return response
  28. def ask_bot(self, message):
  29. try:
  30. response = self.query(message)
  31. except Exception:
  32. logging.exception(f"Failed to query {message}.")
  33. response = "An error occurred. Please try again!"
  34. return response
  35. def start(self, host="0.0.0.0", port=5000, debug=True):
  36. app = Flask(__name__)
  37. def signal_handler(sig, frame):
  38. logging.info("\nGracefully shutting down the WhatsAppBot...")
  39. sys.exit(0)
  40. signal.signal(signal.SIGINT, signal_handler)
  41. @app.route("/chat", methods=["POST"])
  42. def chat():
  43. incoming_message = request.values.get("Body", "").lower()
  44. response = self.handle_message(incoming_message)
  45. twilio_response = MessagingResponse()
  46. twilio_response.message(response)
  47. return str(twilio_response)
  48. app.run(host=host, port=port, debug=debug)
  49. def start_command():
  50. parser = argparse.ArgumentParser(description="EmbedChain WhatsAppBot command line interface")
  51. parser.add_argument("--host", default="0.0.0.0", help="Host IP to bind")
  52. parser.add_argument("--port", default=5000, type=int, help="Port to bind")
  53. args = parser.parse_args()
  54. whatsapp_bot = WhatsAppBot()
  55. whatsapp_bot.start(host=args.host, port=args.port)
  56. if __name__ == "__main__":
  57. start_command()