Fika-Tarkov/mods/Merks Trader Image Swicher/user/mods/MerksTraderImageSwitcher/src/TraderPics.ts

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();