mirror of
https://github.com/caronc/apprise.git
synced 2024-11-24 17:14:00 +01:00
Slack now supports <@userid> in message body (#1134)
This commit is contained in:
parent
da14b3a54f
commit
e289279896
@ -280,6 +280,40 @@ class NotifySlack(NotifyBase):
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
# Formatting requirements are defined here:
|
||||||
|
# https://api.slack.com/docs/message-formatting
|
||||||
|
_re_formatting_map = {
|
||||||
|
# New lines must become the string version
|
||||||
|
r'\r\*\n': '\\n',
|
||||||
|
# Escape other special characters
|
||||||
|
r'&': '&',
|
||||||
|
r'<': '<',
|
||||||
|
r'>': '>',
|
||||||
|
}
|
||||||
|
|
||||||
|
# To notify a channel, one uses <!channel|channel>
|
||||||
|
_re_channel_support = re.compile(
|
||||||
|
r'(?P<match>(?:<|\<)?[ \t]*'
|
||||||
|
r'!(?P<channel>[^| \n]+)'
|
||||||
|
r'(?:[ \t]*\|[ \t]*(?:(?P<val>[^\n]+?)[ \t]*)?(?:>|\>)'
|
||||||
|
r'|(?:>|\>)))', re.IGNORECASE)
|
||||||
|
|
||||||
|
# To notify a user by their ID, one uses <@U6TTX1F9R>
|
||||||
|
_re_user_id_support = re.compile(
|
||||||
|
r'(?P<match>(?:<|\<)?[ \t]*'
|
||||||
|
r'@(?P<userid>[^| \n]+)'
|
||||||
|
r'(?:[ \t]*\|[ \t]*(?:(?P<val>[^\n]+?)[ \t]*)?(?:>|\>)'
|
||||||
|
r'|(?:>|\>)))', re.IGNORECASE)
|
||||||
|
|
||||||
|
# The markdown in slack isn't [desc](url), it's <url|desc>
|
||||||
|
#
|
||||||
|
# To accomodate this, we need to ensure we don't escape URLs that match
|
||||||
|
_re_url_support = re.compile(
|
||||||
|
r'(?P<match>(?:<|\<)?[ \t]*'
|
||||||
|
r'(?P<url>(?:https?|mailto)://[^| \n]+)'
|
||||||
|
r'(?:[ \t]*\|[ \t]*(?:(?P<val>[^\n]+?)[ \t]*)?(?:>|\>)'
|
||||||
|
r'|(?:>|\>)))', re.IGNORECASE)
|
||||||
|
|
||||||
def __init__(self, access_token=None, token_a=None, token_b=None,
|
def __init__(self, access_token=None, token_a=None, token_b=None,
|
||||||
token_c=None, targets=None, include_image=True,
|
token_c=None, targets=None, include_image=True,
|
||||||
include_footer=True, use_blocks=None, **kwargs):
|
include_footer=True, use_blocks=None, **kwargs):
|
||||||
@ -344,39 +378,11 @@ class NotifySlack(NotifyBase):
|
|||||||
None if self.mode is SlackMode.WEBHOOK
|
None if self.mode is SlackMode.WEBHOOK
|
||||||
else self.default_notification_channel)
|
else self.default_notification_channel)
|
||||||
|
|
||||||
# Formatting requirements are defined here:
|
|
||||||
# https://api.slack.com/docs/message-formatting
|
|
||||||
self._re_formatting_map = {
|
|
||||||
# New lines must become the string version
|
|
||||||
r'\r\*\n': '\\n',
|
|
||||||
# Escape other special characters
|
|
||||||
r'&': '&',
|
|
||||||
r'<': '<',
|
|
||||||
r'>': '>',
|
|
||||||
}
|
|
||||||
|
|
||||||
# To notify a channel, one uses <!channel|channel>
|
|
||||||
self._re_channel_support = re.compile(
|
|
||||||
r'(?P<match>(?:<|\<)?[ \t]*'
|
|
||||||
r'!(?P<channel>[^| \n]+)'
|
|
||||||
r'(?:[ \t]*\|[ \t]*(?:(?P<val>[^\n]+?)[ \t]*)?(?:>|\>)'
|
|
||||||
r'|(?:>|\>)))', re.IGNORECASE)
|
|
||||||
|
|
||||||
# The markdown in slack isn't [desc](url), it's <url|desc>
|
|
||||||
#
|
|
||||||
# To accomodate this, we need to ensure we don't escape URLs that match
|
|
||||||
self._re_url_support = re.compile(
|
|
||||||
r'(?P<match>(?:<|\<)?[ \t]*'
|
|
||||||
r'(?P<url>(?:https?|mailto)://[^| \n]+)'
|
|
||||||
r'(?:[ \t]*\|[ \t]*(?:(?P<val>[^\n]+?)[ \t]*)?(?:>|\>)'
|
|
||||||
r'|(?:>|\>)))', re.IGNORECASE)
|
|
||||||
|
|
||||||
# Iterate over above list and store content accordingly
|
# Iterate over above list and store content accordingly
|
||||||
self._re_formatting_rules = re.compile(
|
self._re_formatting_rules = re.compile(
|
||||||
r'(' + '|'.join(self._re_formatting_map.keys()) + r')',
|
r'(' + '|'.join(self._re_formatting_map.keys()) + r')',
|
||||||
re.IGNORECASE,
|
re.IGNORECASE,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Place a thumbnail image inline with the message body
|
# Place a thumbnail image inline with the message body
|
||||||
self.include_image = include_image
|
self.include_image = include_image
|
||||||
|
|
||||||
@ -478,6 +484,20 @@ class NotifySlack(NotifyBase):
|
|||||||
body,
|
body,
|
||||||
re.IGNORECASE)
|
re.IGNORECASE)
|
||||||
|
|
||||||
|
# Support <@userid|desc>, <@channel> entries
|
||||||
|
for match in self._re_user_id_support.findall(body):
|
||||||
|
# Swap back any ampersands previously updaated
|
||||||
|
user = match[1].strip()
|
||||||
|
desc = match[2].strip()
|
||||||
|
|
||||||
|
# Update our string
|
||||||
|
body = re.sub(
|
||||||
|
re.escape(match[0]),
|
||||||
|
'<@{user}|{desc}>'.format(user=user, desc=desc)
|
||||||
|
if desc else '<@{user}>'.format(user=user),
|
||||||
|
body,
|
||||||
|
re.IGNORECASE)
|
||||||
|
|
||||||
# Support <url|desc>, <url> entries
|
# Support <url|desc>, <url> entries
|
||||||
for match in self._re_url_support.findall(body):
|
for match in self._re_url_support.findall(body):
|
||||||
# Swap back any ampersands previously updaated
|
# Swap back any ampersands previously updaated
|
||||||
|
@ -731,6 +731,10 @@ def test_plugin_slack_markdown(mock_get, mock_request):
|
|||||||
Channel Testing
|
Channel Testing
|
||||||
<!channelA>
|
<!channelA>
|
||||||
<!channelA|Description>
|
<!channelA|Description>
|
||||||
|
|
||||||
|
User ID Testing
|
||||||
|
<@U1ZQL9N3Y>
|
||||||
|
<@U1ZQL9N3Y|heheh>
|
||||||
""")
|
""")
|
||||||
|
|
||||||
# Send our notification
|
# Send our notification
|
||||||
@ -752,7 +756,8 @@ def test_plugin_slack_markdown(mock_get, mock_request):
|
|||||||
"\n <https://slack.com?arg=val&arg2=val2|Slack Link>.\n"\
|
"\n <https://slack.com?arg=val&arg2=val2|Slack Link>.\n"\
|
||||||
"We also want to be able to support <https://slack.com> "\
|
"We also want to be able to support <https://slack.com> "\
|
||||||
"links without the\ndescription."\
|
"links without the\ndescription."\
|
||||||
"\n\nChannel Testing\n<!channelA>\n<!channelA|Description>"
|
"\n\nChannel Testing\n<!channelA>\n<!channelA|Description>\n\n"\
|
||||||
|
"User ID Testing\n<@U1ZQL9N3Y>\n<@U1ZQL9N3Y|heheh>"
|
||||||
|
|
||||||
|
|
||||||
@mock.patch('requests.request')
|
@mock.patch('requests.request')
|
||||||
|
Loading…
Reference in New Issue
Block a user