104 lines
3.3 KiB
Python
104 lines
3.3 KiB
Python
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
|
|
)
|