Source code for sci_watch.senders.slack_sender

import os

from slack_sdk import WebClient

from sci_watch.core.settings import settings
from sci_watch.source_wrappers.document import Document
from sci_watch.utils.logger import get_logger

LOGGER = get_logger(__name__)

_SLACK_TIMEOUT = 200
_MAX_BLOCKS_PER_MESSAGE = 50


def _create_document_block(
    document: Document, summary: str = None
) -> list[dict[str, str | list | dict]]:
    """
    Create slack bloc structure.

    See: https://app.slack.com/block-kit-builder

    Parameters
    ----------
    document: Document
        Document to format

    summary: str, default: None
        Document summary

    Returns
    -------
    list:
        List of block elements for one document
    """
    block_list = [
        {
            "type": "section",
            "text": {
                "type": "mrkdwn",
                "text": f"*{document.from_query} {document.title}*",
            },
        }
    ]

    block_list.extend(
        [
            {"type": "divider"},
            {"type": "context", "elements": [{"type": "mrkdwn", "text": document.url}]},
        ]
    )
    if summary:
        block_list.extend(
            [
                {"type": "divider"},
                {"type": "context", "elements": [{"type": "mrkdwn", "text": summary}]},
            ]
        )
    else:
        block_list.extend(
            [
                {"type": "divider"},
                {
                    "type": "context",
                    "elements": [{"type": "mrkdwn", "text": document.content}],
                },
            ]
        )

    return block_list


[docs]def send_slack( channel_id: str, documents: list[Document], summaries: list[str] = None ) -> None: """ Send message through slack SLACK_OAUTH_TOKEN env must be set Parameters ---------- channel_id: str Channel name documents: list[Document] List of document to send summaries: list[str], default: None List of summaries """ client = WebClient( token=os.environ["SLACK_OAUTH_TOKEN"], timeout=_SLACK_TIMEOUT, proxy=settings.https_proxy, logger=LOGGER, ) block_list = [] for idx, document in enumerate(documents): current_summary = summaries[idx] if summaries else None block_list.extend( _create_document_block(document=document, summary=current_summary) ) for idx in range(0, len(block_list), _MAX_BLOCKS_PER_MESSAGE): blocks = block_list[idx : idx + _MAX_BLOCKS_PER_MESSAGE] client.chat_postMessage(channel=channel_id, text="SciWatch", blocks=blocks)