feat: implement phases 3-5 of Arma 3 UX enhancement plan
Phase 3 - Mod display names + split-pane selector:
- Parse mod.cpp/meta.cpp for display_name and workshop_id
- Rewrite ModList as two-pane available/selected interface
Phase 4 - Player kick/ban from Players tab:
- Add get_by_slot() to PlayerRepository
- Add get_rcon_client() class method to ThreadRegistry
- Add /players/{slot_id}/kick and /ban endpoints
- Rewrite PlayerTable with kick/ban modals and ban presets
Phase 5 - Historical log file browser:
- Add list_log_files() and get_log_file_path() to RPTParser
- Add logfiles_router with GET/download/DELETE endpoints
- Update LogViewer with collapsible log files section (download + delete)
This commit is contained in:
@@ -90,6 +90,20 @@ class ThreadRegistry:
|
||||
if registry is not None:
|
||||
registry._stop_all()
|
||||
|
||||
@classmethod
|
||||
def get_rcon_client(cls, server_id: int):
|
||||
"""Return the live Arma3RemoteAdmin client for a running server, or None."""
|
||||
registry = cls._get_instance()
|
||||
if registry is None:
|
||||
return None
|
||||
bundle = registry._bundles.get(server_id)
|
||||
if bundle is None:
|
||||
return None
|
||||
poller = bundle.get("rcon_poller")
|
||||
if poller is None or not poller.is_alive():
|
||||
return None
|
||||
return getattr(poller, "_client", None)
|
||||
|
||||
# ── Instance methods ──
|
||||
|
||||
def _start_server_threads(self, server_id: int, db) -> None:
|
||||
|
||||
Reference in New Issue
Block a user