diff --git a/hookshot/tinker-tickets.js b/hookshot/tinker-tickets.js
index 47d29bc..ff22829 100644
--- a/hookshot/tinker-tickets.js
+++ b/hookshot/tinker-tickets.js
@@ -77,4 +77,13 @@ if (event === 'ticket_created') {
html = '[tinker-tickets] event: ' + event + ' ticket #' + id;
}
-result = { version: 'v2', plain: plain, html: html, msgtype: 'm.text' };
+// Explicit mentions (m.mentions): from Synapse 1.164 the legacy push rules
+// that pinged on a user ID or display name in the body are off by default
+// (MSC4210), so the people to notify must be listed here.
+result = {
+ version: 'v2',
+ plain: plain,
+ html: html,
+ msgtype: 'm.text',
+ mentions: { user_ids: notifyUsers }
+};
diff --git a/matrixbot/commands.py b/matrixbot/commands.py
index f704069..8490946 100644
--- a/matrixbot/commands.py
+++ b/matrixbot/commands.py
@@ -2273,7 +2273,9 @@ async def cmd_roast(client: AsyncClient, room_id: str, sender: str, args: str):
f'
{roast}' f'via {_model_label(CREATIVE_MODEL)}' ) - await send_html(client, room_id, plain, html) + # Ping the person being roasted when they were named by Matrix ID. + target_id = target_raw if re.fullmatch(r"@[^\s:]+:[^\s]+", target_raw) else None + await send_html(client, room_id, plain, html, mention_user_ids=[target_id] if target_id else None) # --------------------------------------------------------------------------- diff --git a/matrixbot/utils.py b/matrixbot/utils.py index a7040a2..020a80a 100644 --- a/matrixbot/utils.py +++ b/matrixbot/utils.py @@ -70,17 +70,25 @@ async def send_text(client: AsyncClient, room_id: str, text: str): return resp -async def send_html(client: AsyncClient, room_id: str, plain: str, html: str): +async def send_html( + client: AsyncClient, room_id: str, plain: str, html: str, mention_user_ids: list[str] | None = None +): logger = logging.getLogger("matrixbot") + content = { + "msgtype": "m.text", + "body": plain, + "format": "org.matrix.custom.html", + "formatted_body": html, + } + # Explicit mentions (m.mentions). From Synapse 1.164 a name or user ID in + # the body no longer pings anyone (MSC4210), so a message that should + # notify someone has to say so. + if mention_user_ids: + content["m.mentions"] = {"user_ids": mention_user_ids} resp = await _room_send_trusted( client, room_id, message_type="m.room.message", - content={ - "msgtype": "m.text", - "body": plain, - "format": "org.matrix.custom.html", - "formatted_body": html, - }, + content=content, ) if not isinstance(resp, RoomSendResponse): logger.error("send_html failed: %s", resp)