Make streamer names clickable in notifications
GitHub Traffic Count Update Everyday / build (push) Has been cancelled
GitHub Clone Count Update Everyday / build (push) Has been cancelled

This commit is contained in:
2026-07-20 21:36:21 +02:00
parent 72fe2fb4f4
commit f727b46fec
5 changed files with 87 additions and 3 deletions
+2 -1
View File
@@ -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 -1
View File
@@ -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 -1
View File
@@ -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
},