SquadJS/squad-server/utils/admin-lists.js

87 lines
2.5 KiB
JavaScript
Raw Normal View History

2020-11-10 10:31:24 -06:00
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
2020-11-07 17:43:08 -06:00
import axios from 'axios';
import Logger from 'core/logger';
2020-11-10 10:31:24 -06:00
const __dirname = fileURLToPath(import.meta.url);
2020-11-07 18:10:55 -06:00
export default async function fetchAdminLists(adminLists) {
2021-02-25 07:02:08 -06:00
Logger.verbose('SquadServer', 1, `Fetching Admin Lists...`);
2020-11-07 19:23:21 -06:00
2020-11-07 18:10:55 -06:00
const groups = {};
const admins = {};
2021-01-28 11:41:13 -06:00
for (const [idx, list] of adminLists.entries()) {
let data = '';
2020-11-10 10:31:24 -06:00
try {
switch (list.type) {
case 'remote': {
const resp = await axios({
method: 'GET',
2020-12-08 11:26:31 -06:00
url: `${list.source}`
2020-11-10 10:31:24 -06:00
});
data = resp.data;
break;
}
case 'local': {
2020-12-08 11:26:31 -06:00
const listPath = path.resolve(__dirname, '../../../', list.source);
2020-11-10 10:31:24 -06:00
if (!fs.existsSync(listPath)) throw new Error(`Could not find Admin List at ${listPath}`);
data = fs.readFileSync(listPath, 'utf8');
break;
}
default:
throw new Error(`Unsupported AdminList type:${list.type}`);
2020-11-07 18:10:55 -06:00
}
2021-01-28 11:41:13 -06:00
} catch (error) {
Logger.verbose(
'SquadServer',
1,
`Error fetching ${list.type} admin list: ${list.source}`,
error
);
}
2020-11-07 17:43:08 -06:00
2021-01-28 11:41:13 -06:00
const groupRgx = /(?<=^Group=)(?<groupID>.*?):(?<groupPerms>.*?)(?=(?:\r\n|\r|\n|\s+\/\/))/gm;
const adminRgx = /(?<=^Admin=)(?<steamID>\d+):(?<groupID>\S+)/gm;
2020-11-07 18:10:55 -06:00
2021-01-28 11:41:13 -06:00
for (const m of data.matchAll(groupRgx)) {
groups[`${idx}-${m.groups.groupID}`] = m.groups.groupPerms.split(',');
}
for (const m of data.matchAll(adminRgx)) {
try {
const group = groups[`${idx}-${m.groups.groupID}`];
2021-01-28 11:47:08 -06:00
const perms = {};
for (const groupPerm of group) perms[groupPerm] = true;
2020-11-07 18:10:55 -06:00
2021-01-28 11:41:13 -06:00
const steamID = m.groups.steamID;
2020-11-10 10:31:24 -06:00
if (steamID in admins) {
admins[steamID] = Object.assign(admins[steamID], perms);
Logger.verbose(
'SquadServer',
3,
`Merged duplicate Admin ${steamID} to ${Object.keys(admins[steamID])}`
);
} else {
admins[steamID] = Object.assign(perms);
Logger.verbose(
'SquadServer',
3,
`Added Admin ${steamID} with ${Object.keys(admins[steamID])}`
);
}
2021-01-28 11:41:13 -06:00
} catch (error) {
Logger.verbose(
'SquadServer',
1,
`Error parsing admin group ${m.groups.groupID} from admin list: ${list.source}`,
error
);
2020-11-10 10:31:24 -06:00
}
2020-11-07 18:10:55 -06:00
}
}
2020-11-10 10:31:24 -06:00
Logger.verbose('SquadServer', 1, `${Object.keys(admins).length} admins loaded...`);
2020-11-07 18:10:55 -06:00
return admins;
}