diff --git a/commands/commands.js b/commands/commands.js index c2ca8ab..67ee96f 100644 --- a/commands/commands.js +++ b/commands/commands.js @@ -2,6 +2,7 @@ let currentState = { "username": "guest", "directory": "/" } + const fileSystem = require("../filesystem.json") function getCurrentDir(){ @@ -15,8 +16,6 @@ function customTextResponse(res, txt){ function ls(res) { const command = "ls"; - - const contents = fileSystem[currentState.directory]; if (contents && typeof contents === 'object') { @@ -27,13 +26,125 @@ function ls(res) { } } +function whoami(res){ + const command = "whoami" + respondToCommand(res, currentState.username, currentState.directory, command); +} +function cd (res, raw_command) { + const command = "cd"; + let arguement = raw_command.split(" ")[1] + + //check if folder to cd to is in current dir + const contents = fileSystem[currentState.directory]; + + if (contents && typeof contents==="object"){ + let keys = Object.keys(contents); + for (let i = 0; i < keys.length; i++){ + let key = keys[i] + + if (key == arguement && fileSystem[currentState.directory][key] == "dir"){ + currentState.directory = currentState.directory + arguement; + + if (!currentState.directory.endsWith("/")) currentState.directory += "/"; + respondToCommand(res, "", currentState.directory, command); + return; + } + else if (key == arguement){ + respondToCommand(res, "You cannot open a file as a directory", currentState.directory, command); + return; + } + } + + // check a few things: + if (arguement == "/" || arguement == "~" || arguement == "~/"){ + currentState.directory = "/"; + respondToCommand(res, "", currentState.directory, command); + return; + } + + if (arguement == ".." || arguement == "../"){ + //move 1 folder back + const lastSlashIndex = currentState.directory.lastIndexOf('/'); + const pathWithoutTrailingSlash = lastSlashIndex === currentState.directory.length - 1 ? currentState.directory.substring(0, currentState.directory.length - 1) : currentState.directory; + const secondLastSlashIndex = pathWithoutTrailingSlash.lastIndexOf('/'); + currentState.directory = pathWithoutTrailingSlash.substring(0, secondLastSlashIndex + 1); + + respondToCommand(res, "", currentState.directory, command); + return; + } + + respondToCommand(res, "Unable to open directory", currentState.directory, command); + } + else + { + respondToCommand(res, "Internal Server Error, try again later.", currentState.directory, command) + } +} + +function pwd (res){ + const command = "pwd"; + respondToCommand(res, currentState.directory, currentState.directory, command); +} + +function cat (res, raw_command){ + const command = "cat"; + let arguement = raw_command.split(" ")[1] + + //check if folder to cd to is in current dir + const contents = fileSystem[currentState.directory]; + + if (contents && typeof contents==="object"){ + let keys = Object.keys(contents); + for (let i = 0; i < keys.length; i++){ + let key = keys[i] + + if (key == arguement && fileSystem[currentState.directory][key] != "dir"){ + respondToCommand(res, fileSystem[currentState.directory][key], currentState.directory, command); + return; + } + else if (key == arguement){ + respondToCommand(res, "You cannot open a directory as a file", currentState.directory, command); + return; + } + } + respondToCommand(res, "Unable to open file", currentState.directory, command) + } + else + { + respondToCommand(res, "Internal Server Error, try again later.", currentState.directory, command) + } + +} + + + +function help(res){ + const command = "help" + const text = ` + Welcome to the fancy help menu!!
+ Here is a list of the available commands:

+ + "help" - shows you this menu
+ "ls" - shows you the files and directories in your current directory
+ "cd" - move into a folder you specify, you can use the name of the folder, or you can also use things like ../ to move back one folder
+ "whoami" - shows you as what user you are logged in as
+ "pwd" - shows you the current directory you are currently working in
+ "cat" - shows you the content of files, fox example cat file.txt shows you the content of file.txt if it is in the current directory
+ ` + respondToCommand(res, text, currentState.directory, command); +} module.exports = { getCurrentDir, customTextResponse, - ls + ls, + whoami, + cd, + pwd, + cat, + help, } diff --git a/filesystem.json b/filesystem.json index b014d2a..18772a8 100644 --- a/filesystem.json +++ b/filesystem.json @@ -1,10 +1,18 @@ { "/": { - "file1.txt": "this is the content of file1", - "projects": "dir" + "file1.txt": "this is the content of file1
i like cheese :)", + "projects": "dir", + "another_folder": "dir" }, "/projects/": { "file2.txt": "this is file 2 :0", - "file3.txt": "and file 3 :D" + "file3.txt": "and file 3 :D", + "kaas": "dir" + }, + "/projects/kaas/": { + "file4.txt": "HOW DARE YOU OPEN THIS FILE,
NOW YOU WILL BURN IN HELL >:(" + }, + "/another_folder/": { + "main.py": "this is totally a python script :)" } } \ No newline at end of file diff --git a/httpdocs/public/js/terminal.js b/httpdocs/public/js/terminal.js index 0fec9e3..d0b517a 100644 --- a/httpdocs/public/js/terminal.js +++ b/httpdocs/public/js/terminal.js @@ -11,17 +11,20 @@ async function sendCommand(e){ const command = e.target.value; deactivateAllStuff(); - if (command == "clear"){ + if (command.trim() == "clear"){ lines = document.querySelectorAll(".terminalLine").forEach((line)=>{ line.remove(); }) createNewTerminalLine(); return; } + else if (command.trim() == "logout" || command.trim() == "exit"){ + window.location.href = "https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwj2jve6z_iDAxWb9rsIHflPD_sQwqsBegQIDxAF&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DdQw4w9WgXcQ&usg=AOvVaw0aHtehaphMhOCAkCydRLZU&opi=89978449" + } try { // Construct the URL with the command parameter in the query string - const url = "/execute?command=" + encodeURIComponent(command) + "¤tDir=" + encodeURIComponent(currentFolder); + const url = "/execute?command=" + encodeURIComponent(command); // Make a GET request using the fetch API const response = await fetch(url); @@ -96,11 +99,14 @@ function createNewTerminalLine(){ pathColon.innerHTML = ":"; pathColon.classList.add("pathColon"); - let pathPath = document.createElement("h4"); - pathPath.innerHTML = "~"+currentFolder; - pathPath.classList.add("pathPath"); - + fetch('/currentDir') + .then(response => response.text()) + .then(data => { + pathPath.innerHTML = "~"+data; + pathPath.classList.add("pathPath"); + }) + .catch(error => console.error('Error:', error)); let pathDollar = document.createElement("h4"); pathDollar.innerHTML = "$"; diff --git a/server.js b/server.js index 74234c6..5ed875d 100644 --- a/server.js +++ b/server.js @@ -18,7 +18,7 @@ app.get("/execute", (req, res)=> { if (raw_command == ""){ commands.customTextResponse(res, ""); return; - } + }a const formatted_command = raw_command.trim(); const command = formatted_command.split(" ")[0] @@ -29,6 +29,21 @@ app.get("/execute", (req, res)=> { break; case "ls": commands.ls(res); + break; + case "whoami": + commands.whoami(res); + break; + case "cd": + commands.cd(res, formatted_command); + break; + case "pwd": + commands.pwd(res); + break; + case "cat": + commands.cat(res, formatted_command ) + break; + case "help": + commands.help(res); } })