ConanServerManager/lib/game.dart
zontreck 317df007d4 Refactor: Fix slow initial server start
Moved hashing to first update check
2025-01-04 17:50:10 -07:00

97 lines
2.5 KiB
Dart

import 'dart:io';
import 'package:crypto/crypto.dart';
import 'package:libac_dart/utils/IOTools.dart';
import 'package:servermanager/structs/mod.dart';
import 'package:servermanager/structs/settings.dart';
Future<void> doDownloadMods(bool jail) async {
Settings settings = Settings();
if (settings.isDownloadingMods) return;
settings.isDownloadingMods = true;
// Build download command
List<String> manifest = [
"+@sSteamCmdForcePlatformType",
"windows",
"+force_install_dir",
jail ? settings.getModJailPath() : settings.getModPath(),
"+login",
"anonymous",
];
for (Mod M in settings.inst!.mods) {
if (!M.enabled) continue;
manifest.add("+workshop_download_item");
manifest.add("440900");
manifest.add("${M.mod_id}");
}
await settings.createModFolderIfNotExists();
await settings.createModJailFolderIfNotExists();
manifest.add("+quit");
//print(
// "Running command: ${settings.getSteamCmd()} ${manifest.join(" ")}");
var result = await Process.run(settings.getSteamCmd(), manifest);
print(result.stdout);
settings.isDownloadingMods = false;
}
Future<List<Mod>> doScanMods(bool jail, {bool computeHashes = false}) async {
Settings settings = Settings();
List<Mod> ret = [];
for (Mod M in settings.inst!.mods.toList()) {
if (!M.enabled) {
ret.add(M);
continue;
}
var index = settings.inst!.mods.indexOf(M);
// Assemble final path.
String modsPath = PathHelper.builder(
jail ? settings.getModJailPath() : settings.getModPath())
.resolve("steamapps")
.resolve("workshop")
.resolve("content")
.resolve("440900")
.resolve("${M.mod_id}")
.build();
Directory dir = Directory(modsPath);
await for (var entity in dir.list()) {
if (entity is File && entity.path.endsWith("pak")) {
String name = entity.path.split(Platform.pathSeparator).last;
String hash = "";
if (jail || computeHashes) {
var content = await entity.readAsBytes();
var data = md5.convert(content);
hash = data.toString();
//M.mod_pak = name;
//M.mod_hash = hash;
print("Discovered mod file: $name");
print("Hash: $hash");
}
// Update the mod instance, and retain the original modlist order
ret.add(Mod(
mod_hash: hash,
mod_id: M.mod_id,
mod_pak: name,
mod_name: M.mod_name,
comment: M.comment));
}
}
}
return ret;
}