Skip to content

Commit 3d29127

Browse files
committed
Add wrapper for /context
1 parent 16d6ec0 commit 3d29127

File tree

3 files changed

+56
-1
lines changed

3 files changed

+56
-1
lines changed

mautrix/client/api/events.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
ContentURI,
1717
Event,
1818
EventContent,
19+
EventContext,
1920
EventID,
2021
EventType,
2122
FilterID,
@@ -125,6 +126,48 @@ async def get_event(self, room_id: RoomID, event_id: EventID) -> Event:
125126
except SerializerError as e:
126127
raise MatrixResponseError("Invalid event in response") from e
127128

129+
async def get_event_context(
130+
self,
131+
room_id: RoomID,
132+
event_id: EventID,
133+
limit: int | None = 10,
134+
filter: RoomEventFilter | None = None,
135+
) -> EventContext:
136+
"""
137+
Get a number of events that happened just before and after the specified event.
138+
This allows clients to get the context surrounding an event, as well as get the state at
139+
an event and paginate in either direction.
140+
141+
Args:
142+
room_id: The room to get events from.
143+
event_id: The event to get context around.
144+
limit: The maximum number of events to return. The limit applies to the total number of
145+
events before and after the requested event. A limit of 0 means no other events
146+
are returned, while 2 means one event before and one after are returned.
147+
filter: A JSON RoomEventFilter_ to filter returned events with.
148+
149+
Returns:
150+
The event itself, up to ``limit/2`` events before and after the event, the room state
151+
at the event, and pagination tokens to scroll up and down.
152+
153+
.. _RoomEventFilter:
154+
https://spec.matrix.org/v1.1/client-server-api/#filtering
155+
"""
156+
query_params = {}
157+
if limit is not None:
158+
query_params["limit"] = str(limit)
159+
if filter is not None:
160+
query_params["filter"] = (
161+
filter.serialize() if isinstance(filter, Serializable) else filter
162+
)
163+
resp = await self.api.request(
164+
Method.GET,
165+
Path.v3.rooms[room_id].context[event_id],
166+
query_params=query_params,
167+
metrics_method="get_event_context",
168+
)
169+
return EventContext.deserialize(resp)
170+
128171
async def get_state_event(
129172
self,
130173
room_id: RoomID,

mautrix/types/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@
144144
DeviceLists,
145145
DeviceOTKCount,
146146
DirectoryPaginationToken,
147+
EventContext,
147148
PaginatedMessages,
148149
PaginationDirection,
149150
RoomAliasInfo,
@@ -345,6 +346,7 @@
345346
"DeviceLists",
346347
"DeviceOTKCount",
347348
"DirectoryPaginationToken",
349+
"EventContext",
348350
"PaginatedMessages",
349351
"PaginationDirection",
350352
"RoomAliasInfo",

mautrix/types/misc.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from attr import dataclass
1010
import attr
1111

12-
from .event import Event
12+
from .event import Event, StateEvent
1313
from .primitive import BatchID, ContentURI, EventID, RoomAlias, RoomID, SyncToken, UserID
1414
from .util import SerializableAttrs
1515

@@ -107,6 +107,16 @@ class RoomDirectoryResponse(SerializableAttrs):
107107
)
108108

109109

110+
@dataclass
111+
class EventContext(SerializableAttrs):
112+
end: SyncToken
113+
start: SyncToken
114+
event: Event
115+
events_after: List[Event]
116+
events_before: List[Event]
117+
state: List[StateEvent]
118+
119+
110120
@dataclass
111121
class BatchSendResponse(SerializableAttrs):
112122
state_event_ids: List[EventID]

0 commit comments

Comments
 (0)