whatsapp.py 2.6 KB

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