packages/server/src/utils/steam/components/custom.ts
import { steamUser } from '@core/Steam';
import SteamUser from 'steam-user';
import { getFiles, validateGame } from '@utils/files';
import log from '@utils/log';
import { flattenArray } from '@utils/array';
import path from 'path';
import * as fs from 'fs';
import * as chokidar from 'chokidar';
/**
* Load SteamSpeak steam games
*/
SteamUser.prototype.loadGames = async function (): Promise<void> {
getFiles(path.join(__dirname, '../../../core/Steam/games')).then((files) => {
const jsfiles = flattenArray(files).filter((f) => f.split('.').pop() === 'ts');
jsfiles.forEach((file) => {
try {
// eslint-disable-next-line @typescript-eslint/no-var-requires
const game = require(path.resolve(file));
validateGame(game.info)
.then(() => {
if (game.info.config.enabled) {
if (typeof game['load'] !== 'undefined') {
game.load();
}
steamUser.games.set(game.info.appId, game);
log.info(`Loaded game ${game.info.name}.`, { type: 'steam' });
} else {
log.info(`${game.info.name} disabled. Skipping`, { type: 'steam' });
}
})
.catch((err) => {
log.error(`Invalid ${game.info.name} config: ${err.message}. Skipping`, {
type: 'steam'
});
});
} catch (err) {
log.warn(`Issue loading game file ${file}: ${err.message}`, { type: 'steam' });
}
});
});
};
/**
* Load SteamSpeak steam modules
*/
SteamUser.prototype.loadModules = async function (): Promise<void> {
getFiles(path.join(__dirname, '../../../core/Steam/modules/')).then((files) => {
const jsfiles = flattenArray(files).filter((f) => f.split('.').pop() === 'ts');
jsfiles.forEach((file) => {
try {
require(path.resolve(file));
log.info(`Loaded module ${path.basename(file, '.ts')}.`, { type: 'steam' });
} catch (err) {
log.warn(`Issue loading module file ${file}: ${err.message}`, { type: 'steam' });
}
});
});
};
/**
* Watch SteamSpeak steam games
*/
SteamUser.prototype.watchGames = function (): void {
chokidar
.watch(path.join(__dirname, '../../../core/Steam/games'), { ignoreInitial: true })
.on('all', (event, file) => {
const fileName = path.basename(file);
const game = fileName.slice(0, -3);
steamUser.games.delete(game);
const cached = require.cache[require.resolve(path.resolve(file))];
if (typeof cached?.exports.unload !== 'undefined') {
cached.exports.unload();
}
if (fs.existsSync(path.resolve(file))) {
try {
delete require.cache[require.resolve(path.resolve(file))];
// eslint-disable-next-line @typescript-eslint/no-var-requires
const game = require(path.resolve(file));
validateGame(game.info)
.then(() => {
if (game.info.config.enabled) {
if (typeof game['load'] !== 'undefined') {
game.load();
}
steamUser.games.set(game.info.appId, game);
log.info(`Loaded game ${game.info.name}`, { type: 'steam' });
} else {
if (typeof game['unload'] !== 'undefined') {
game.unload();
}
log.info(`Unloaded game ${game.info.name}`, { type: 'steam' });
}
})
.catch((err) => {
log.error(`Invalid ${game.info.name} config: ${err.message}. Skipping`, {
type: 'steam'
});
});
} catch (err) {
if (err.message.includes("Cannot find module '@core/Steam'")) return;
log.warn(`Issue loading game file ${fileName}: ${err.message}`, { type: 'steam' });
}
} else {
log.info(`Detected removal of game ${fileName}, unloading.`);
}
});
};
/**
* SteamSteak games
*/
SteamUser.prototype.games = new Map();
/**
* SteamSteak initial friend load status
*/
SteamUser.prototype.friendPersonasLoaded = false;