From 1388f6cff6fce5286dd6499dba7c7244f8903aff Mon Sep 17 00:00:00 2001 From: wugren Date: Thu, 25 Jan 2024 11:27:05 +0800 Subject: [PATCH] Add slack tunnel --- .gitignore | 3 +- src/component/slack_tunnel.py | 58 ++++++++++++++++++++++++++++ src/requirements.txt | 1 + src/service/aios_shell/aios_shell.py | 6 +++ 4 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 src/component/slack_tunnel.py diff --git a/.gitignore b/.gitignore index 09bdba0..08c0ea6 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ history.txt aios_shell_history.txt math_school_env.db workflows.db - +venv-linux +venv_test rootfs/test_doc/ diff --git a/src/component/slack_tunnel.py b/src/component/slack_tunnel.py new file mode 100644 index 0000000..e4497ed --- /dev/null +++ b/src/component/slack_tunnel.py @@ -0,0 +1,58 @@ +import asyncio + +from slack_bolt.adapter.socket_mode.websockets import AsyncSocketModeHandler +from slack_bolt.app.async_app import AsyncApp + +from aios.frame.tunnel import AgentTunnel +from aios.proto.agent_msg import AgentMsg + + +class SlackTunnel(AgentTunnel): + type: str + token: str + app_token: str + + def __init__(self): + super().__init__() + self.type = "SlackTunnel" + self.token = "" + + @classmethod + def register_to_loader(cls): + async def load_slack_tunnel(config: dict) -> AgentTunnel: + result_tunnel = SlackTunnel() + if await result_tunnel.load_from_config(config): + return result_tunnel + else: + return None + + AgentTunnel.register_loader("SlackTunnel", load_slack_tunnel) + + async def load_from_config(self, config: dict) -> bool: + self.target_id = config["target"] + self.tunnel_id = config["tunnel_id"] + + self.type = "SlackTunnel" + self.token = config["token"] + self.app_token = config["app_token"] + + return True + + def post_message(self, msg: AgentMsg) -> None: + pass + + async def start(self) -> bool: + app = AsyncApp(token=self.token) + + @app.event("message") + async def _handle_message(event, say): + await self._process_message(event) + + asyncio.create_task(AsyncSocketModeHandler(app, self.app_token).start_async()) + return True + + async def close(self) -> None: + pass + + async def _process_message(self, msg: AgentMsg) -> None: + return diff --git a/src/requirements.txt b/src/requirements.txt index d1aae8f..37c080b 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -154,3 +154,4 @@ html2text docx2txt opencv-python discord.py +slack_bolt diff --git a/src/service/aios_shell/aios_shell.py b/src/service/aios_shell/aios_shell.py index cd32a59..8e68a7f 100644 --- a/src/service/aios_shell/aios_shell.py +++ b/src/service/aios_shell/aios_shell.py @@ -19,6 +19,7 @@ from prompt_toolkit.auto_suggest import AutoSuggestFromHistory from prompt_toolkit.completion import WordCompleter from prompt_toolkit.styles import Style +from slack_tunnel import SlackTunnel directory = os.path.dirname(__file__) sys.path.append(directory + '/../../') @@ -236,6 +237,7 @@ class AIOS_Shell: TelegramTunnel.register_to_loader() EmailTunnel.register_to_loader() DiscordTunnel.register_to_loader() + SlackTunnel.register_to_loader() user_data_dir = str(AIStorage.get_instance().get_myai_dir()) tunnels_config_path = os.path.abspath(f"{user_data_dir}/etc/tunnels.cfg.toml") tunnel_config = None @@ -294,6 +296,10 @@ class AIOS_Shell: case "discord": tunnel_config["type"] = "DiscordTunnel" input_table["token"] = UserConfigItem("discord bot token\n You can get it from https://discord.com/developers/applications ,read https://discordpy.readthedocs.io/en/stable/discord.html for more details") + case "slack": + tunnel_config["type"] = "SlackTunnel" + input_table["token"] = UserConfigItem("slack bot token\n You can get it from https://api.slack.com/apps") + input_table["app_token"] = UserConfigItem("slack app token\n You can get it from https://api.slack.com/apps") case _: error_text = FormattedText([("class:error", f"tunnel type {tunnel_type}not support!")]) print_formatted_text(error_text,style=shell_style)