from typing import Any, Dict, Sequence, List import sys from cmdlets._shared import Cmdlet, CmdletArg, parse_cmdlet_args from helper.logger import log, debug from result_table import ResultTable from helper.file_storage import MatrixStorageBackend from config import save_config, load_config import pipeline as ctx def _run(result: Any, args: Sequence[str], config: Dict[str, Any]) -> int: parsed = parse_cmdlet_args(args, CMDLET) # Initialize backend backend = MatrixStorageBackend() # Get current default room matrix_conf = config.get('storage', {}).get('matrix', {}) current_room_id = matrix_conf.get('room_id') # Fetch rooms debug("Fetching joined rooms from Matrix...") rooms = backend.list_rooms(config) if not rooms: debug("No joined rooms found or Matrix not configured.") return 1 # Handle selection if provided selection = parsed.get("selection") if selection: new_room_id = None selected_room_name = None # Try as index (1-based) try: idx = int(selection) - 1 if 0 <= idx < len(rooms): selected_room = rooms[idx] new_room_id = selected_room['id'] selected_room_name = selected_room['name'] except ValueError: # Try as Room ID for room in rooms: if room['id'] == selection: new_room_id = selection selected_room_name = room['name'] break if new_room_id: # Update config # Load fresh config from disk to avoid saving runtime objects (like WorkerManager) disk_config = load_config() if 'storage' not in disk_config: disk_config['storage'] = {} if 'matrix' not in disk_config['storage']: disk_config['storage']['matrix'] = {} disk_config['storage']['matrix']['room_id'] = new_room_id save_config(disk_config) debug(f"Default Matrix room set to: {selected_room_name} ({new_room_id})") current_room_id = new_room_id else: debug(f"Invalid selection: {selection}") return 1 # Display table table = ResultTable("Matrix Rooms") for i, room in enumerate(rooms): is_default = (room['id'] == current_room_id) row = table.add_row() row.add_column("Default", "*" if is_default else "") row.add_column("Name", room['name']) row.add_column("ID", room['id']) # Set selection args so user can type @N to select # This will run .matrix N table.set_row_selection_args(i, [str(i + 1)]) table.set_source_command(".matrix") # Register results ctx.set_last_result_table_overlay(table, rooms) ctx.set_current_stage_table(table) print(table) return 0 CMDLET = Cmdlet( name=".matrix", aliases=["matrix", "rooms"], summary="List and select default Matrix room", usage=".matrix [selection]", args=[ CmdletArg( name="selection", type="string", description="Index or ID of the room to set as default", required=False ) ], exec=_run )