From 6cf0255f01d66304cd900e285b46f9ac0b920164 Mon Sep 17 00:00:00 2001 From: Eddy de Vink Date: Tue, 1 Sep 2026 18:07:34 +0200 Subject: [PATCH] Add request timeout and cap output; point instance at Roomsoverview Project space; v1.0.4 --- maubot.yaml | 2 +- roomsoverview.mbp | Bin 3269 -> 3325 bytes roomsoverview.py | 10 ++++++++-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/maubot.yaml b/maubot.yaml index 9a9c80e..caa892e 100644 --- a/maubot.yaml +++ b/maubot.yaml @@ -1,6 +1,6 @@ maubot: 0.1.0 id: nl.roomsoverview -version: 1.0.3 +version: 1.0.4 license: MIT modules: - roomsoverview diff --git a/roomsoverview.mbp b/roomsoverview.mbp index 65ed30b71e5a923db5b3a55adaba14ad1d15ad9c..75206151c851f750447db9740f389e551c244493 100644 GIT binary patch delta 2817 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 A6951J diff --git a/roomsoverview.py b/roomsoverview.py index 2c28d55..cfd1c55 100644 --- a/roomsoverview.py +++ b/roomsoverview.py @@ -2,10 +2,14 @@ import asyncio from typing import Any, Dict, List, Optional, Tuple from urllib.parse import quote +import aiohttp + from maubot import Plugin, MessageEvent from maubot.handlers import command from mautrix.util.config import BaseProxyConfig, ConfigUpdateHelper +_REQUEST_TIMEOUT = aiohttp.ClientTimeout(total=30) + def _escape_md(text: str) -> str: """Escape markdown-significant characters when embedding user content.""" @@ -38,7 +42,7 @@ class RoomsOverviewPlugin(Plugin): return Config async def _fetch_hierarchy(self, space_id: str) -> Tuple[List[Dict[str, Any]], bool]: - """Fetch the full paginated space hierarchy for a room. + """Fetch the paginated space hierarchy for a room. Uses GET /_matrix/client/v1/rooms/{roomId}/hierarchy, which paginates depth-first over the whole space tree. Retries on 429 @@ -75,7 +79,9 @@ class RoomsOverviewPlugin(Plugin): retries = 0 while True: try: - async with self.http.get(url, params=params, headers=headers) as resp: + async with self.http.get( + url, params=params, headers=headers, timeout=_REQUEST_TIMEOUT + ) as resp: if resp.status == 429: retries += 1 try: