fdsfjlk
This commit is contained in:
@@ -9,7 +9,7 @@ from urllib.parse import quote
|
||||
|
||||
import requests
|
||||
|
||||
from ProviderCore.base import FileProvider
|
||||
from ProviderCore.base import Provider
|
||||
|
||||
|
||||
_MATRIX_INIT_CHECK_CACHE: Dict[str, Tuple[bool, Optional[str]]] = {}
|
||||
@@ -50,7 +50,7 @@ def _matrix_health_check(*, homeserver: str, access_token: Optional[str]) -> Tup
|
||||
return False, str(exc)
|
||||
|
||||
|
||||
class Matrix(FileProvider):
|
||||
class Matrix(Provider):
|
||||
"""File provider for Matrix (Element) chat rooms."""
|
||||
|
||||
def __init__(self, config: Optional[Dict[str, Any]] = None):
|
||||
@@ -208,3 +208,82 @@ class Matrix(FileProvider):
|
||||
if not room_id:
|
||||
raise Exception("Matrix room_id missing")
|
||||
return self.upload_to_room(file_path, str(room_id))
|
||||
|
||||
def selector(self, selected_items: List[Any], *, ctx: Any, stage_is_last: bool = True, **_kwargs: Any) -> bool:
|
||||
"""Handle Matrix room selection via `@N`.
|
||||
|
||||
If the CLI has a pending upload stash, selecting a room triggers an upload.
|
||||
"""
|
||||
if not stage_is_last:
|
||||
return False
|
||||
|
||||
pending = None
|
||||
try:
|
||||
pending = ctx.load_value('matrix_pending_uploads', default=None)
|
||||
except Exception:
|
||||
pending = None
|
||||
|
||||
pending_list = list(pending) if isinstance(pending, list) else []
|
||||
if not pending_list:
|
||||
return False
|
||||
|
||||
room_ids: List[str] = []
|
||||
for item in selected_items or []:
|
||||
rid = None
|
||||
if isinstance(item, dict):
|
||||
rid = item.get('room_id') or item.get('id')
|
||||
else:
|
||||
rid = getattr(item, 'room_id', None) or getattr(item, 'id', None)
|
||||
if rid and str(rid).strip():
|
||||
room_ids.append(str(rid).strip())
|
||||
|
||||
if not room_ids:
|
||||
print("No Matrix room selected\n")
|
||||
return True
|
||||
|
||||
any_failed = False
|
||||
for room_id in room_ids:
|
||||
for payload in pending_list:
|
||||
try:
|
||||
file_path = ''
|
||||
delete_after = False
|
||||
if isinstance(payload, dict):
|
||||
file_path = str(payload.get('path') or '')
|
||||
delete_after = bool(payload.get('delete_after', False))
|
||||
else:
|
||||
file_path = str(getattr(payload, 'path', '') or '')
|
||||
if not file_path:
|
||||
any_failed = True
|
||||
continue
|
||||
|
||||
media_path = Path(file_path)
|
||||
if not media_path.exists():
|
||||
any_failed = True
|
||||
print(f"Matrix upload file missing: {file_path}")
|
||||
continue
|
||||
|
||||
link = self.upload_to_room(str(media_path), str(room_id))
|
||||
if link:
|
||||
print(link)
|
||||
|
||||
if delete_after:
|
||||
try:
|
||||
media_path.unlink(missing_ok=True) # type: ignore[arg-type]
|
||||
except TypeError:
|
||||
try:
|
||||
if media_path.exists():
|
||||
media_path.unlink()
|
||||
except Exception:
|
||||
pass
|
||||
except Exception as exc:
|
||||
any_failed = True
|
||||
print(f"Matrix upload failed: {exc}")
|
||||
|
||||
try:
|
||||
ctx.store_value('matrix_pending_uploads', [])
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
if any_failed:
|
||||
print("\nOne or more Matrix uploads failed\n")
|
||||
return True
|
||||
|
||||
Reference in New Issue
Block a user