From 29823e87d54e7cc4531a50a2f33e9b98ea2a1d5f Mon Sep 17 00:00:00 2001 From: inference-bot Date: Fri, 2 Oct 2026 13:03:14 -0600 Subject: [PATCH] =?UTF-8?q?Matrix=20mxid=20lookup:=20paginate=20Cloudron?= =?UTF-8?q?=20users=20API=20(25/page)=20=E2=80=94=20was=20missing=20page?= =?UTF-8?q?=202+?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/main.py | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/app/main.py b/app/main.py index 9240299..ef67890 100644 --- a/app/main.py +++ b/app/main.py @@ -902,14 +902,25 @@ async def matrix_member_mxids(client: httpx.AsyncClient): """ extra = [m.strip() for m in os.environ.get("MATRIX_EXTRA_MXIDS", "").split(",") if m.strip()] seen: set[str] = set() - r = await client.get( - f"{CLOUDRON_API}/api/v1/users", - headers=cloudron_headers(), - ) - users = ( - {u["email"].lower(): u["username"] for u in r.json().get("users", [])} - if r.status_code == 200 else {} - ) + # Cloudron paginates /api/v1/users at 25/page — walk every page. + users: dict[str, str] = {} + page = 1 + while True: + r = await client.get( + f"{CLOUDRON_API}/api/v1/users", + params={"page": page}, + headers=cloudron_headers(), + ) + if r.status_code != 200: + logger.warning("Cloudron users lookup page %s failed: %s", page, r.status_code) + break + batch = r.json().get("users", []) + for u in batch: + if u.get("email") and u.get("username"): + users[u["email"].lower()] = u["username"] + if len(batch) < 25: + break + page += 1 for email in await get_active_member_emails(): username = users.get(email.lower()) if username: