Added the terminal and a bunch of commands, still missing vim command

and also incomplete rm -rf
This commit is contained in:
2025-06-19 00:58:58 +03:00
parent 470f09f0fc
commit 67f8e3fecc
15 changed files with 411 additions and 24 deletions

View File

@@ -102,8 +102,31 @@ import TerminalBorder from "@components/TerminalBorder.astro";
}
}
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
var maxLines = 15;
var terminal: string[] = ["Coming soon!"];
var terminal: string[] = [];
const rootDirs = [
"bin",
"boot",
"dev",
"etc",
"home",
"lib",
"lib64",
"lost+found",
"nix",
"proc",
"root",
"run",
"srv",
"sys",
"tmp",
"usr",
"var",
];
function write(line: string) {
const maxChars = 98;
@@ -129,29 +152,276 @@ import TerminalBorder from "@components/TerminalBorder.astro";
output.innerHTML = text;
}
function runCommand(cmd: string) {
write(`$ ${cmd}`);
console.log(`$ ${cmd}`);
console.log(terminal);
switch (cmd) {
case "":
break;
case "clear":
terminal = [];
break;
case "test":
write('testing "trying to get more info"...');
write('test "trying to get more info" failed');
write("executed 1 test, 0 succeeded, 1 failed");
break;
case "thing":
break;
case "thing":
break;
default:
write(`${cmd}: command not found`);
break;
var isSudo = false;
var rootPassword = "123";
var leftPasswordTries = 0;
var sudoCommand = "";
const knownCommands = [
"clear",
"test",
"whoami",
"pwd",
"sudo",
"rm",
"emacs",
"set",
];
async function runCommand(input: string) {
if (leftPasswordTries != 0) {
if (input == rootPassword) {
// await sleep(1000);
leftPasswordTries = 0
isSudo = true;
runCommand(sudoCommand);
isSudo = false;
sudoCommand = "";
} else if (leftPasswordTries == 1) {
// await sleep(1000);
write("sudo: 3 incorrect password attempts");
leftPasswordTries -= 1;
sudoCommand = "";
} else {
// await sleep(1000);
write("Sorry, try again.");
write("[sudo] password for root:");
leftPasswordTries -= 1;
}
updateTerminal();
return;
}
if (!isSudo) {
write(`$ ${input}`);
console.log(`$ ${input}`);
}
var args = input.split(" ").slice(1);
var cmd = input.split(" ")[0];
if (cmd == "") return;
if (args.length == 0) {
switch (cmd) {
case "clear":
terminal = [];
break;
case "test":
if (isSudo) {
write('running "trying to get more info"...');
updateTerminal();
await sleep(1000);
write("fetching notes...");
updateTerminal();
await sleep(2000);
write(
"I love the look with 'set theme catppuccin', especially with the minecraft font!",
);
write("Been using it for a while in emacs");
updateTerminal();
await sleep(100);
write('test "trying to get more info" succeeded');
updateTerminal();
await sleep(100);
write("executed 1 test, 1 succeeded, 0 failed");
} else {
write('running "trying to get more info"...');
updateTerminal();
await sleep(1000);
write('test "trying to get more info" failed');
updateTerminal();
await sleep(100);
write("executed 1 test, 0 succeeded, 1 failed");
}
break;
case "whoami":
write("sandbox");
break;
case "pwd":
write("/home/sandbox");
break;
case "sudo":
write(`Usage: sudo [COMMAND]`);
break;
case "emacs":
write(`emacs: command not found`);
write(`The command 'emacs' is not available, but there is a similar command:`);
write(`- vim`);
write(`- nvim`);
break;
default:
if (knownCommands.includes(cmd)) {
write(`${cmd}: missing operand`);
write(`Try '${cmd} --help' for more information.`);
} else {
write(`${cmd}: command not found`);
}
break;
}
} else if (cmd == "rm") {
if (args.length == 2 && (args[0] == "-rf" || args[0] == "-fr")) {
if (args[1] == "/") {
write("rm: it is dangerous to operate recursively on '/'");
write(
"rm: use --no-preserve-root to override this failsafe",
);
} else if (args[1] == "." || args[1] == "..") {
write(
`rm: refusing to remove '.' or '..' directory: skipping '${args[1]}'`,
);
} else {
if (!args[1].startsWith("/")) {
args[1] = "/" + args[1];
}
write(`rm: cannot remove '${args[1]}': Permission denied`);
}
} else if (
args.length == 3 &&
(args[0] == "-rf" || args[0] == "-fr") &&
args[2] == "--no-preserve-root"
) {
for (const dir of rootDirs) {
await sleep(30);
write(`rm: cannot remove '/${dir}': Permission denied`);
updateTerminal();
}
} else if (args.length == 1 && args[0] == "--help") {
write(`Usage: rm [OPTION]... [FILE]...`);
write(`Remove (unlink) the FILE(s).`);
} else {
write(`${cmd}: unrecognized options '${args.join(" ")}'`);
write(`Try '${cmd} --help' for more information.`);
}
} else if (cmd == "sudo") {
if (isSudo) {
if (knownCommands.includes(args[0])) {
runCommand(args.join(" "));
} else {
write(`${cmd}: ${args[0]}: command not found`);
}
isSudo = false;
} else {
sudoCommand = input;
leftPasswordTries = 3;
write("[sudo] password for root:");
}
} else if (cmd == "set" && args.length == 2 && args[0] == "font") {
var unknown = false;
switch (args[1]) {
case "default":
window.setTheme({
font: "Jetbrains Mono",
});
break;
case "minecraft":
window.setTheme({
font: "Monocraft",
});
break;
default:
unknown = true;
break;
}
if (unknown) {
write(`${cmd}: unknown ${args[0]} '${args[1]}'`);
} else {
write(`${cmd}: ${args[0]} set to '${args[1]}'`);
}
} else if (cmd == "set" && args.length == 2 && args[0] == "theme") {
var unknown = false;
switch (args[1]) {
case "default":
window.setTheme({
primary: "#54d7a9",
secondary: "#9b7eca",
accent: "#7ed4fb",
extra: "#8fcc75",
text: "#ffffff",
alt: "#999999",
background: "#000000",
});
break;
case "catppuccin":
window.setTheme({
primary: "#94e2d5",
secondary: "#b4befe",
accent: "#74c7ec",
extra: "#a6e3a1",
text: "#cdd6f4",
alt: "#585b70",
background: "#1e1e2e",
});
break;
case "invisible":
case "hide":
case "black":
case "dark":
window.setTheme({
primary: "#000000",
secondary: "#000000",
accent: "#000000",
extra: "#000000",
text: "#000000",
alt: "#000000",
background: "#000000",
});
break;
case "blind":
case "sun":
case "light":
case "white":
case "flashbang":
case "flashlight":
window.setTheme({
primary: "#009399",
secondary: "#440b8e",
accent: "#177282",
extra: "#40a02b",
text: "#000000",
alt: "#4d4d4d",
background: "#ffffff",
});
break;
case "banana":
window.setTheme({
primary: "#ffdd44",
secondary: "#9b7eca",
accent: "#7ed4fb",
extra: "#000000",
text: "#ffffff",
alt: "#999999",
background: "#000000",
});
break;
default:
unknown = true;
break;
}
if (unknown) {
write(`${cmd}: unknown ${args[0]} '${args[1]}'`);
} else {
write(`${cmd}: ${args[0]} set to '${args[1]}'`);
}
} else {
if (knownCommands.includes(cmd)) {
write(`${cmd}: unrecognized options '${args.join(" ")}'`);
} else {
write(`${cmd}: command not found`);
}
}
updateTerminal();
}

View File

@@ -0,0 +1,108 @@
@font-face {
font-family: "Monocraft";
src: url("/fonts/Monocraft-ExtraLight.ttf") format("truetype");
font-weight: 100;
font-style: normal;
}
@font-face {
font-family: "Monocraft";
src: url("/fonts/Monocraft-ExtraLight-Italic.ttf") format("truetype");
font-weight: 100;
font-style: italic;
}
@font-face {
font-family: "Monocraft";
src: url("/fonts/Monocraft-ExtraLight.ttf") format("truetype");
font-weight: 200;
font-style: normal;
}
@font-face {
font-family: "Monocraft";
src: url("/fonts/Monocraft-ExtraLight-Italic.ttf") format("truetype");
font-weight: 200;
font-style: italic;
}
@font-face {
font-family: "Monocraft";
src: url("/fonts/Monocraft-Light.ttf") format("truetype");
font-weight: 300;
font-style: normal;
}
@font-face {
font-family: "Monocraft";
src: url("/fonts/Monocraft-Light-Italic.ttf") format("truetype");
font-weight: 300;
font-style: italic;
}
@font-face {
font-family: "Monocraft";
src: url("/fonts/Monocraft.ttf") format("truetype");
font-weight: 400;
font-style: normal;
}
@font-face {
font-family: "Monocraft";
src: url("/fonts/Monocraft-Italic.ttf") format("truetype");
font-weight: 400;
font-style: italic;
}
@font-face {
font-family: "Monocraft";
src: url("/fonts/Monocraft.ttf") format("truetype");
font-weight: 500;
font-style: normal;
}
@font-face {
font-family: "Monocraft";
src: url("/fonts/Monocraft-Italic.ttf") format("truetype");
font-weight: 500;
font-style: italic;
}
@font-face {
font-family: "Monocraft";
src: url("/fonts/Monocraft-SemiBold.ttf") format("truetype");
font-weight: 600;
font-style: normal;
}
@font-face {
font-family: "Monocraft";
src: url("/fonts/Monocraft-SemiBold-Italic.ttf") format("truetype");
font-weight: 600;
font-style: italic;
}
@font-face {
font-family: "Monocraft";
src: url("/fonts/Monocraft-Bold.ttf") format("truetype");
font-weight: 700;
font-style: normal;
}
@font-face {
font-family: "Monocraft";
src: url("/fonts/Monocraft-Bold-Italic.ttf") format("truetype");
font-weight: 700;
font-style: italic;
}
@font-face {
font-family: "Monocraft";
src: url("/fonts/Monocraft-Black.ttf") format("truetype");
font-weight: 800;
font-style: normal;
}
@font-face {
font-family: "Monocraft";
src: url("/fonts/Monocraft-Black-Italic.ttf") format("truetype");
font-weight: 800;
font-style: italic;
}
@font-face {
font-family: "Monocraft";
src: url("/fonts/Monocraft-Black.ttf") format("truetype");
font-weight: 900;
font-style: normal;
}
@font-face {
font-family: "Monocraft";
src: url("/fonts/Monocraft-Black-Italic.ttf") format("truetype");
font-weight: 900;
font-style: italic;
}

View File

@@ -1,5 +1,13 @@
@import url("@styles/fonts/JetBrainsMono.css");
@font-face {
font-family: 'Monocraft';
src: url('/fonts/Monocraft.ttf') format('truetype');
font-weight: 400;
font-style: normal;
font-display: swap;
}
:root {
--primary: #54d7a9;
--secondary: #9b7eca;
@@ -8,6 +16,7 @@
--text: #ffffff;
--alt: #999999;
--background: #000000;
--font: "Jetbrains Mono", monospace;
}
* {
@@ -18,7 +27,7 @@
html {
background-color: var(--background);
color: var(--text);
font-family: "Jetbrains Mono", monospace;
font-family: var(--font);
user-select: none;
}