node-gamedig/lib/GameResolver.js

123 lines
3.4 KiB
JavaScript
Raw Normal View History

import * as path from 'path';
import { fileURLToPath } from "url";
import * as fs from 'fs';
2019-01-12 11:43:36 +01:00
export default class GameResolver {
2019-01-12 11:43:36 +01:00
constructor() {
2019-02-07 07:37:33 +01:00
const loaded = this._readGames();
this.gamesByKey = loaded.gamesByKey;
this.games = loaded.games;
2019-01-12 11:43:36 +01:00
}
lookup(type) {
if(!type)
throw Error('No game specified');
2019-01-12 11:43:36 +01:00
if(type.substring(0,9) === 'protocol-') {
2019-01-12 11:43:36 +01:00
return {
protocol: type.substring(9)
2019-01-12 11:43:36 +01:00
};
}
2019-02-07 07:37:33 +01:00
const game = this.gamesByKey.get(type);
if(!game)
throw Error('Invalid game: '+type);
2019-01-12 11:43:36 +01:00
return game.options;
}
printReadme() {
let out = '';
2021-02-25 09:15:53 +01:00
out += '| GameDig Type ID | Name | See Also\n';
out += '|---|---|---\n';
2019-02-07 07:37:33 +01:00
const sorted = this.games
.filter(game => game.pretty)
.sort((a,b) => {
return a.pretty.localeCompare(b.pretty);
});
for(const game of sorted) {
let keysOut = game.keys.map(key => '`'+key+'`').join('<br>');
out += "| " + keysOut.padEnd(10, " ") + " "
+ "| " + game.pretty;
2021-02-25 09:15:53 +01:00
let notes = [];
if(game.extra.doc_notes) {
notes.push("[Notes](#" + game.extra.doc_notes + ")");
}
if(game.options.protocol === 'valve') {
notes.push('[Valve Protocol](#valve)');
}
if(notes.length) {
out += " | " + notes.join(', ');
}
2019-01-12 11:43:36 +01:00
out += "\n";
}
return out;
}
_readGames() {
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const gamesFile = path.normalize(__dirname+'/../games.txt');
2019-01-12 11:43:36 +01:00
const lines = fs.readFileSync(gamesFile,'utf8').split('\n');
2019-02-07 07:37:33 +01:00
const gamesByKey = new Map();
const games = [];
2019-01-12 11:43:36 +01:00
for (let line of lines) {
// strip comments
const comment = line.indexOf('#');
if(comment !== -1) line = line.substring(0,comment);
2019-01-12 11:43:36 +01:00
line = line.trim();
if(!line) continue;
const split = line.split('|');
2019-02-07 07:37:33 +01:00
const keys = split[0].trim().split(',');
const name = split[1].trim();
2019-01-12 11:43:36 +01:00
const options = this._parseList(split[3]);
options.protocol = split[2].trim();
2019-02-07 07:37:33 +01:00
const extra = this._parseList(split[4]);
2019-01-12 11:43:36 +01:00
2019-02-07 07:37:33 +01:00
const game = {
keys: keys,
pretty: name,
2019-01-12 11:43:36 +01:00
options: options,
2019-02-07 07:37:33 +01:00
extra: extra
};
for (const key of keys) {
gamesByKey.set(key, game);
}
2019-02-07 07:37:33 +01:00
games.push(game);
2019-01-12 11:43:36 +01:00
}
2019-02-07 07:37:33 +01:00
return { gamesByKey, games };
2019-01-12 11:43:36 +01:00
}
_parseList(str) {
if(!str)
return {};
let out = {};
2019-01-12 11:43:36 +01:00
for (const one of str.split(',')) {
const equals = one.indexOf('=');
const key = equals === -1 ? one : one.substring(0, equals);
/** @type {string|number|boolean} */
let value = equals === -1 ? '' : one.substring(equals + 1);
2019-01-12 11:43:36 +01:00
if(value === 'true' || value === '')
value = true;
else if(value === 'false')
value = false;
else if(!isNaN(parseInt(value)))
value = parseInt(value);
2019-01-12 11:43:36 +01:00
out[key] = value;
}
2019-01-12 11:43:36 +01:00
return out;
}
}