Implement sussing out metadata about individual mods

This commit is contained in:
2025-03-15 22:31:34 +01:00
parent f7763dd538
commit 566175958f
2 changed files with 81 additions and 3 deletions

View File

@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:rimworld_modman/modloader.dart'; import 'package:rimworld_modman/modloader.dart';
void main() { void main() {
ModList(path: modsRoot).load();
ConfigFile(path: configPath).load(); ConfigFile(path: configPath).load();
// runApp(const RimWorldModManager()); // runApp(const RimWorldModManager());
} }

View File

@@ -30,17 +30,94 @@ class Mod {
required this.incompatabilities, required this.incompatabilities,
required this.enabled, required this.enabled,
}); });
static Mod fromDirectory(String path) {
final directory = Directory(path);
final aboutFile = File('$path/About/About.xml');
final aboutXml = XmlDocument.parse(aboutFile.readAsStringSync());
final metadata = aboutXml.findElements('ModMetaData').first;
final name = metadata.findElements('name').first.innerText;
final id = metadata.findElements('packageId').first.innerText.toLowerCase();
final versions =
metadata
.findElements('supportedVersions')
.first
.findElements('li')
.map((e) => e.innerText)
.toList();
final description = metadata.findElements('description').first.innerText;
final hardDependencies =
metadata
.findElements('modDependenciesByVersion')
.last
.findElements('li')
.map((e) => e.findElements('packageId').first.innerText.toLowerCase())
.toList();
final softDependencies =
metadata
.findElements('loadAfter')
.first
.findElements('li')
.map((e) => e.innerText.toLowerCase())
.toList();
final incompatabilities =
metadata
.findElements('incompatibleWith')
.first
.findElements('li')
.map((e) => e.innerText.toLowerCase())
.toList();
return Mod(
name: name,
id: id,
path: path,
versions: versions,
description: description,
hardDependencies: hardDependencies,
softDependencies: softDependencies,
incompatabilities: incompatabilities,
enabled: false,
);
}
} }
class ModList { class ModList {
final String path; final String path;
final List<Mod> mods; List<Mod> mods = [];
ModList({required this.path, this.mods = const []}); ModList({required this.path});
void load() { void load() {
final file = File(path); final directory = Directory(path);
print('Loading configuration from: $path'); print('Loading configuration from: $path');
if (directory.existsSync()) {
final List<FileSystemEntity> entities = directory.listSync();
final List<String> modDirectories =
entities.whereType<Directory>().map((dir) => dir.path).toList();
print('Found ${modDirectories.length} mod directories:');
for (final modDir in modDirectories) {
try {
final mod = Mod.fromDirectory(modDir);
mods.add(mod);
print(
'Loaded mod: ${mod.name} (ID: ${mod.id}) from directory: $modDir. '
'Description: ${mod.description}, '
'Hard Dependencies: ${mod.hardDependencies.join(', ')}, '
'Soft Dependencies: ${mod.softDependencies.join(', ')}, '
'Incompatibilities: ${mod.incompatabilities.join(', ')}',
);
print('Current total mods loaded: ${mods.length}');
} catch (e) {
print('Error loading mod from directory: $modDir');
print('Error: $e');
}
}
} else {
print('Mods root directory does not exist: $modsRoot');
}
} }
} }