first attempt at diagnostic report command

This commit is contained in:
William Kray
2025-06-29 15:59:05 -07:00
parent f4e4440122
commit fad13d1238
+230
View File
@@ -2374,3 +2374,233 @@ class CommunityBot(Plugin):
error_msg = f"Failed to initialize community: {e}" error_msg = f"Failed to initialize community: {e}"
self.log.error(error_msg) self.log.error(error_msg)
await evt.respond(error_msg, edits=msg) await evt.respond(error_msg, edits=msg)
@community.subcommand(
"doctor",
help="review bot permissions across the space and all rooms to identify potential issues"
)
async def doctor_check(self, evt: MessageEvent) -> None:
if not await self.check_parent_room(evt):
return
if not await self.user_permitted(evt.sender):
await evt.reply("You don't have permission to use this command")
return
msg = await evt.respond("Running diagnostic check...")
try:
report = {
"space": {},
"rooms": {},
"issues": [],
"warnings": []
}
# Check parent space permissions
try:
space_power_levels = await self.client.get_state_event(
self.config["parent_room"], EventType.ROOM_POWER_LEVELS
)
bot_level = space_power_levels.get_user_level(self.client.mxid)
report["space"] = {
"room_id": self.config["parent_room"],
"bot_power_level": bot_level,
"has_admin": bot_level >= 100,
"users_higher_or_equal": [],
"users_equal": [],
"users_higher": []
}
# Check for users with equal or higher power level
for user, level in space_power_levels.users.items():
if user != self.client.mxid and level >= bot_level:
if level == bot_level:
report["space"]["users_equal"].append({
"user": user,
"level": level
})
else:
report["space"]["users_higher"].append({
"user": user,
"level": level
})
report["space"]["users_higher_or_equal"].append({
"user": user,
"level": level
})
if bot_level < 100:
report["issues"].append(f"Bot lacks administrative privileges in parent space (level: {bot_level})")
if report["space"]["users_higher"]:
report["warnings"].append(f"Users with higher power level in parent space: {', '.join([f'{u['user']} ({u['level']})' for u in report['space']['users_higher']])}")
if report["space"]["users_equal"]:
report["warnings"].append(f"Users with equal power level in parent space: {', '.join([f'{u['user']} ({u['level']})' for u in report['space']['users_equal']])}")
except Exception as e:
report["space"] = {
"room_id": self.config["parent_room"],
"error": str(e)
}
report["issues"].append(f"Failed to check parent space permissions: {e}")
# Check all rooms in the space
space_rooms = await self.get_space_roomlist()
for room_id in space_rooms:
try:
# First check if bot is in the room
try:
await self.client.get_state_event(room_id, EventType.ROOM_MEMBER, self.client.mxid)
bot_in_room = True
except Exception:
bot_in_room = False
report["issues"].append(f"Bot is not a member of room '{room_id}' that is part of the space")
report["rooms"][room_id] = {
"room_id": room_id,
"error": "Bot not in room"
}
continue
room_power_levels = await self.client.get_state_event(
room_id, EventType.ROOM_POWER_LEVELS
)
bot_level = room_power_levels.get_user_level(self.client.mxid)
# Get room name if available
room_name = room_id
try:
room_name_event = await self.client.get_state_event(room_id, EventType.ROOM_NAME)
room_name = room_name_event.name
except:
pass
room_report = {
"room_id": room_id,
"room_name": room_name,
"bot_power_level": bot_level,
"has_admin": bot_level >= 100,
"users_higher_or_equal": [],
"users_equal": [],
"users_higher": []
}
# Check for users with equal or higher power level
for user, level in room_power_levels.users.items():
if user != self.client.mxid and level >= bot_level:
if level == bot_level:
room_report["users_equal"].append({
"user": user,
"level": level
})
else:
room_report["users_higher"].append({
"user": user,
"level": level
})
room_report["users_higher_or_equal"].append({
"user": user,
"level": level
})
if bot_level < 100:
report["issues"].append(f"Bot lacks administrative privileges in room '{room_name}' ({room_id}) - level: {bot_level}")
if room_report["users_higher"]:
report["warnings"].append(f"Users with higher power level in room '{room_name}': {', '.join([f'{u['user']} ({u['level']})' for u in room_report['users_higher']])}")
if room_report["users_equal"]:
report["warnings"].append(f"Users with equal power level in room '{room_name}': {', '.join([f'{u['user']} ({u['level']})' for u in room_report['users_equal']])}")
report["rooms"][room_id] = room_report
except Exception as e:
report["rooms"][room_id] = {
"room_id": room_id,
"error": str(e)
}
report["issues"].append(f"Failed to check room {room_id}: {e}")
# Generate response
response = "<h3>🔍 Bot Permission Diagnostic Report</h3>\n\n"
# Space summary
response += "<h4>📋 Parent Space</h4>\n"
if "error" in report["space"]:
response += f"❌ <b>Error:</b> {report['space']['error']}\n\n"
else:
space_status = "" if report["space"]["has_admin"] else ""
response += f"{space_status} <b>Administrative privileges:</b> {'Yes' if report['space']['has_admin'] else 'No'} (level: {report['space']['bot_power_level']})\n"
if report["space"]["users_higher"]:
response += f"⚠️ <b>Users with higher power:</b> {', '.join([f'{u['user']} ({u['level']})' for u in report['space']['users_higher']])}\n"
if report["space"]["users_equal"]:
response += f"⚠️ <b>Users with equal power:</b> {', '.join([f'{u['user']} ({u['level']})' for u in report['space']['users_equal']])}\n"
response += "\n"
# Rooms summary
response += f"<h4>🏠 Rooms in Space ({len(report['rooms'])} total)</h4>\n"
admin_rooms = 0
non_admin_rooms = 0
error_rooms = 0
not_in_room_count = 0
for room_id, room_data in report["rooms"].items():
if "error" in room_data:
error_rooms += 1
if room_data["error"] == "Bot not in room":
not_in_room_count += 1
response += f"❌ <b>{room_data.get('room_name', room_id)}:</b> Bot not in room\n"
else:
response += f"❌ <b>{room_data.get('room_name', room_id)}:</b> Error - {room_data['error']}\n"
else:
if room_data["has_admin"]:
admin_rooms += 1
status = ""
else:
non_admin_rooms += 1
status = ""
response += f"{status} <b>{room_data['room_name']}:</b> Admin: {'Yes' if room_data['has_admin'] else 'No'} (level: {room_data['bot_power_level']})\n"
if room_data["users_higher"]:
response += f" ⚠️ Higher power users: {', '.join([f'{u['user']} ({u['level']})' for u in room_data['users_higher']])}\n"
if room_data["users_equal"]:
response += f" ⚠️ Equal power users: {', '.join([f'{u['user']} ({u['level']})' for u in room_data['users_equal']])}\n"
response += "\n"
response += f"<h4>📊 Summary</h4>\n"
response += f"• Parent space: {'✅ Admin' if report['space'].get('has_admin', False) else '❌ No admin'}\n"
response += f"• Rooms with admin: {admin_rooms}\n"
response += f"• Rooms without admin: {non_admin_rooms}\n"
if not_in_room_count > 0:
response += f"• Rooms bot not in: {not_in_room_count}\n"
if error_rooms > 0:
response += f"• Rooms with errors: {error_rooms}\n"
response += "\n"
# Issues and warnings
if report["issues"]:
response += f"<h4>🚨 Critical Issues</h4>\n"
for issue in report["issues"]:
response += f"{issue}\n"
response += "\n"
if report["warnings"]:
response += f"<h4>⚠️ Warnings</h4>\n"
for warning in report["warnings"]:
response += f"{warning}\n"
response += "\n"
if not report["issues"] and not report["warnings"]:
response += f"<h4>✅ All Clear</h4>\n"
response += "No permission issues detected. The bot should be able to manage all rooms and users effectively.\n"
await evt.respond(response, edits=msg, allow_html=True)
except Exception as e:
error_msg = f"Failed to run diagnostic check: {e}"
self.log.error(error_msg)
await evt.respond(error_msg, edits=msg)