Skip to content

Commit

Permalink
add a medium support options for slack bot message
Browse files Browse the repository at this point in the history
  • Loading branch information
FusRoman committed Feb 2, 2024
1 parent dc0e6d5 commit 17704ff
Show file tree
Hide file tree
Showing 11 changed files with 371 additions and 41 deletions.
76 changes: 62 additions & 14 deletions fink_utils/slack_bot/bot_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,16 @@
from fink_science.image_classification.utils import img_normalizer
from fink_utils.logging.logs import init_logging
from fink_utils.slack_bot.msg_builder import Message, Divider, Header
from fink_utils.slack_bot.section import Section, Type_text
from fink_utils.slack_bot.section import Section, TypeText
import fink_utils.slack_bot.image as img

from fink_utils.slack_bot.rich_text.rich_text import RichText
from fink_utils.slack_bot.rich_text.rich_section import SectionElement
from fink_utils.slack_bot.rich_text.rich_preformatted import RichPreformatted
from fink_utils.slack_bot.rich_text.rich_quote import RichQuote
from fink_utils.slack_bot.rich_text.rich_list import RichList
import fink_utils.slack_bot.rich_text.rich_text_element as rel


def unzip_img(stamp: bytes, title_name: str) -> io.BytesIO:
"""
Expand Down Expand Up @@ -86,35 +93,33 @@ def decode_array(content):
)

msg = Message()
msg.add_header(Type_text.PLAIN_TXT, "Fink Slack Test")
msg.add_header("Fink Slack Test")
msg.add_divider()

first_section = Section(
Type_text.MARKDOWN, "this is a test message from the fink-utils CI"
TypeText.MARKDOWN, "this is a test message from the fink-utils CI"
)

first_section.add_textfield(Type_text.MARKDOWN, "first field :stars:", True)
first_section.add_textfield(
Type_text.MARKDOWN, "second field :ringed_planet:", True
)
first_section.add_textfield(TypeText.MARKDOWN, "first field :stars:", True)
first_section.add_textfield(TypeText.MARKDOWN, "second field :ringed_planet:", True)

science_section = Section(Type_text.MARKDOWN, "Science")
science_section = Section(TypeText.MARKDOWN, "Science")
science_section.add_slack_image(results_post[0], "Science")

template_section = Section(Type_text.MARKDOWN, "Template")
template_section = Section(TypeText.MARKDOWN, "Template")
template_section.add_slack_image(results_post[1], "Template")

difference_section = Section(Type_text.MARKDOWN, "Difference")
difference_section = Section(TypeText.MARKDOWN, "Difference")
difference_section.add_slack_image(results_post[2], "Difference")

msg.add_elements(first_section)
msg.add_elements(science_section)
msg.add_elements(template_section)
msg.add_elements(difference_section)

fink_section = Section(Type_text.MARKDOWN, "fink-science-portal")
fink_section = Section(TypeText.MARKDOWN, "fink-science-portal")
fink_section.add_urlbutton(
Type_text.PLAIN_TXT,
TypeText.PLAIN_TXT,
"fink-science-portal",
"View on Fink :fink:",
"https://fink-portal.org/ZTF23abjzkmx",
Expand All @@ -125,12 +130,55 @@ def decode_array(content):
img_sci = img.Image(results_post[0], "scienceImage")
img_temp = img.Image(results_post[1], "scienceTemplate")
img_diff = img.Image(results_post[2], "scienceDifference")
header_img = Header(Type_text.PLAIN_TXT, "Image Test")
header_img = Header("Image Test")
msg.add_elements([header_img, img_sci, Divider(), img_temp, Divider(), img_diff])

slack_bot.post_msg_on_slack(
slack_client,
"#bot_fink_grb_bronze_test",
"#bot_fink_utils_test",
[msg],
logger=logger,
verbose=True,
)

msg = (
Message()
.add_header("Type_text Test")
.add_divider()
.add_elements(
RichText()
.add_elements(
SectionElement()
.add_elements(rel.Text("- text element\n"))
.add_elements(rel.Text("- next text\n"))
)
.add_elements(
SectionElement().add_elements(rel.Link("https://fink-broker.org/"))
)
.add_elements(
RichList()
.add_elements(SectionElement().add_elements(rel.Text("first element")))
.add_elements(SectionElement().add_elements(rel.Text("second element")))
.add_elements(SectionElement().add_elements(rel.Text("third element")))
)
.add_elements(
RichPreformatted()
.add_elements(rel.Text("A preformatted block\n"))
.add_elements(rel.Link("https://fink-broker.org/"))
)
.add_elements(RichQuote().add_elements(rel.Text("and finally a quote")))
)
)

print()
print("\n\n")
print(msg.blocks)
print()
print("\n\n")

slack_bot.post_msg_on_slack(
slack_client,
"#bot_fink_utils_test",
[msg],
logger=logger,
verbose=True,
Expand Down
6 changes: 3 additions & 3 deletions fink_utils/slack_bot/image.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from fink_utils.slack_bot.section import Type_text
from fink_utils.slack_bot.section import TypeText


class Image:
Expand All @@ -15,13 +15,13 @@ def __init__(self, image_url: str, alt_text: str) -> None:
"""
self.image = {"type": "image", "image_url": image_url, "alt_text": alt_text}

