diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 50d0c15..8c8a44e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -10,7 +10,7 @@ default: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY build frontend: - image: node:22-alpine + image: node:24-alpine stage: build frontend before_script: [] variables: diff --git a/Dockerfile b/Dockerfile index 2c6bad4..ae35fbb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,9 @@ -FROM node:22 AS frontend-builder +FROM node:24 AS frontend-builder COPY ./maubot/management/frontend /frontend RUN cd /frontend && yarn --prod && yarn build -FROM alpine:3.21 +FROM alpine:3.22 RUN apk add --no-cache \ python3 py3-pip py3-setuptools py3-wheel \ diff --git a/Dockerfile.ci b/Dockerfile.ci index 9712a16..fb76f50 100644 --- a/Dockerfile.ci +++ b/Dockerfile.ci @@ -1,4 +1,4 @@ -FROM alpine:3.21 +FROM alpine:3.22 RUN apk add --no-cache \ python3 py3-pip py3-setuptools py3-wheel \ diff --git a/maubot/matrix.py b/maubot/matrix.py index 7f1ec0f..3763533 100644 --- a/maubot/matrix.py +++ b/maubot/matrix.py @@ -15,7 +15,7 @@ # along with this program. If not, see . from __future__ import annotations -from typing import Awaitable +from typing import Any, Awaitable from html import escape import asyncio @@ -88,6 +88,7 @@ class MaubotMessageEvent(MessageEvent): reply: bool | str = False, in_thread: bool | None = None, edits: EventID | MessageEvent | None = None, + extra_content: dict[str, Any] | None = None, ) -> EventID: """ Respond to the message. @@ -107,6 +108,7 @@ class MaubotMessageEvent(MessageEvent): the root if necessary. edits: An event ID or MessageEvent to edit. If set, the reply and in_thread parameters are ignored, as edits can't change the reply or thread status. + extra_content: Extra content to add to the event. Returns: The ID of the response event. @@ -143,6 +145,9 @@ class MaubotMessageEvent(MessageEvent): ) else: content.set_reply(self) + if extra_content: + for k, v in extra_content.items(): + content[k] = v return await self.client.send_message_event(self.room_id, event_type, content) def reply( @@ -152,6 +157,7 @@ class MaubotMessageEvent(MessageEvent): markdown: bool = True, allow_html: bool = False, in_thread: bool | None = None, + extra_content: dict[str, Any] | None = None, ) -> Awaitable[EventID]: """ Reply to the message. The parameters are the same as :meth:`respond`, @@ -169,6 +175,7 @@ class MaubotMessageEvent(MessageEvent): thread. If set to ``False``, the response will never be in a thread. If set to ``True``, the response will always be in a thread, creating one with this event as the root if necessary. + extra_content: Extra content to add to the event. Returns: The ID of the response event. @@ -180,6 +187,7 @@ class MaubotMessageEvent(MessageEvent): reply=True, in_thread=in_thread, allow_html=allow_html, + extra_content=extra_content, ) def mark_read(self) -> Awaitable[None]: