Source code for arxiv_post.apps.slack
__all__ = ["post"]
# standard library
from logging import getLogger
from typing import Any, Dict, Sequence
# dependencies
from requests import post as _post
from tomli import TOMLDecodeError, loads
# submodules
from ..article import Article
# constants
PAYLOAD_TOML = '''
text = """{header}"""
[[blocks]]
type = "header"
[blocks.text]
type = "plain_text"
text = """{header}"""
[[blocks]]
type = "section"
[blocks.text]
type = "mrkdwn"
text = """*Titie:* {title}"""
[[blocks]]
type = "section"
[blocks.text]
type = "mrkdwn"
text = """*Authors:* {authors}"""
[[blocks]]
type = "section"
[blocks.text]
type = "mrkdwn"
text = """*Summary:* {summary}"""
[[blocks]]
type = "actions"
[[blocks.elements]]
type = "button"
action_id = "view_arxiv"
url = """{arxiv_url}"""
[blocks.elements.text]
type = "plain_text"
text = "View arXiv"
[[blocks.elements]]
type = "button"
action_id = "view_pdf"
url = """{arxiv_pdf_url}"""
[blocks.elements.text]
type = "plain_text"
text = "View PDF"
'''
# logger
logger = getLogger(__name__)
# runtime functions
[docs]def post(articles: Sequence[Article], slack_webhook_url: str, dry_run: bool) -> None:
"""Post articles to Slack."""
for article in articles:
try:
payload = to_payload(article)
if not dry_run:
_post(slack_webhook_url, json=payload)
logger.debug(f"Posted an article: {article.arxiv_url}")
except TOMLDecodeError:
logger.warn(f"Failed to post an article: {article.arxiv_url}")
def to_payload(article: Article) -> Dict[str, Any]:
"""Convert an article object to a Slack payload."""
if article.original is None:
original = article
else:
original = article.original
return loads(
PAYLOAD_TOML.format(
header=article.title,
title=original.title,
authors=", ".join(original.authors),
summary=article.summary,
arxiv_url=original.arxiv_url,
arxiv_pdf_url=original.arxiv_pdf_url,
)
)