whatsapp.py 2.6 KB

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