Make streamer names clickable in notifications
This commit is contained in:
@@ -3,6 +3,7 @@ from textwrap import dedent
|
||||
import requests
|
||||
|
||||
from TwitchChannelPointsMiner.classes.Settings import Events
|
||||
from TwitchChannelPointsMiner.classes.NotificationFormatter import format_streamer_links_markdown
|
||||
|
||||
|
||||
class Discord(object):
|
||||
@@ -17,7 +18,7 @@ class Discord(object):
|
||||
requests.post(
|
||||
url=self.webhook_api,
|
||||
data={
|
||||
"content": dedent(message),
|
||||
"content": format_streamer_links_markdown(dedent(message)),
|
||||
"username": "Twitch Channel Points Miner",
|
||||
"avatar_url": "https://i.imgur.com/X9fEkhT.png",
|
||||
},
|
||||
|
||||
@@ -5,6 +5,7 @@ import requests
|
||||
from urllib.parse import quote
|
||||
|
||||
from TwitchChannelPointsMiner.classes.Settings import Events
|
||||
from TwitchChannelPointsMiner.classes.NotificationFormatter import format_streamer_links_html
|
||||
|
||||
|
||||
class Matrix(object):
|
||||
@@ -35,6 +36,8 @@ class Matrix(object):
|
||||
url=f"https://{self.homeserver}/_matrix/client/r0/rooms/{self.room_id}/send/m.room.message?access_token={self.access_token}",
|
||||
json={
|
||||
"body": dedent(message),
|
||||
"format": "org.matrix.custom.html",
|
||||
"formatted_body": format_streamer_links_html(dedent(message)),
|
||||
"msgtype": "m.text"
|
||||
}
|
||||
)
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
import html
|
||||
import re
|
||||
|
||||
from TwitchChannelPointsMiner.constants import URL
|
||||
|
||||
|
||||
STREAMER_USERNAME_RE = re.compile(
|
||||
r"(?P<prefix>Streamer\(username=)(?P<username>[a-z0-9_]{3,25})(?P<suffix>,)"
|
||||
)
|
||||
LESS_STREAMER_RE = re.compile(
|
||||
r"\b(?P<username>[a-z0-9_]{3,25})(?P<suffix> \([^()]+ points\))"
|
||||
)
|
||||
|
||||
|
||||
def streamer_url(username: str) -> str:
|
||||
return f"{URL}/{username}"
|
||||
|
||||
|
||||
def format_streamer_links_html(message: str) -> str:
|
||||
return _format_streamer_links(message, _html_link, html.escape)
|
||||
|
||||
|
||||
def format_streamer_links_markdown(message: str) -> str:
|
||||
return _format_streamer_links(message, _markdown_link, lambda value: value)
|
||||
|
||||
|
||||
def _format_streamer_links(message: str, link_factory, text_escape):
|
||||
matches = sorted(_iter_streamer_matches(message), key=lambda item: item[0])
|
||||
if not matches:
|
||||
return text_escape(message)
|
||||
|
||||
parts = []
|
||||
cursor = 0
|
||||
for match in matches:
|
||||
start, end, username, prefix, suffix = match
|
||||
if start < cursor:
|
||||
continue
|
||||
|
||||
parts.append(text_escape(message[cursor:start]))
|
||||
parts.append(text_escape(prefix))
|
||||
parts.append(link_factory(username))
|
||||
parts.append(text_escape(suffix))
|
||||
cursor = end
|
||||
|
||||
parts.append(text_escape(message[cursor:]))
|
||||
return "".join(parts)
|
||||
|
||||
|
||||
def _iter_streamer_matches(message: str):
|
||||
for match in STREAMER_USERNAME_RE.finditer(message):
|
||||
yield (
|
||||
match.start(),
|
||||
match.end(),
|
||||
match.group("username"),
|
||||
match.group("prefix"),
|
||||
match.group("suffix"),
|
||||
)
|
||||
|
||||
for match in LESS_STREAMER_RE.finditer(message):
|
||||
yield (
|
||||
match.start(),
|
||||
match.end(),
|
||||
match.group("username"),
|
||||
"",
|
||||
match.group("suffix"),
|
||||
)
|
||||
|
||||
|
||||
def _html_link(username: str) -> str:
|
||||
escaped_username = html.escape(username)
|
||||
escaped_url = html.escape(streamer_url(username), quote=True)
|
||||
return f'<a href="{escaped_url}">{escaped_username}</a>'
|
||||
|
||||
|
||||
def _markdown_link(username: str) -> str:
|
||||
return f"[{username}]({streamer_url(username)})"
|
||||
@@ -3,6 +3,7 @@ from textwrap import dedent
|
||||
import requests
|
||||
|
||||
from TwitchChannelPointsMiner.classes.Settings import Events
|
||||
from TwitchChannelPointsMiner.classes.NotificationFormatter import format_streamer_links_html
|
||||
|
||||
|
||||
class Pushover(object):
|
||||
@@ -22,7 +23,8 @@ class Pushover(object):
|
||||
data={
|
||||
"user": self.userkey,
|
||||
"token": self.token,
|
||||
"message": dedent(message),
|
||||
"message": format_streamer_links_html(dedent(message)),
|
||||
"html": 1,
|
||||
"title": "Twitch Channel Points Miner",
|
||||
"priority": self.priority,
|
||||
"sound": self.sound,
|
||||
|
||||
@@ -3,6 +3,7 @@ from textwrap import dedent
|
||||
import requests
|
||||
|
||||
from TwitchChannelPointsMiner.classes.Settings import Events
|
||||
from TwitchChannelPointsMiner.classes.NotificationFormatter import format_streamer_links_html
|
||||
|
||||
|
||||
class Telegram(object):
|
||||
@@ -22,7 +23,8 @@ class Telegram(object):
|
||||
url=self.telegram_api,
|
||||
data={
|
||||
"chat_id": self.chat_id,
|
||||
"text": dedent(message),
|
||||
"text": format_streamer_links_html(dedent(message)),
|
||||
"parse_mode": "HTML",
|
||||
"disable_web_page_preview": True, # include link to twitch streamer?
|
||||
"disable_notification": self.disable_notification, # no sound, notif just in tray
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user