sync: invite members to configured MATRIX_INVITE_ROOMS (Skillshare)
sync_matrix_space() now invites every active member to the rooms in member_invite_rooms(): MATRIX_INVITE_ROOMS when set, else the co-op Space + General room; legacy MATRIX_EXTRA_ROOMS is still appended. The set is explicit configuration, never "every child of the Space", so operator-only rooms are not pushed at members. Skillshare (!NSPfCdVP7TWTtFoAz1TxVOcqnoDIpMoJDiPb_XS79ys) was missing from the invite set, so no member who joined after it was created was ever told about it; including it here makes the nightly sweep self-heal.
This commit is contained in:
1 parent
ea648aab95
commit
8bcb7ff049
1 file changed
+42
-10
+42
-10
@@ -318,10 +318,16 @@ MATRIX_HOMESERVER = os.environ.get("MATRIX_HOMESERVER", "https://matrix.inferenc
|
|||||||
MATRIX_BOT_TOKEN = os.environ.get("MATRIX_BOT_TOKEN", "")
|
MATRIX_BOT_TOKEN = os.environ.get("MATRIX_BOT_TOKEN", "")
|
||||||
MATRIX_SPACE_ID = os.environ.get("MATRIX_SPACE_ID", "")
|
MATRIX_SPACE_ID = os.environ.get("MATRIX_SPACE_ID", "")
|
||||||
MATRIX_GENERAL_ROOM = os.environ.get("MATRIX_GENERAL_ROOM", "")
|
MATRIX_GENERAL_ROOM = os.environ.get("MATRIX_GENERAL_ROOM", "")
|
||||||
# Additional member-facing rooms that every member gets invited to (comma-separated
|
# The explicit set of rooms every active member is invited to (comma-separated
|
||||||
# room IDs). Restricted rooms are NOT discoverable over federation until a member
|
# room IDs). This is authoritative configuration and is deliberately NOT derived
|
||||||
# has joined (the space hierarchy omits them for remote servers), so new rooms need
|
# from the Space's children — some child rooms (operator/admin-only) must never
|
||||||
# an explicit invite pass — either here or a one-off script.
|
# be pushed at every member. When unset, sync_matrix_space() falls back to the
|
||||||
|
# co-op Space + General room. Restricted rooms are NOT discoverable over
|
||||||
|
# federation until a member has joined (the space hierarchy omits them for remote
|
||||||
|
# servers), so member-facing rooms need this explicit invite pass.
|
||||||
|
MATRIX_INVITE_ROOMS = [r.strip() for r in os.environ.get("MATRIX_INVITE_ROOMS", "").split(",") if r.strip()]
|
||||||
|
# Legacy alias kept for compatibility: extra member-facing rooms appended to the
|
||||||
|
# invite set above (superseded by MATRIX_INVITE_ROOMS).
|
||||||
MATRIX_EXTRA_ROOMS = [r.strip() for r in os.environ.get("MATRIX_EXTRA_ROOMS", "").split(",") if r.strip()]
|
MATRIX_EXTRA_ROOMS = [r.strip() for r in os.environ.get("MATRIX_EXTRA_ROOMS", "").split(",") if r.strip()]
|
||||||
LOOMIO_GROUP_ID = os.environ.get("LOOMIO_GROUP_ID", "")
|
LOOMIO_GROUP_ID = os.environ.get("LOOMIO_GROUP_ID", "")
|
||||||
# Operator accounts that must always remain in the Loomio group (never removed
|
# Operator accounts that must always remain in the Loomio group (never removed
|
||||||
@@ -1317,9 +1323,38 @@ async def loomio_fix_usernames(client: httpx.AsyncClient) -> dict:
|
|||||||
return {"fixed": fixed, "skipped": skipped}
|
return {"fixed": fixed, "skipped": skipped}
|
||||||
|
|
||||||
|
|
||||||
async def sync_matrix_space() -> dict:
|
def member_invite_rooms() -> list[str]:
|
||||||
"""Invite every active member to the co-op Matrix Space (and General room).
|
"""The explicit set of rooms every active member of the co-op is invited to.
|
||||||
|
|
||||||
|
MATRIX_INVITE_ROOMS is authoritative when set; otherwise we fall back to the
|
||||||
|
co-op Space and General room. The legacy MATRIX_EXTRA_ROOMS entries are
|
||||||
|
appended (deduped) so existing configuration keeps working. This is
|
||||||
|
deliberately explicit configuration and never "every child of the Space":
|
||||||
|
operator/admin-only child rooms must not be pushed at every member.
|
||||||
|
"""
|
||||||
|
if MATRIX_INVITE_ROOMS:
|
||||||
|
rooms = list(MATRIX_INVITE_ROOMS)
|
||||||
|
else:
|
||||||
|
rooms = [MATRIX_SPACE_ID]
|
||||||
|
if MATRIX_GENERAL_ROOM:
|
||||||
|
rooms.append(MATRIX_GENERAL_ROOM)
|
||||||
|
for r in MATRIX_EXTRA_ROOMS:
|
||||||
|
if r and r not in rooms:
|
||||||
|
rooms.append(r)
|
||||||
|
seen: set[str] = set()
|
||||||
|
out: list[str] = []
|
||||||
|
for r in rooms:
|
||||||
|
if r and r not in seen:
|
||||||
|
seen.add(r)
|
||||||
|
out.append(r)
|
||||||
|
return out
|
||||||
|
|
||||||
|
|
||||||
|
async def sync_matrix_space() -> dict:
|
||||||
|
"""Invite every active member to the configured co-op Matrix rooms.
|
||||||
|
|
||||||
|
The room set comes from member_invite_rooms(): MATRIX_INVITE_ROOMS when set,
|
||||||
|
else the co-op Space + General room, plus the legacy MATRIX_EXTRA_ROOMS.
|
||||||
Members log in via Cloudron SSO, so their local MXID is
|
Members log in via Cloudron SSO, so their local MXID is
|
||||||
@<username>:inference.coop. We resolve the Cloudron username for each
|
@<username>:inference.coop. We resolve the Cloudron username for each
|
||||||
active member email and invite them if not already in the space.
|
active member email and invite them if not already in the space.
|
||||||
@@ -1371,10 +1406,7 @@ async def sync_matrix_space() -> dict:
|
|||||||
async for email, mxid in matrix_member_mxids(client):
|
async for email, mxid in matrix_member_mxids(client):
|
||||||
if not mxid or mxid in joined or mxid in invited:
|
if not mxid or mxid in joined or mxid in invited:
|
||||||
continue
|
continue
|
||||||
await invite(mxid, MATRIX_SPACE_ID)
|
for room in member_invite_rooms():
|
||||||
if MATRIX_GENERAL_ROOM:
|
|
||||||
await invite(mxid, MATRIX_GENERAL_ROOM)
|
|
||||||
for room in MATRIX_EXTRA_ROOMS:
|
|
||||||
await invite(mxid, room)
|
await invite(mxid, room)
|
||||||
invited_count += 1
|
invited_count += 1
|
||||||
if invited_count:
|
if invited_count:
|
||||||
|
|||||||
Reference in new issue
Block a user