slack.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import argparse
  2. import logging
  3. import os
  4. import signal
  5. import sys
  6. from embedchain import App
  7. from embedchain.helper.json_serializable import register_deserializable
  8. from .base import BaseBot
  9. try:
  10. from flask import Flask, request
  11. from slack_sdk import WebClient
  12. except ModuleNotFoundError:
  13. raise ModuleNotFoundError(
  14. "The required dependencies for Slack are not installed."
  15. 'Please install with `pip install --upgrade "embedchain[slack]"`'
  16. ) from None
  17. SLACK_BOT_TOKEN = os.environ.get("SLACK_BOT_TOKEN")
  18. @register_deserializable
  19. class SlackBot(BaseBot):
  20. def __init__(self):
  21. self.client = WebClient(token=SLACK_BOT_TOKEN)
  22. self.chat_bot = App()
  23. self.recent_message = {"ts": 0, "channel": ""}
  24. super().__init__()
  25. def handle_message(self, event_data):
  26. message = event_data.get("event")
  27. if message and "text" in message and message.get("subtype") != "bot_message":
  28. text: str = message["text"]
  29. if float(message.get("ts")) > float(self.recent_message["ts"]):
  30. self.recent_message["ts"] = message["ts"]
  31. self.recent_message["channel"] = message["channel"]
  32. if text.startswith("query"):
  33. _, question = text.split(" ", 1)
  34. try:
  35. response = self.chat_bot.chat(question)
  36. self.send_slack_message(message["channel"], response)
  37. logging.info("Query answered successfully!")
  38. except Exception as e:
  39. self.send_slack_message(message["channel"], "An error occurred. Please try again!")
  40. logging.error("Error occurred during 'query' command:", e)
  41. elif text.startswith("add"):
  42. _, data_type, url_or_text = text.split(" ", 2)
  43. if url_or_text.startswith("<") and url_or_text.endswith(">"):
  44. url_or_text = url_or_text[1:-1]
  45. try:
  46. self.chat_bot.add(url_or_text, data_type)
  47. self.send_slack_message(message["channel"], f"Added {data_type} : {url_or_text}")
  48. except ValueError as e:
  49. self.send_slack_message(message["channel"], f"Error: {str(e)}")
  50. logging.error("Error occurred during 'add' command:", e)
  51. except Exception as e:
  52. self.send_slack_message(message["channel"], f"Failed to add {data_type} : {url_or_text}")
  53. logging.error("Error occurred during 'add' command:", e)
  54. def send_slack_message(self, channel, message):
  55. response = self.client.chat_postMessage(channel=channel, text=message)
  56. return response
  57. def start(self, host="0.0.0.0", port=5000, debug=True):
  58. app = Flask(__name__)
  59. def signal_handler(sig, frame):
  60. logging.info("\nGracefully shutting down the SlackBot...")
  61. sys.exit(0)
  62. signal.signal(signal.SIGINT, signal_handler)
  63. @app.route("/", methods=["POST"])
  64. def chat():
  65. # Check if the request is a verification request
  66. if request.json.get("challenge"):
  67. return str(request.json.get("challenge"))
  68. response = self.handle_message(request.json)
  69. return str(response)
  70. app.run(host=host, port=port, debug=debug)
  71. def start_command():
  72. parser = argparse.ArgumentParser(description="EmbedChain SlackBot command line interface")
  73. parser.add_argument("--host", default="0.0.0.0", help="Host IP to bind")
  74. parser.add_argument("--port", default=5000, type=int, help="Port to bind")
  75. args = parser.parse_args()
  76. slack_bot = SlackBot()
  77. slack_bot.start(host=args.host, port=args.port)
  78. if __name__ == "__main__":
  79. start_command()