131 lines
3.8 KiB
TypeScript
131 lines
3.8 KiB
TypeScript
import { container, DependencyContainer } from "tsyringe";
|
|
|
|
import { ImageRouter } from "@spt/routers/ImageRouter"; // Adjusted the import path
|
|
import { PreSptModLoader } from "@spt/loaders/PreSptModLoader"; // Adjusted the import path
|
|
import { ILogger } from "@spt/models/spt/utils/ILogger"; // Adjusted the import path
|
|
import { LogTextColor } from "@spt/models/spt/logging/LogTextColor";
|
|
|
|
import path from "path";
|
|
import fs from "fs";
|
|
|
|
const logger: ILogger = container.resolve("WinstonLogger");
|
|
const imageRouter: ImageRouter = container.resolve("ImageRouter");
|
|
const preSptModLoader: PreSptModLoader = container.resolve("PreSptModLoader");
|
|
|
|
interface Settings {
|
|
updateAllTraders: boolean;
|
|
extension: string;
|
|
anime: boolean;
|
|
custom: boolean;
|
|
main: boolean;
|
|
realistic: boolean;
|
|
}
|
|
|
|
class TraderPics implements IPreSptLoadMod, IPostDBLoadMod {
|
|
private modName: string = path.basename(
|
|
path.dirname(__dirname.split("/").pop() || "")
|
|
);
|
|
|
|
public async preSptLoad(container: DependencyContainer): Promise<void> {
|
|
// Initialize anything if needed before SPT loads
|
|
}
|
|
|
|
public async postDBLoad(container: DependencyContainer): Promise<void> {
|
|
let settings: Settings;
|
|
let pkg: any;
|
|
|
|
try {
|
|
pkg = require("../package.json");
|
|
settings = require("../config/config.json");
|
|
logger.info("Settings loaded successfully.");
|
|
logger.info(`Settings: ${JSON.stringify(settings)}`);
|
|
} catch (err) {
|
|
logger.error("Failed to load config.json or package.json", err);
|
|
return;
|
|
}
|
|
|
|
const modPath = preSptModLoader.getModPath(this.modName);
|
|
logger.info(`Mod path: ${modPath}`);
|
|
|
|
const folderPaths = {
|
|
anime: path.join(modPath, "res", "anime"),
|
|
custom: path.join(modPath, "res", "custom"),
|
|
main: path.join(modPath, "res", "main"),
|
|
realistic: path.join(modPath, "res", "realistic"),
|
|
};
|
|
|
|
try {
|
|
if (
|
|
!settings.anime &&
|
|
!settings.custom &&
|
|
!settings.main &&
|
|
!settings.realistic
|
|
) {
|
|
logger.info(
|
|
"All folder usage settings are false. No images will be changed."
|
|
);
|
|
return;
|
|
}
|
|
|
|
let filepath = "";
|
|
if (settings.anime) {
|
|
filepath = folderPaths.anime;
|
|
} else if (settings.custom) {
|
|
filepath = folderPaths.custom;
|
|
} else if (settings.main) {
|
|
filepath = folderPaths.main;
|
|
} else if (settings.realistic) {
|
|
filepath = folderPaths.realistic;
|
|
}
|
|
|
|
this.loadImages(filepath, settings);
|
|
logger.log(
|
|
`${pkg.name} [LOADED]: Traders Looking Fire Now!`,
|
|
LogTextColor.BLUE
|
|
);
|
|
} catch (err) {
|
|
logger.error("An error occurred during postDBLoad execution", err);
|
|
logger.error(err.stack);
|
|
}
|
|
}
|
|
|
|
private loadImages(filepath: string, settings: Settings): void {
|
|
logger.info(`Loading images from: ${filepath}`);
|
|
|
|
fs.readdir(filepath, (err, files) => {
|
|
if (err) {
|
|
logger.error(`Error reading directory: ${filepath}`, err);
|
|
return;
|
|
}
|
|
|
|
files.forEach((file) => {
|
|
const traderName = path.basename(file, path.extname(file));
|
|
try {
|
|
if (settings.updateAllTraders) {
|
|
this.changeTraderImage(traderName, settings, filepath);
|
|
}
|
|
} catch (error) {
|
|
logger.error(
|
|
`Error processing image for trader ${traderName}: ${error.message}`
|
|
);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
private changeTraderImage(
|
|
traderName: string,
|
|
settings: Settings,
|
|
filepath: string
|
|
): void {
|
|
const imageFileName = `${traderName}.${settings.extension}`;
|
|
logger.info(`Changing image for ${traderName} to ${imageFileName}`);
|
|
imageRouter.addRoute(
|
|
`/files/trader/avatar/${traderName}`,
|
|
`${filepath}${path.sep}${imageFileName}`
|
|
);
|
|
}
|
|
}
|
|
|
|
export const mod = new TraderPics();
|