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: