slack.py 3.8 KB

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