Groups now tells user if they are in group

This commit is contained in:
Astra Logical 2026-07-22 18:13:55 -04:00
parent 1fc97b6256
commit 595348fbd6

View file

@ -49,10 +49,22 @@ def get_keycloak_client() -> KeycloakAdmin:
verify=True, verify=True,
) )
def get_requestable_groups() -> tuple[bool, str]: def get_requestable_groups(username: str) -> tuple[bool, str]:
"""Fetches available Keycloak groups, filtering out the 'admin' group.""" """Fetches available Keycloak groups, filtering out the 'admin' group, and checks user membership."""
try: try:
kc = get_keycloak_client() kc = get_keycloak_client()
# 1. Fetch User UUID to get their current groups
users = kc.get_users(query={"username": username, "exact": True})
if not users:
# If the user doesn't exist in Keycloak, we just show groups normally
user_group_names = set()
else:
user_id = users[0]["id"]
user_groups = kc.get_user_groups(user_id=user_id)
user_group_names = {g["name"] for g in user_groups}
# 2. Fetch all groups
groups = kc.get_groups() groups = kc.get_groups()
# Filter out 'admin' (case-insensitive) # Filter out 'admin' (case-insensitive)
@ -61,7 +73,15 @@ def get_requestable_groups() -> tuple[bool, str]:
if not valid_groups: if not valid_groups:
return True, "No groups are currently available to request." return True, "No groups are currently available to request."
group_list = "\n".join([f"• `{name}`" for name in valid_groups]) # 3. Format the output list with membership status
group_lines = []
for name in valid_groups:
if name in user_group_names:
group_lines.append(f"• `{name}` *(Already a member)*")
else:
group_lines.append(f"• `{name}`")
group_list = "\n".join(group_lines)
return True, f"**Available Groups:**\n{group_list}" return True, f"**Available Groups:**\n{group_list}"
except KeycloakError as e: except KeycloakError as e:
@ -126,9 +146,13 @@ async def on_message(client: AsyncClient, room: MatrixRoom, event: RoomMessageTe
body = event.body.strip() body = event.body.strip()
# Extract username early so both commands can utilize it
matrix_user = event.sender
kc_username = matrix_user.split(":")[0].lstrip("@")
# --- COMMAND: !groups --- # --- COMMAND: !groups ---
if body.startswith("!groups"): if body.startswith("!groups"):
success, msg = get_requestable_groups() success, msg = get_requestable_groups(kc_username)
await send_message_safe( await send_message_safe(
client, client,
room_id=room.room_id, room_id=room.room_id,