Source code for slackfin.blocks
from .types import (
SlackElementType,
SlackImageType,
SlackMarkdownType,
)
from .formatter import SlackFormatter
[docs]class SlackMessageBlock:
"""
A Slack message block
Args:
*blocks: any child blocks
"""
def __init__(self, *blocks):
self.blocks = blocks if blocks else []
[docs] def render(self) -> list:
"""Render the block to JSON."""
blocks = []
for block in self.blocks:
blocks.extend(block.render())
return blocks
[docs]class SlackMessageMarkdown(SlackMessageBlock):
"""
A Slack message markdown
Args:
text: the markdown text
image_url: the image URL
alt_text: the alternative text
"""
def __init__(
self,
*args,
text: str = "",
image_url: str = "",
alt_text: str = "",
**kwargs
):
super().__init__(*args, **kwargs)
self.text = text
if image_url:
self.image = SlackImageType(image_url, alt_text)
[docs] def render(self) -> list:
"""Render the markdown to JSON."""
blocks = super().render()
segment = {
'type': 'section',
'text': SlackMarkdownType(self.text).render()
}
if self.image:
segment['accessory'] = self.image.render()
blocks.append(segment)
return blocks
[docs]class SlackLabelValuePair:
"""
A label/value pair
Args:
label: the label
value: the value
label_url: the label URL
value_url: the value URL
"""
def __init__(
self,
label: str = "",
value: str = "",
label_url: str = "",
value_url: str = ""
) -> None:
self.label = label
self.value = value
self.label_url = label_url
self.value_url = value_url
[docs] def render(self) -> str:
"""Render the label/value pair to Markdown."""
if self.label_url:
label = SlackFormatter().link(self.label_url, self.label)
else:
label = self.label
if self.value_url:
value = SlackFormatter().link(self.value_url, self.value)
else:
value = self.value
return f"*{label}*: {value}"
[docs]class SlackLabelValueListBlock(SlackMessageMarkdown):
"""
A Slack message label/value list block
Args:
*entries: any SlackLabelValuePair entries
"""
def __init__(self, *entries: SlackLabelValuePair, **kwargs):
super().__init__(**kwargs)
self.entries = entries if entries else []
[docs] def add_entry(self, entry: SlackLabelValuePair) -> None:
"""Add an entry to the list."""
self.entries.append(entry)
[docs] def render(self) -> list:
"""Render the block to JSON."""
joined = '\n'.join([entry.render() for entry in self.entries])
self.text = f"{self.text}\n\n{joined}"
return super().render()
[docs]class SlackMessageValueBlock(SlackMessageBlock):
"""
A Slack message value block
Args:
label: the label
value: the value
secondary_label: the secondary label
secondary_value: the secondary value
"""
def __init__(
self,
*args,
label: str = "",
value: str = "",
secondary_label: str = "",
secondary_value: str = "",
**kwargs
):
super().__init__(*args, **kwargs)
self.fields = []
self.fields.append({'type': 'mrkdwn', 'text': f"*{label}*\n{value}"})
if secondary_label and secondary_value:
self.fields.append(
{
'type': 'mrkdwn',
'text': f"*{secondary_label}*\n{secondary_value}"
}
)
[docs] def render(self) -> list:
"""Render the block to JSON."""
blocks = super().render()
segment = {
'type': 'section',
'fields': self.fields
}
blocks.append(segment)
return blocks
[docs]class SlackMessageDivider(SlackMessageBlock):
"""
A Slack message divider
"""
[docs] def render(self) -> list:
"""Render the divider to JSON."""
blocks = super().render()
segment = {
'type': 'divider'
}
blocks.append(segment)
return blocks
[docs]class SlackMessageContext(SlackMessageBlock):
"""
A Slack message context
Args:
*elements: any SlackElementType elements
"""
def __init__(self, *elements: SlackElementType, **kwargs):
super().__init__(**kwargs)
self.elements = elements if elements else []
[docs] def add_element(self, element: SlackElementType) -> None:
"""Add an element to the context."""
self.elements.append(element)
[docs] def render(self) -> list:
"""Render the context to JSON."""
blocks = super().render()
elements = []
for element in self.elements:
elements.append(element.render())
segment = {
'type': 'context',
'elements': elements
}
blocks.append(segment)
return blocks