Docker container behind dos.jerryaldrichiii.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

167 lines
5.0 KiB

// Take a JavaScript date and convert it to DOS like `DIR` date
function dirDate(date) {
var month = ('0' + (date.getMonth() + 1)).slice(-2),
day = ('0' + (date.getDate())).slice(-2),
year = (date.getFullYear().toString().slice(-2)),
timeString = date.toLocaleString(
'en-US',
{minute: 'numeric', hour: 'numeric', hour12: true }
).replace(" AM", "a").replace(" PM", "p");
return `${month}-${day}-${year}\t${timeString}`;
}
// Used for slowing down output to feel more "real"
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
// Used when getJSON fails
function createFailedTerminal(termElement, error) {
$(termElement).terminal({},
{
greetings: null,
onInit: async function typeMessage(term) {
await sleep(1);
term.set_prompt('');
term.echo("Starting WEB-DOS", {newline: false});
var i;
for(i = 1; i <= 3; i++) {
await sleep(200);
term.echo(".", {newline: false});
}
await sleep(200);
term.echo("\n");
term.echo("ERROR: Failed to start WEB-DOS.\n");
term.echo("[[;red;]"+error.toString());
term.set_prompt('');
},
}
);
}
// Create a jsquery.terminal in a given element with a set of commands
function createTerminal(termElement, commands) {
$(termElement).terminal(
function(command) {
var upcaseCommand = command.toUpperCase();
comFunc = commands[upcaseCommand];
if(typeof comFunc !== 'undefined') {
comFunc(this);
} else {
this.echo("Bad command or file name (Try HELP)\n");
}
},
{
greetings: null,
onInit: async function typeMessage(term) {
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
await sleep(1);
term.set_prompt('');
term.echo("Starting WEB-DOS", {newline: false});
var i;
for(i = 1; i <= 3; i++) {
await sleep(200);
term.echo(".", {newline: false});
};
await sleep(200);
term.echo("\n");
term.set_prompt('C:\>');
},
}
);
}
// Takes in a 'game' object and returns a function to run it in js-dos
function createGameCommand(game, canvas, termElement) {
return function() {
canvas.style.display = "";
termElement.style.display = "none";
Dos(canvas, {
wdosboxUrl: "https://js-dos.com/6.22/current/wdosbox.js",
cycles: game.cycles,
autolock: true,
}).ready(function (fs, main) {
fs.extract(game.url, "/" + game.dataFolder).then(function () {
var runCommand = [];
if(typeof game.runCommand == 'undefined') {
runCommand = ["-c", "cd " + game.dataFolder, "-c", game.executable];
} else {
runCommand = game.runCommand;
}
main(runCommand).then(function (ci) {
window.ci = ci;
document.title = game.executable;
});
});
});
};
}
// Given data from a config.json, create commands for a jsquery.template
function createCommands(data, canvas, termElement) {
var commands = {};
// Load commands from JSON
data.games.forEach(function(game) {
gameCommand = createGameCommand(game, canvas, termElement);
commands[game.executable] = gameCommand;
commands[game.executable + "." + game.extension] = gameCommand;
});
commands["DIR"] = function(term){
var largestSizeLen = 0;
data.games.forEach(function(game) {
var localeStringLength = game.size.toLocaleString().length;
if(localeStringLength > largestSizeLen) {
largestSizeLen = localeStringLength;
}
});
var totalSize = 0;
data.games.forEach(function(game) {
totalSize = totalSize + game.size;
var exe = game.executable.padEnd(8);
var ext = game.extension;
var size = game.size.toLocaleString().padStart(largestSizeLen);
var date = dirDate(new Date(game.dateAdded));
term.echo(`${exe}\t${ext}\t\t\t${size}\t${date}`);
});
var gameCount = data.games.length;
var localeSize = totalSize.toLocaleString();
term.echo(`\t\t${gameCount} file(s)\t\t ${localeSize} bytes`);
term.echo(`\t\t\t\t\t\t 42,821,632 bytes free`);
};
commands["HELP"] = function(term){
term.echo("Supported commands:");
term.echo("\tDIR List all \"executables\" you can run");
term.echo("\tHELP You're reading it");
term.echo("\n");
term.echo("Or, just run one of these:");
data.games.forEach(function(game) {
term.echo("\t" + game.executable);
});
};
return commands;
}
// Load config.json, create commands, then launch jsquery.terminal
function initTerminal(dataJSONPath, canvas, termElement) {
var commands = {};
$.getJSON(
dataJSONPath,
function(data) { commands = createCommands(data, canvas, termElement); }
).fail(
function(_, _, error) { terminal = createFailedTerminal(termElement, error); }
).done(
function() { terminal = createTerminal(termElement, commands); }
);
}