feat: fix mods tab, add client/server split, and scaffold server dirs
Mods tab bug fixes:
- mod_manager: fix wrong kwargs in set_enabled_mods, fix scan dir to use
mods/ subdir instead of server root, migrate old string-list format to
dict format on read
- service: replace dead server_mods SQL JOIN with get_enabled_mods()
call through the mod_manager capability; pass is_server_mod to
build_mod_args
- mods_router: accept list[EnabledModEntry] objects (name + is_server_mod)
instead of bare strings
Client/server mod split:
- Mods now stored as list[{"name": str, "is_server_mod": bool}]; old
string-list format auto-migrated on read
- is_server_mod=true routes to -serverMod= arg; false to -mod= arg
- ModList UI: amber Client/Server badge in selected pane; toggle button
in split-pane selector
Directory scaffold:
- process_config: adds "mods" to dir layout; provides get_dir_readme()
with per-directory README.txt content
- file_utils: ensure_server_dirs() gains readme_provider kwarg; writes
README.txt idempotently if absent
- service.create_server: passes readme_provider via hasattr probe
- main.py startup: backfills all existing servers with correct subdirs
and README files (idempotent)
Docs: API.md and FRONTEND.md updated for new mod schema and types
Test __init__.py files added for pytest discovery
This commit is contained in:
@@ -90,7 +90,24 @@ async def lifespan(app: FastAPI):
|
||||
except Exception as exc:
|
||||
logger.error("Failed to reattach threads for server %d: %s", server["id"], exc)
|
||||
|
||||
# 8. Seed default admin if no users exist
|
||||
# 8. Backfill server directory scaffold for existing servers (idempotent)
|
||||
from core.dal.server_repository import ServerRepository as _ServerRepo
|
||||
from core.utils.file_utils import ensure_server_dirs as _ensure_dirs
|
||||
from adapters.registry import GameAdapterRegistry as _Registry
|
||||
with engine.connect() as db:
|
||||
for server in _ServerRepo(db).get_all():
|
||||
try:
|
||||
_adapter = _Registry.get(server["game_type"])
|
||||
_pc = _adapter.get_process_config()
|
||||
_ensure_dirs(
|
||||
server["id"],
|
||||
_pc.get_server_dir_layout(),
|
||||
readme_provider=getattr(_pc, "get_dir_readme", None),
|
||||
)
|
||||
except Exception as exc:
|
||||
logger.warning("Dir scaffold failed for server %d: %s", server["id"], exc)
|
||||
|
||||
# 9. Seed default admin if no users exist
|
||||
from core.auth.service import AuthService
|
||||
with engine.connect() as db:
|
||||
svc = AuthService(db)
|
||||
@@ -104,7 +121,7 @@ async def lifespan(app: FastAPI):
|
||||
logger.warning(" Change this password immediately!")
|
||||
logger.warning("=" * 60)
|
||||
|
||||
# 9. Register and start APScheduler cleanup jobs
|
||||
# 10. Register and start APScheduler cleanup jobs
|
||||
from core.jobs.scheduler import start_scheduler, stop_scheduler
|
||||
from core.jobs.cleanup_jobs import register_cleanup_jobs
|
||||
register_cleanup_jobs()
|
||||
|
||||
Reference in New Issue
Block a user