diff --git a/toolkits/slack/arcade_slack/utils.py b/toolkits/slack/arcade_slack/utils.py index e4dce2e0..ea93474d 100644 --- a/toolkits/slack/arcade_slack/utils.py +++ b/toolkits/slack/arcade_slack/utils.py @@ -1,5 +1,6 @@ import asyncio import json +import logging import re from collections.abc import Callable, Sequence from datetime import datetime, timezone @@ -30,6 +31,8 @@ from arcade_slack.models import ( SlackUserList, ) +logger = logging.getLogger(__name__) + def format_users(user_list_response: SlackUserList) -> str: """Format a list of Slack users into a CSV string. @@ -535,32 +538,38 @@ async def populate_users_in_messages(auth_token: str, messages: list[dict]) -> l users_by_id = {user["id"]: {"id": user["id"], "name": user["name"]} for user in users} for message in messages: - if message.get("type") != "message": - continue + try: + if "user" not in message or message.get("type") != "message": + continue - # Message author - message["user"] = users_by_id.get( - message.get("user"), {"id": message["user"], "name": None} - ) + # Message author + message["user"] = users_by_id.get( + message.get("user"), {"id": message["user"], "name": None} + ) - # User mentions in the message text - text_mentions = re.findall(r"<@([A-Z0-9]+)>", message.get("text", "")) - for user_id in text_mentions: - if user_id in users_by_id: - user = users_by_id.get(user_id, {"id": user_id, "name": None}) - name = user.get("name") - message["text"] = message["text"].replace( - f"<@{user_id}>", f"<@{name} (id:{user_id})>" if name else f"<@{user_id}>" - ) + # User mentions in the message text + text_mentions = re.findall(r"<@([A-Z0-9]+)>", message.get("text", "")) + for user_id in text_mentions: + if user_id in users_by_id: + user = users_by_id.get(user_id, {"id": user_id, "name": None}) + name = user.get("name") + message["text"] = message["text"].replace( + f"<@{user_id}>", f"<@{name} (id:{user_id})>" if name else f"<@{user_id}>" + ) - # User mentions in reactions - reactions = message.get("reactions") - if isinstance(reactions, list): - for reaction in reactions: - reaction_users = [] - for user_id in reaction.get("users", []): - reaction_users.append(users_by_id.get(user_id, {"id": user_id, "name": None})) - reaction["users"] = reaction_users + # User mentions in reactions + reactions = message.get("reactions") + if isinstance(reactions, list): + for reaction in reactions: + reaction_users = [] + for user_id in reaction.get("users", []): + reaction_users.append( + users_by_id.get(user_id, {"id": user_id, "name": None}) + ) + reaction["users"] = reaction_users + # If any data is missing, just leave the message as it is + except Exception as exc: + logger.exception(exc) # noqa: TRY401 return messages @@ -573,7 +582,7 @@ async def get_users_from_messages(auth_token: str, messages: list[dict]) -> list user_ids = get_user_ids_from_messages(messages) response = await get_users_by_id(auth_token, user_ids) - print("\n\n\nresponse:", response, "\n\n\n") + return response["users"] diff --git a/toolkits/slack/pyproject.toml b/toolkits/slack/pyproject.toml index f4eac661..4445a1b0 100644 --- a/toolkits/slack/pyproject.toml +++ b/toolkits/slack/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "arcade_slack" -version = "0.5.1" +version = "0.5.2" description = "Arcade.dev LLM tools for Slack" requires-python = ">=3.10" dependencies = [ "aiodns>=1.0,<2.0.0", "typing; python_version < '3.7'", "aiohttp>=3.7.3,<4.0.0", "arcade-tdk>=2.0.0,<3.0.0", "slack-sdk>=3.31.0,<4.0.0",]