def add_title(self, type_text: Type_text, title: str, allow_emoji: bool = False):
def add_title(self, type_text: TypeText, title: str, allow_emoji: bool = False):
"""
Add a title to the image
Parameters
----------
type_text : Type_text
type_text : TypeText
type of the title
title : str
text of the title
Expand Down
35 changes: 22 additions & 13 deletions fink_utils/slack_bot/msg_builder.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
from fink_utils.slack_bot.section import Section, Type_text
from fink_utils.slack_bot.section import Section, TypeText
from fink_utils.slack_bot.image import Image
from typing import List, Union
from typing_extensions import Self
from fink_utils.slack_bot.rich_text.rich_text import RichText


class Message:
def __init__(self):
self.blocks = {"blocks": []}

def add_elements(
self, elements: Union[Section, Image, List[Union[Image, Section]]]
):
self,
elements: Union[
Section, Image, RichText, List[Union[Image, Section, RichText]]
],
) -> Self:
"""
Add elements in the message
Expand All @@ -18,27 +23,32 @@ def add_elements(
elements : Union[Section, Image, List[Union[Image, Section]]]
elements to add in the message.
Can be a single elements or a list of elements
Returns
-------
Self
return instance of the current object to chain add operation
"""
if type(elements) is list:
self.blocks["blocks"] += [el.get_element() for el in elements]
else:
self.blocks["blocks"].append(elements.get_element())
return self

def add_divider(self):
def add_divider(self) -> Self:
"""
Add a divider in the message
"""
self.blocks["blocks"].append({"type": "divider"})
return self

def add_header(
self, type_txt: Type_text, header_txt: str, allow_emoji: bool = False
):
def add_header(self, header_txt: str, allow_emoji: bool = False) -> Self:
"""
Add a header in the message
Parameters
----------
type_txt : Type_text
type_txt : TypeText
type of the header text
header_txt : str
header text
Expand All @@ -49,12 +59,13 @@ def add_header(
{
"type": "header",
"text": {
"type": type_txt.value,
"type": TypeText.PLAIN_TXT.value,
"text": header_txt,
"emoji": allow_emoji,
},
}
)
return self


class Divider:
Expand All @@ -69,13 +80,11 @@ def get_element(self):


class Header:
def __init__(
self, type_txt: Type_text, header_txt: str, allow_emoji: bool = False
) -> None:
def __init__(self, header_txt: str, allow_emoji: bool = False) -> None:
self.header = {
"type": "header",
"text": {
"type": type_txt.value,
"type": TypeText.PLAIN_TXT.value,
"text": header_txt,
"emoji": allow_emoji,
},
Expand Down
Empty file.
60 changes: 60 additions & 0 deletions fink_utils/slack_bot/rich_text/rich_list.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
from fink_utils.slack_bot.rich_text.rich_text import RichElement
from fink_utils.slack_bot.rich_text.rich_section import SectionElement
from enum import Enum
from typing import List, Union
from typing_extensions import Self


class RichListStyle(Enum):
BULLET = "bullet"
ORDERED = "ordered"


class RichList(RichElement):
def __init__(
self,
style: RichListStyle = RichListStyle.BULLET,
indent:int=None,
offset:int=None,
border:int=None,
) -> None:
"""
A class representing a list
Parameters
----------
style : RichListStyle, optional
style of the list, by default RichListStyle.BULLET
indent : int, optional
list indent in pixels, by default None
offset : int, optional
number of pixels to offset the list, by default None
border : int, optional
border thickness in pixels, by default None
"""
super().__init__()
self.rich_list = {
"type": "rich_text_list",
"style": style.value,
"elements": [],
}
if indent is not None:
self.rich_list["indent"] = indent

if offset is not None:
self.rich_list["offset"] = offset

if border is not None:
self.rich_list["border"] = border

def get_element(self):
return self.rich_list

def add_elements(
self, elements: Union[SectionElement, List[SectionElement]]
) -> Self:
if type(elements) is list:
self.rich_list["elements"] += [el.get_element() for el in elements]
else:
self.rich_list["elements"].append(elements.get_element())
return self
32 changes: 32 additions & 0 deletions fink_utils/slack_bot/rich_text/rich_preformatted.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from fink_utils.slack_bot.rich_text.rich_text import RichElement
from typing import List, Union
from typing_extensions import Self
from fink_utils.slack_bot.rich_text.rich_text_element import RichTextElement


class RichPreformatted(RichElement):
def __init__(self, border:int=None) -> None:
"""
A class representing a block surrounded by a border
Parameters
----------
border : _type_, optional
border thickness in pixels, by default None
"""
super().__init__()
self.preform = {"type": "rich_text_preformatted", "elements": []}
if border is not None:
self.preform["border"] = border

def get_element(self):
return self.preform

def add_elements(
self, elements: Union[RichTextElement, List[RichTextElement]]
) -> Self:
if type(elements) is list:
self.preform["elements"] += [el.get_element() for el in elements]
else:
self.preform["elements"].append(elements.get_element())
return self
32 changes: 32 additions & 0 deletions fink_utils/slack_bot/rich_text/rich_quote.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from fink_utils.slack_bot.rich_text.rich_text import RichElement
from typing import List, Union
from typing_extensions import Self
from fink_utils.slack_bot.rich_text.rich_text_element import RichTextElement


class RichQuote(RichElement):
def __init__(self, border:int=None) -> None:
"""
A class representing a quote
Parameters
----------
border : int, optional
border thickness in pixels, by default None
"""
super().__init__()
self.quote = {"type": "rich_text_quote", "elements": []}
if border is not None:
self.quote["border"] = border

def get_element(self):
return self.quote

def add_elements(
self, elements: Union[RichTextElement, List[RichTextElement]]
) -> Self:
if type(elements) is list:
self.quote["elements"] += [el.get_element() for el in elements]
else:
self.quote["elements"].append(elements.get_element())
return self
25 changes: 25 additions & 0 deletions fink_utils/slack_bot/rich_text/rich_section.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from fink_utils.slack_bot.rich_text.rich_text import RichElement
from fink_utils.slack_bot.rich_text.rich_text_element import RichTextElement
from typing import List, Union
from typing_extensions import Self


class SectionElement(RichElement):
def __init__(self) -> None:
"""
A class representing a section of a rich text
"""
super().__init__()
self.section = {"type": "rich_text_section", "elements": []}

def add_elements(
self, elements: Union[RichTextElement, List[RichTextElement]]
) -> Self:
if type(elements) is list:
self.section["elements"] += [el.get_element() for el in elements]
else:
self.section["elements"].append(elements.get_element())
return self

def get_element(self) -> dict:
return self.section
Loading

0 comments on commit 17704ff

Please sign in to comment.