mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-21 12:02:31 +01:00
* tgui the beginning * binaries and the like * Bring in the last of it * Example radio UI * delete example * NTOS Main Menu, start on manifest, tgui states * tasks.json * gunnery ui pt 1 * okay * fix everything * scss update * oops * manifest gigablast * downloader part 1 * download prt 2 * NTOSDownloader final * mfw committing to_worlds * gunnery console pt2 * i cooked * targeting (finished) * one vueui down * voting ui almost done * MY MIND FEELS LIKE AN ARCH ENEMYYYY * voting ui down * photocopier * ntos config + download fixes * photocopier 2 * refactor define * NTOS client manager + fixes * fax machine final (it also uses toner now) * marching forwards... left behind... * ntnrc part 1 * canister * add quotes * portable pumps pt1 + more backgrounds * oops * finish the portable pump * freezers so I'll keep on pushing forward... you haven't seen the last of me... oooooooh... * doors ui pt1 * finish doors UI (forgive me wildkins it's a bit of shitcode) * vitals monitor, make things use labeled lists, new backgrounds * mais j'envoyé aucun mayday... * maglock pt1 * pour ça je me suis perdu... * infrared * fix that * prox sensor pt1 * prox sensor * signaler (this was actually pretty hard) * atmos control pt1 * atmos control pt1.1 * atmos pt 2 * fuel injector * multitool UI * jammer * list viewer * APC * portgen * targeting console updates + SMES ui * new themes, shield generator * supermatter * Add ore detector and (shitty) NTNet Relay * orderterminal pt1 * orderterminal pt2 * smartfridge * Add (air-)tank GUI update ore detector size * Adds Transfer Valves * Add AtmoScrubber * analyzer pt1 * weapons analyzer pt2 * bodyscanner pt1 * bodyscanner pt2 * fix this shitcode * seed storage * appearance changer * appearance changer final * sleeper pt1 * sleeper * gps * vehicles * chem dispenser * lily request * holopad * tgui modules pt1 * ppanel * damage menu * fixes * im here too now * follow menu, search bars * quikpay * quikpay fixes * circuit printer * ppanel * ppanel updates * pai * turret controls (i want to kill myself) * tweak * remove the boardgame * guntracker * implant tracker * penal mechs come close to me, come close to me * chem codex * pai radio * doorjack * pai directives * signaler removal, sensors * ghost spawner * spawnpoint * fixes * teleporter * one more to the chopping block * account database * remove divider * scanner, atmos * latejoin ui pt1 * latejoin * records pt1 * RECORDS UI DONE * delete interpreter & records * CHAT FUCKING CLIENT * data updates * fix some things * final UI, log * basic nanoui fix * antag panel * remove vueui * atm update * vending update * warrants, cameras * ntmonitor * time comes for all * preserve this legacy * bring that back (oops) * rcon, ui auto update for computer UIs, remove rcon computers * alarm monitoring (a bit broke and also todo: add custom alarm monitoring programs to a few consoles) * A LIKE SUPREME * a * power monitor * lights on * fuck this code, fuck nanoui modules, and fuck nanoui * LEAVE IT OH SO FAR BEHIND * fix alarm monitoring for synths * I SAW IN YOU WHAT LIFE WAS MISSING * comms console * idcard and record updates * turn the light on * arcade * pt2 * news browser * static * crusher * f * COULD I JUST SLEIGH THE GOLD FROM THE BALLS? I'M SO FRUSTRATED OH COULD YOU TELL? IF I HEAR ONE MORE VUEUI OR ONE NANOUI I'M GONNA LOSE IT SO LET ME GOOOOOOOOOOOOOOOOO * codeowners & suit sensors * html ui style removal * make lint happy * resist and disorder * i slowly get up and turn off the noise, already fed up... * pleaseeeeeeeeeeeeeee * THE CREDIT LARP IS NECESSARY * i hold the keys * RISE UP * fix that? * harry's suggestions xoxo * runtime fix pt2 * You are the only thing that I still care about * adds build workflow * Update update_tgui.yml * adds some needed steps * ATM * misc fixes and tweaks * fixes 2 * make newscasters usable and fix use power on freezers * turret control is clearer --------- Co-authored-by: John Wildkins <john.wildkins@gmail.com> Co-authored-by: Matt Atlas <liermattia@gmail.com> Co-authored-by: harryob <55142896+harryob@users.noreply.github.com> Co-authored-by: Werner <Arrow768@users.noreply.github.com> Co-authored-by: Geeves <ggrobler447@gmail.com> Co-authored-by: harryob <me@harryob.live>
196 lines
5.5 KiB
JavaScript
196 lines
5.5 KiB
JavaScript
import fs from 'fs';
|
|
import path from 'path';
|
|
import Juke from '../juke/index.js';
|
|
import { regQuery } from './winreg.js';
|
|
|
|
/**
|
|
* Cached path to DM compiler
|
|
*/
|
|
let dmPath;
|
|
|
|
const getDmPath = async (namedVersion) => {
|
|
// Use specific named version
|
|
if(namedVersion) {
|
|
return getNamedByondVersionPath(namedVersion);
|
|
}
|
|
if (dmPath) {
|
|
return dmPath;
|
|
}
|
|
dmPath = await (async () => {
|
|
// Search in array of paths
|
|
const paths = [
|
|
...((process.env.DM_EXE && process.env.DM_EXE.split(',')) || []),
|
|
...getDefaultNamedByondVersionPath(),
|
|
'C:\\Program Files\\BYOND\\bin\\dm.exe',
|
|
'C:\\Program Files (x86)\\BYOND\\bin\\dm.exe',
|
|
['reg', 'HKLM\\Software\\Dantom\\BYOND', 'installpath'],
|
|
['reg', 'HKLM\\SOFTWARE\\WOW6432Node\\Dantom\\BYOND', 'installpath'],
|
|
];
|
|
const isFile = path => {
|
|
try {
|
|
return fs.statSync(path).isFile();
|
|
}
|
|
catch (err) {
|
|
return false;
|
|
}
|
|
};
|
|
for (let path of paths) {
|
|
// Resolve a registry key
|
|
if (Array.isArray(path)) {
|
|
const [type, ...args] = path;
|
|
path = await regQuery(...args);
|
|
}
|
|
if (!path) {
|
|
continue;
|
|
}
|
|
// Check if path exists
|
|
if (isFile(path)) {
|
|
return path;
|
|
}
|
|
if (isFile(path + '/dm.exe')) {
|
|
return path + '/dm.exe';
|
|
}
|
|
if (isFile(path + '/bin/dm.exe')) {
|
|
return path + '/bin/dm.exe';
|
|
}
|
|
}
|
|
// Default paths
|
|
return (
|
|
process.platform === 'win32' && 'dm.exe'
|
|
|| 'DreamMaker'
|
|
);
|
|
})();
|
|
return dmPath;
|
|
};
|
|
|
|
|
|
|
|
const getNamedByondVersionPath = (namedVersion) =>{
|
|
const all_entries = getAllNamedDmVersions(true)
|
|
const map_entry = all_entries.find(x => x.name === namedVersion);
|
|
if(map_entry === undefined){
|
|
Juke.logger.error(`No named byond version with name "${namedVersion}" found.`);
|
|
throw new Juke.ExitCode(1);
|
|
}
|
|
return map_entry.path;
|
|
}
|
|
|
|
const getDefaultNamedByondVersionPath = () =>{
|
|
const all_entries = getAllNamedDmVersions(false)
|
|
const map_entry = all_entries.find(x => x.default == true);
|
|
if(map_entry === undefined)
|
|
return []
|
|
return [map_entry.path];
|
|
}
|
|
|
|
|
|
/** @type {[{ name, path, default }]} */
|
|
let namedDmVersionList;
|
|
export const NamedVersionFile = "tools/build/dm_versions.json"
|
|
|
|
const getAllNamedDmVersions = (throw_on_fail) => {
|
|
if(!namedDmVersionList){
|
|
if(!fs.existsSync(NamedVersionFile)){
|
|
if(throw_on_fail){
|
|
Juke.logger.error(`No byond version map file found.`);
|
|
throw new Juke.ExitCode(1);
|
|
}
|
|
namedDmVersionList = []
|
|
return namedDmVersionList;
|
|
}
|
|
try{
|
|
namedDmVersionList = JSON.parse(fs.readFileSync(NamedVersionFile));
|
|
}
|
|
catch(err){
|
|
if(throw_on_fail){
|
|
Juke.logger.error(`Failed to parse byond version map file. ${err}`);
|
|
throw new Juke.ExitCode(1);
|
|
}
|
|
namedDmVersionList = []
|
|
return namedDmVersionList;
|
|
}
|
|
}
|
|
return namedDmVersionList;
|
|
}
|
|
|
|
/**
|
|
* @param {string} dmeFile
|
|
* @param {{
|
|
* defines?: string[];
|
|
* warningsAsErrors?: boolean;
|
|
* namedDmVersion?: string;
|
|
* }} options
|
|
*/
|
|
export const DreamMaker = async (dmeFile, options = {}) => {
|
|
if(options.namedDmVersion !== null){
|
|
Juke.logger.info('Using named byond version:', options.namedDmVersion);
|
|
}
|
|
const dmPath = await getDmPath(options.namedDmVersion);
|
|
// Get project basename
|
|
const dmeBaseName = dmeFile.replace(/\.dme$/, '');
|
|
// Make sure output files are writable
|
|
const testOutputFile = (name) => {
|
|
try {
|
|
fs.closeSync(fs.openSync(name, 'r+'));
|
|
}
|
|
catch (err) {
|
|
if (err && err.code === 'ENOENT') {
|
|
return;
|
|
}
|
|
if (err && err.code === 'EBUSY') {
|
|
Juke.logger.error(`File '${name}' is locked by the DreamDaemon process.`);
|
|
Juke.logger.error(`Stop the currently running server and try again.`);
|
|
throw new Juke.ExitCode(1);
|
|
}
|
|
throw err;
|
|
}
|
|
};
|
|
testOutputFile(`${dmeBaseName}.dmb`);
|
|
testOutputFile(`${dmeBaseName}.rsc`);
|
|
const runWithWarningChecks = async (dmeFile, args) => {
|
|
const execReturn = await Juke.exec(dmeFile, args);
|
|
if (options.warningsAsErrors && execReturn.combined.match(/\d+:warning: /)) {
|
|
Juke.logger.error(`Compile warnings treated as errors`);
|
|
throw new Juke.ExitCode(2);
|
|
}
|
|
return execReturn;
|
|
}
|
|
// Compile
|
|
const { defines } = options;
|
|
if (defines && defines.length > 0) {
|
|
Juke.logger.info('Using defines:', defines.join(', '));
|
|
try {
|
|
const injectedContent = defines
|
|
.map(x => `#define ${x}\n`)
|
|
.join('');
|
|
fs.writeFileSync(`${dmeBaseName}.m.dme`, injectedContent);
|
|
const dmeContent = fs.readFileSync(`${dmeBaseName}.dme`);
|
|
fs.appendFileSync(`${dmeBaseName}.m.dme`, dmeContent);
|
|
await runWithWarningChecks(dmPath, [`${dmeBaseName}.m.dme`]);
|
|
fs.writeFileSync(`${dmeBaseName}.dmb`, fs.readFileSync(`${dmeBaseName}.m.dmb`));
|
|
fs.writeFileSync(`${dmeBaseName}.rsc`, fs.readFileSync(`${dmeBaseName}.m.rsc`));
|
|
}
|
|
finally {
|
|
Juke.rm(`${dmeBaseName}.m.*`);
|
|
}
|
|
}
|
|
else {
|
|
await runWithWarningChecks(dmPath, [dmeFile]);
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* @param {{
|
|
* dmbFile: string;
|
|
* namedDmVersion?: string;
|
|
* }} options
|
|
*/
|
|
export const DreamDaemon = async (options, ...args) => {
|
|
const dmPath = await getDmPath(options.namedDmVersion);
|
|
const baseDir = path.dirname(dmPath);
|
|
const ddExeName = process.platform === 'win32' ? 'dreamdaemon.exe' : 'DreamDaemon';
|
|
const ddExePath = baseDir === '.' ? ddExeName : path.join(baseDir, ddExeName);
|
|
return Juke.exec(ddExePath, [options.dmbFile, ...args]);
|
|
};
|