diff --git a/community/bot.py b/community/bot.py
index 8cef124..8d9ffa3 100644
--- a/community/bot.py
+++ b/community/bot.py
@@ -430,7 +430,18 @@ class CommunityBot(Plugin):
rooms.append(evt.state_key)
except Exception as e:
self.log.error(f"Error getting space roomlist: {e}")
- return rooms
+
+ try:
+ joined_rooms = await self.client.get_joined_rooms()
+ filtered_rooms = [r for r in rooms if r in joined_rooms]
+
+ if len(rooms) != len(filtered_rooms):
+ self.log.info(f"Ignoriere {len(rooms) - len(filtered_rooms)} Räume aus dem Space, da der Bot dort kein Mitglied ist.")
+
+ return filtered_rooms
+ except Exception as e:
+ self.log.error(f"Fehler beim Abgleich der joined_rooms: {e}")
+ return rooms
async def generate_report(self) -> None:
now = int(time.time() * 1000)
@@ -2531,12 +2542,27 @@ class CommunityBot(Plugin):
await evt.mark_read()
if target_room:
- roomlist = [target_room]
+ if target_room.startswith("#"):
+ try:
+ resolved_alias = await self.client.resolve_room_alias(target_room)
+ roomlist = [resolved_alias.room_id]
+ except Exception as e:
+ await evt.respond(f"Fehler: Konnte Alias {target_room} nicht in eine ID auflösen: {e}")
+ return
+ elif target_room.startswith("!"):
+ roomlist = [target_room]
+ else:
+ await evt.respond("Fehler: Der Raum muss mit ! (ID) oder # (Alias) beginnen.")
+ return
target_msg = target_room
else:
roomlist = await self.get_space_roomlist()
target_msg = "space rooms"
+ if not roomlist:
+ await evt.respond("Fehler: Keine gültigen Räume zum Aktualisieren gefunden. Ist der Bot in den Zielräumen Mitglied?")
+ return
+
msg = await evt.respond(
f"Syncing power levels from parent room to {target_msg}..."
)
@@ -2579,10 +2605,14 @@ class CommunityBot(Plugin):
f"Parent room is modern (v{parent_version}), bot is not creator, power level set to 1000"
)
else:
- # In legacy parent rooms, ensure bot has highest power level
- user_power_levels[self.client.mxid] = 1000
+ # In legacy parent rooms, keep the bot at its actual current PL (cannot self-promote)
+ bot_pl = parent_power_levels.users.get(
+ self.client.mxid,
+ getattr(parent_power_levels, "users_default", 0),
+ )
+ user_power_levels[self.client.mxid] = bot_pl
self.log.info(
- f"Parent room is legacy (v{parent_version}), bot power level set to 1000"
+ f"Parent room is legacy (v{parent_version}), bot power level retained at {bot_pl}"
)
for room in roomlist:
@@ -2695,20 +2725,15 @@ class CommunityBot(Plugin):
else:
mapped_power_levels[user] = level
- # Handle bot power level based on whether it's a creator in the parent
- if self.client.mxid in parent_creators:
- # Bot is a creator in parent, but this is a legacy room
- # Set bot to highest power level since creators don't have unlimited power in legacy rooms
- mapped_power_levels[self.client.mxid] = 1000
- self.log.info(
- f"Bot is creator in parent but target is legacy room - setting power level to 1000"
- )
- else:
- # Bot is not a creator in parent, set to highest power level
- mapped_power_levels[self.client.mxid] = 1000
- self.log.info(
- f"Bot is not creator in parent, setting power level to 1000 in legacy target room"
- )
+ # In a legacy target room, keep the bot at its actual current PL (cannot self-promote)
+ bot_pl = room_power_levels.users.get(
+ self.client.mxid,
+ getattr(room_power_levels, "users_default", 0),
+ )
+ mapped_power_levels[self.client.mxid] = bot_pl
+ self.log.info(
+ f"Target room is legacy, bot power level retained at {bot_pl} in {roomname or room}"
+ )
room_power_levels.users = mapped_power_levels
@@ -2717,7 +2742,18 @@ class CommunityBot(Plugin):
self.log.info(
f"Both rooms are legacy - direct power level transfer"
)
- room_power_levels.users = user_power_levels
+ # Capture the bot's current PL in this child room before overwriting.
+ # This is always the value we use — the bot cannot self-promote above
+ # its current PL, and we must not demote it if it's higher than the parent.
+ child_bot_pl = room_power_levels.users.get(
+ self.client.mxid,
+ getattr(room_power_levels, "users_default", 0),
+ )
+ room_power_levels.users = user_power_levels.copy()
+ room_power_levels.users[self.client.mxid] = child_bot_pl
+ self.log.info(
+ f"Both rooms legacy: bot PL retained at {child_bot_pl} in {roomname or room}"
+ )
# Send the updated power levels to this room
await self.client.send_state_event(
@@ -2751,7 +2787,7 @@ class CommunityBot(Plugin):
else:
results += f"Mapping Strategy: Parent room is legacy (v{parent_version}), using traditional power level system.
"
results += (
- "• Bot power level set to 1000 for administrative control
"
+ "• Bot power level retained at its current level in legacy rooms
"
)
results += "• Direct power level transfer to legacy child rooms
"
results += "• Modern child rooms preserve their creator power levels
"