diff --git a/commands/append.ts b/commands/append.ts new file mode 100644 index 0000000..e69de29 diff --git a/commands/cat.ts b/commands/cat.ts new file mode 100644 index 0000000..e69de29 diff --git a/commands/cd.ts b/commands/cd.ts new file mode 100644 index 0000000..e69de29 diff --git a/commands/clear.ts b/commands/clear.ts new file mode 100644 index 0000000..e69de29 diff --git a/commands/commands.js b/commands/commands.js new file mode 100644 index 0000000..40726cf --- /dev/null +++ b/commands/commands.js @@ -0,0 +1,372 @@ +"use strict"; +exports.__esModule = true; +exports.resolveCommand = void 0; +var SerAny = require('serialize-anything'); +var fs = require('fs'); +function resolveCommand(commandname, socket, args, buffer, sessions, filesystem, curdir, curdirx) { + switch (commandname) { + case "help": + buffer[socket.id] += "Available commands:\n"; + buffer[socket.id] += "help - shows this help\n"; + buffer[socket.id] += "clear - clears the console\n"; + buffer[socket.id] += "exit - exits the console\n"; + buffer[socket.id] += "ls - lists the files in the current directory\n"; + buffer[socket.id] += "cd - changes the current directory\n"; + buffer[socket.id] += "echo - prints the arguments\n"; + buffer[socket.id] += "mkdir - creates a new directory\n"; + buffer[socket.id] += "cat - prints the contents of a file\n"; + buffer[socket.id] += "touch - creates a new file\n"; + buffer[socket.id] += "rm - removes a file\n"; + buffer[socket.id] += "mv - moves a file\n"; + buffer[socket.id] += "cp - copies a file\n"; + buffer[socket.id] += "rmdir - removes a directory\n"; + buffer[socket.id] += "pwd - prints the current directory\n"; + buffer[socket.id] += "exec - executes a file\n"; + buffer[socket.id] += "spam - spams the console\n"; + buffer[socket.id] += "overwrite - overwrites the file with data\n"; + buffer[socket.id] += "append - appends the arguments to a file\n"; + buffer[socket.id] += "screenshot - takes a screenshot\n"; + buffer[socket.id] += "man - display longer help\n"; + buffer[socket.id] += "tree - display directory tree"; + break; + case "man": + if (args.length == 0) { + buffer[socket.id] += "Missing arguments"; + } + switch (args[0]) { + case "help": + buffer[socket.id] += "Prints the list of available commands\n"; + break; + case "clear": + buffer[socket.id] += "Clears the console\n"; + break; + case "exit": + buffer[socket.id] += "Exits the console\n"; + break; + case "ls": + buffer[socket.id] += "Lists the files in the current directory, also displays if file or directory\n"; + break; + case "cd": + buffer[socket.id] += "Changes the current directory\n"; + break; + case "echo": + buffer[socket.id] += "Prints the arguments to the console\n"; + break; + case "mkdir": + buffer[socket.id] += "Creates a new directory in the current directory\n"; + break; + case "cat": + buffer[socket.id] += "Prints the contents of a file out to the console\n"; + break; + case "touch": + buffer[socket.id] += "Creates a new file in the current directory\n"; + break; + case "rm": + buffer[socket.id] += "Removes a file from the current directory\n"; + break; + case "mv": + buffer[socket.id] += "Moves a file from one directory to another\n"; + break; + case "cp": + buffer[socket.id] += "Copies a file from one directory to another\n"; + break; + case "rmdir": + buffer[socket.id] += "Removes a directory from the current directory\n"; + break; + case "pwd": + buffer[socket.id] += "Prints the current directory out to the console\n"; + break; + case "exec": + buffer[socket.id] += "Executes a file in the console, you can \'t use \"exit\" and \"exec\" commands\n"; + break; + case "spam": + buffer[socket.id] += "Spams the console with a message\n"; + break; + case "overwrite": + buffer[socket.id] += "Overwrites a file with from arguments\n"; + break; + case "append": + buffer[socket.id] += "Appends the arguments to a file\n"; + break; + case "screenshot": + buffer[socket.id] += "Takes a screenshot of the console and saves it to a file\n"; + break; + case "man": + buffer[socket.id] += "This manual databank\n"; + break; + default: + buffer[socket.id] += "No such command\n"; + } + break; + case "savesess": + if (args.length == 2) { + if (args[0] == "kryptic") { + sessions[args[1]] = []; + sessions[args[1]]["buffer"] = buffer[socket.id].slice(); + sessions[args[1]]["filesystem"] = JSON.parse(JSON.stringify(filesystem[socket.id])); + sessions[args[1]]["curdir"] = JSON.parse(JSON.stringify(curdir[socket.id])); + var data = SerAny.serialize(sessions); + fs.writeFileSync("./sessions.json", data); + buffer[socket.id] += "Session saved.\n"; + } + else { + buffer[socket.id] += "Invalid command."; + } + } + else { + buffer[socket.id] += "Invalid command."; + } + break; + case "loadsess": + if (args.length == 1) { + sessions = SerAny.deserialize(fs.readFileSync("./sessions.json")); + if (sessions[args[0]] != undefined) { + filesystem[socket.id] = sessions[args[0]]["filesystem"]; + curdir[socket.id] = sessions[args[0]]["curdir"]; + buffer[socket.id] = sessions[args[0]]["buffer"]; + buffer[socket.id] += "Session loaded.\n"; + } + } + else { + } + break; + case "wee": + buffer[socket.id] += "woo\n"; + break; + case "woo": + buffer[socket.id] += "wee\n"; + break; + case "screenshot": + curdir[socket.id][args[0]] = buffer[socket.id]; + buffer[socket.id] += "Screenshot saved to " + args[0] + "\n"; + break; + case "append": + if (args.length == 0) { + buffer[socket.id] += "append: missing operand\n"; + } + else { + if (curdir[socket.id][args[0]] == undefined) { + curdir[socket.id][args[0]] = ""; + } + for (var i = 1; i < args.length; i++) { + curdir[socket.id][args[0]] += args[i] + "\n"; + } + } + break; + case "rm": + if (curdir[socket.id][args[0]] != undefined) { + if (typeof curdir[socket.id][args[0]] == "string") { + delete curdir[socket.id][args[0]]; + buffer[socket.id] += "File " + args[0] + " removed\n"; + } + else { + buffer[socket.id] += "Error: " + args[0] + " is not a file\n"; + } + } + else { + buffer[socket.id] += "Error: " + args[0] + " does not exist\n"; + } + break; + case "mv": + if (curdir[socket.id][args[0]] != undefined) { + if (typeof curdir[socket.id][args[0]] == "string") { + curdir[socket.id][args[1]] = curdir[socket.id][args[0]]; + delete curdir[socket.id][args[0]]; + buffer[socket.id] += "File " + args[0] + " moved to " + args[1] + "\n"; + } + else { + buffer[socket.id] += "Error: " + args[0] + " is not a file\n"; + } + } + else { + buffer[socket.id] += "Error: " + args[0] + " does not exist\n"; + } + break; + case "cp": + if (curdir[socket.id][args[0]] != undefined) { + if (typeof curdir[socket.id][args[0]] == "string") { + curdir[socket.id][args[1]] = curdir[socket.id][args[0]].slice(0); + buffer[socket.id] += "File " + args[0] + " copied to " + args[1] + "\n"; + } + else { + buffer[socket.id] += "Error: " + args[0] + " is not a file\n"; + } + } + else { + buffer[socket.id] += "Error: " + args[0] + " does not exist\n"; + } + break; + case "rmdir": + if (curdir[socket.id][args[0]] != undefined) { + if (typeof curdir[socket.id][args[0]] == "object") { + delete curdir[socket.id][args[0]]; + buffer[socket.id] += "Directory " + args[0] + " removed\n"; + } + else { + buffer[socket.id] += "Error: " + args[0] + " is not a directory\n"; + } + } + else { + buffer[socket.id] += "Error: " + args[0] + " does not exist\n"; + } + break; + case "spam": + for (var i = 0; i < parseInt(args[0]); i++) { + buffer[socket.id] += args.slice(1).join(" ") + "\n"; + } + break; + case "touch": + if (args.length == 0) { + buffer[socket.id] += "touch: missing operand\n"; + } + else { + curdir[socket.id][args[0]] = ""; + } + break; + case "overwrite": + if (args.length == 0) { + buffer[socket.id] += "overwrite: missing operand\n"; + } + else { + curdir[socket.id][args[0]] = ""; + for (var i = 1; i < args.length; i++) { + curdir[socket.id][args[0]] += args[i] + " "; + } + } + break; + case "cat": + if (args.length == 0) { + buffer[socket.id] += "cat: missing operand\n"; + } + else { + var file = args[0]; + if (curdir[socket.id][file] == undefined) { + buffer[socket.id] += "cat: " + file + ": No such file or directory\n"; + } + else if (typeof curdir[socket.id][file] == "string") { + buffer[socket.id] += curdir[socket.id][file] + "\n"; + } + else { + buffer[socket.id] += "cat: " + file + ": Is not a file\n"; + } + } + break; + case "echo": + buffer[socket.id] += args.join(' '); + buffer[socket.id] += "\n"; + break; + case "clear": + buffer[socket.id] = ""; + break; + case "exit": + buffer[socket.id] = ""; + buffer[socket.id] += "Bye!\n"; + socket.disconnect(); + break; + case "exec": + if (args.length == 0) { + buffer[socket.id] += "exec: missing operand\n"; + } + else { + var file = args[0]; + if (curdir[socket.id][file] == undefined) { + buffer[socket.id] += "exec: " + file + ": No such file or directory\n"; + } + else if (typeof curdir[socket.id][file] == "string") { + var commands = curdir[socket.id][file].split("\n"); + for (var i = 0; i < commands.length; i++) { + var exploded = commands[i].split(" "); + var commandx = exploded[0]; + var bannedcommands = ["exec", "exit"]; + if (!bannedcommands.includes(commandx)) { + var argsx = exploded.slice(1); + resolveCommand(commandx, socket, argsx, buffer, sessions, filesystem, curdir, curdirx); + } + else { + buffer[socket.id] += "Error: " + commandx + " is a restricted command\n"; + } + } + } + else { + buffer[socket.id] += "exec: " + file + ": Is not a file\n"; + } + } + break; + case "ls": + buffer[socket.id] += "Files in the current directory:\n"; + for (var key in curdir[socket.id]) { + if (typeof curdir[socket.id][key] == "string") { + buffer[socket.id] += key + " (file)\n"; + } + else if (typeof curdir[socket.id][key] == "object") { + buffer[socket.id] += key + " (directory)\n"; + } + else { + buffer[socket.id] += key + " (unknown)\n"; + } + } + break; + case "cd": + if (args.length == 0) { + buffer[socket.id] += "Please specify a directory.\n"; + } + else { + if (args[0] == "..") { + if (curdirx[socket.id].length > 0) { + var sync = "filesystem[socket.id]"; + for (var i = 0; i < curdirx[socket.id].length; i++) { + sync += "['" + curdirx[socket.id][i] + "']"; + } + sync += " = curdir[socket.id];"; + console.log(sync); + eval(sync); + curdirx[socket.id].pop(); + var cmdexec = "curdir[socket.id] = filesystem[socket.id]"; + for (var i = 0; i < curdirx[socket.id].length; i++) { + cmdexec += "[(curdirx[socket.id][" + i + "])]"; + } + eval(cmdexec); + } + } + else { + if (curdir[socket.id][args[0]] != undefined) { + if (typeof curdir[socket.id][args[0]] == "object") { + curdir[socket.id] = curdir[socket.id][args[0]]; + buffer[socket.id] += "Changed directory to " + args[0] + "\n"; + curdirx[socket.id].push(args[0]); + } + else { + buffer[socket.id] += "cd: " + args[0] + ": Is not a directory\n"; + } + } + else { + buffer[socket.id] += "Directory " + args[0] + " does not exist.\n"; + } + } + } + break; + case "pwd": + var curdirasstring = curdirx[socket.id].join("/"); + buffer[socket.id] += "Current directory: " + curdirasstring + "\n"; + break; + case "mkdir": + if (args.length == 0) { + buffer[socket.id] += "Please specify a directory.\n"; + } + else { + if (curdir[socket.id][args[0]]) { + buffer[socket.id] += "Directory " + args[0] + " already exists.\n"; + } + else { + curdir[socket.id][args[0]] = {}; + buffer[socket.id] += "Created directory " + args[0] + "\n"; + } + } + break; + default: + buffer[socket.id] += "Invalid command.\n"; + } + buffer[socket.id] += "#"; +} +exports.resolveCommand = resolveCommand; +//# sourceMappingURL=commands.js.map \ No newline at end of file diff --git a/commands/commands.js.map b/commands/commands.js.map new file mode 100644 index 0000000..d2b0732 --- /dev/null +++ b/commands/commands.js.map @@ -0,0 +1 @@ +{"version":3,"file":"commands.js","sourceRoot":"","sources":["commands.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/commands/commands.ts b/commands/commands.ts new file mode 100644 index 0000000..f8fee26 --- /dev/null +++ b/commands/commands.ts @@ -0,0 +1,402 @@ +import { Socket } from 'socket.io'; +const SerAny = require('serialize-anything'); +var fs = require('fs'); +function resolveCommand(commandname:string, socket:Socket, args:string[], buffer:{ [id: string]: string }, sessions:any, filesystem:any, curdir:any, curdirx:any) { + switch (commandname) { + case "help": + buffer[socket.id] += "Available commands:\n"; + buffer[socket.id] += "help - shows this help\n"; + buffer[socket.id] += "clear - clears the console\n"; + buffer[socket.id] += "exit - exits the console\n"; + buffer[socket.id] += "ls - lists the files in the current directory\n"; + buffer[socket.id] += "cd - changes the current directory\n"; + buffer[socket.id] += "echo - prints the arguments\n"; + buffer[socket.id] += "mkdir - creates a new directory\n"; + buffer[socket.id] += "cat - prints the contents of a file\n"; + buffer[socket.id] += "touch - creates a new file\n"; + buffer[socket.id] += "rm - removes a file\n"; + buffer[socket.id] += "mv - moves a file\n"; + buffer[socket.id] += "cp - copies a file\n"; + buffer[socket.id] += "rmdir - removes a directory\n"; + buffer[socket.id] += "pwd - prints the current directory\n"; + buffer[socket.id] += "exec - executes a file\n"; + buffer[socket.id] += "spam - spams the console\n"; + buffer[socket.id] += "overwrite - overwrites the file with data\n"; + buffer[socket.id] += "append - appends the arguments to a file\n"; + buffer[socket.id] += "screenshot - takes a screenshot\n"; + buffer[socket.id] += "man - display longer help\n"; + buffer[socket.id] += "tree - display directory tree"; + break; + case "man": + if(args.length == 0){ + buffer[socket.id] += "Missing arguments" + } + switch (args[0]){ + case "help": + buffer[socket.id] += "Prints the list of available commands\n"; + break; + case "clear": + buffer[socket.id] += "Clears the console\n"; + break; + case "exit": + buffer[socket.id] += "Exits the console\n"; + break; + case "ls": + buffer[socket.id] += "Lists the files in the current directory, also displays if file or directory\n"; + break; + case "cd": + buffer[socket.id] += "Changes the current directory\n"; + break; + case "echo": + buffer[socket.id] += "Prints the arguments to the console\n"; + break; + case "mkdir": + buffer[socket.id] += "Creates a new directory in the current directory\n"; + break; + case "cat": + buffer[socket.id] += "Prints the contents of a file out to the console\n"; + break; + case "touch": + buffer[socket.id] += "Creates a new file in the current directory\n"; + break; + case "rm": + buffer[socket.id] += "Removes a file from the current directory\n"; + break; + case "mv": + buffer[socket.id] += "Moves a file from one directory to another\n"; + break; + case "cp": + buffer[socket.id] += "Copies a file from one directory to another\n"; + break; + case "rmdir": + buffer[socket.id] += "Removes a directory from the current directory\n"; + break; + case "pwd": + buffer[socket.id] += "Prints the current directory out to the console\n"; + break; + case "exec": + buffer[socket.id] += "Executes a file in the console, you can \'t use \"exit\" and \"exec\" commands\n"; + break; + case "spam": + buffer[socket.id] += "Spams the console with a message\n"; + break; + case "overwrite": + buffer[socket.id] += "Overwrites a file with from arguments\n"; + break; + case "append": + buffer[socket.id] += "Appends the arguments to a file\n"; + break; + case "screenshot": + buffer[socket.id] += "Takes a screenshot of the console and saves it to a file\n"; + break; + case "man": + buffer[socket.id] += "This manual databank\n" + break + default: + buffer[socket.id] += "No such command\n" + } + break; + case "savesess": + if (args.length == 2) { + if (args[0] == "kryptic") { + sessions[args[1]] = []; + sessions[args[1]]["buffer"] = buffer[socket.id].slice(); + sessions[args[1]]["filesystem"] = JSON.parse(JSON.stringify(filesystem[socket.id])); + sessions[args[1]]["curdir"] = JSON.parse(JSON.stringify(curdir[socket.id])); + var data = SerAny.serialize(sessions); + //write all sessions to a single file called sessions.json + fs.writeFileSync("./sessions.json", data); + + buffer[socket.id] += "Session saved.\n"; + } + else { + buffer[socket.id] += "Invalid command."; + } + } + else { + buffer[socket.id] += "Invalid command."; + } + break; + case "loadsess": + if (args.length == 1) { + sessions = SerAny.deserialize(fs.readFileSync("./sessions.json")); + if(sessions[args[0]] != undefined) { + filesystem[socket.id] = sessions[args[0]]["filesystem"]; + curdir[socket.id] = sessions[args[0]]["curdir"]; + buffer[socket.id] = sessions[args[0]]["buffer"]; + buffer[socket.id] += "Session loaded.\n"; + } + } + else { + + } + break; + case "wee": + buffer[socket.id] += "woo\n"; + break; + case "woo": + buffer[socket.id] += "wee\n"; + break; + //implement more commands + case "screenshot": + curdir[socket.id][args[0]] = buffer[socket.id]; + buffer[socket.id] += "Screenshot saved to " + args[0] + "\n"; + + break; + case "append": + if (args.length == 0) { + buffer[socket.id] += "append: missing operand\n"; + } + else { + if (curdir[socket.id][args[0]] == undefined) { + curdir[socket.id][args[0]] = ""; + } + for (let i = 1; i < args.length; i++) { + curdir[socket.id][args[0]] += args[i] + "\n"; + } + } + break; + case "rm": + if (curdir[socket.id][args[0]] != undefined) { + if (typeof curdir[socket.id][args[0]] == "string") { + delete curdir[socket.id][args[0]]; + buffer[socket.id] += "File " + args[0] + " removed\n"; + } + else { + buffer[socket.id] += "Error: " + args[0] + " is not a file\n"; + } + } + else { + buffer[socket.id] += "Error: " + args[0] + " does not exist\n"; + } + break; + case "mv": + if (curdir[socket.id][args[0]] != undefined) { + if (typeof curdir[socket.id][args[0]] == "string") { + curdir[socket.id][args[1]] = curdir[socket.id][args[0]]; + delete curdir[socket.id][args[0]]; + buffer[socket.id] += "File " + args[0] + " moved to " + args[1] + "\n"; + } + else { + buffer[socket.id] += "Error: " + args[0] + " is not a file\n"; + } + } + else { + buffer[socket.id] += "Error: " + args[0] + " does not exist\n"; + } + break; + case "cp": + if (curdir[socket.id][args[0]] != undefined) { + if (typeof curdir[socket.id][args[0]] == "string") { + curdir[socket.id][args[1]] = curdir[socket.id][args[0]].slice(0); + buffer[socket.id] += "File " + args[0] + " copied to " + args[1] + "\n"; + } + else { + buffer[socket.id] += "Error: " + args[0] + " is not a file\n"; + } + } + else { + buffer[socket.id] += "Error: " + args[0] + " does not exist\n"; + } + break; + case "rmdir": + if (curdir[socket.id][args[0]] != undefined) { + if (typeof curdir[socket.id][args[0]] == "object") { + delete curdir[socket.id][args[0]]; + buffer[socket.id] += "Directory " + args[0] + " removed\n"; + } + else { + buffer[socket.id] += "Error: " + args[0] + " is not a directory\n"; + } + } + else { + buffer[socket.id] += "Error: " + args[0] + " does not exist\n"; + } + break; + case "spam": + //spam arguments times from first argument + for (let i = 0; i < parseInt(args[0]); i++) { + buffer[socket.id] += args.slice(1).join(" ") + "\n"; + } + break; + case "touch": + if (args.length == 0) { + buffer[socket.id] += "touch: missing operand\n"; + } + else { + curdir[socket.id][args[0]] = ""; + } + + break; + case "overwrite": + if (args.length == 0) { + buffer[socket.id] += "overwrite: missing operand\n"; + } + else { + curdir[socket.id][args[0]] = ""; + for (let i = 1; i < args.length; i++) { + curdir[socket.id][args[0]] += args[i] + " "; + } + } + break; + case "cat": + if (args.length == 0) { + buffer[socket.id] += "cat: missing operand\n"; + } + else { + let file = args[0]; + if (curdir[socket.id][file] == undefined) { + buffer[socket.id] += "cat: " + file + ": No such file or directory\n"; + } + //check if type string + else if(typeof curdir[socket.id][file] == "string") { + buffer[socket.id] += curdir[socket.id][file] + "\n"; + } + else{ + buffer[socket.id] += "cat: " + file + ": Is not a file\n"; + } + } + + break; + case "echo": + buffer[socket.id] += args.join(' '); + buffer[socket.id] += "\n"; + break; + case "clear": + buffer[socket.id] = ""; + + break; + case "exit": + buffer[socket.id] = ""; + buffer[socket.id] += "Bye!\n"; + + socket.disconnect(); + break; + case "exec": + if (args.length == 0) { + buffer[socket.id] += "exec: missing operand\n"; + } + else { + let file = args[0]; + if (curdir[socket.id][file] == undefined) { + buffer[socket.id] += "exec: " + file + ": No such file or directory\n"; + } + //check if type string + else if(typeof curdir[socket.id][file] == "string") { + //split string into array of commands + let commands = curdir[socket.id][file].split("\n"); + for (let i = 0; i < commands.length; i++) { + let exploded = commands[i].split(" "); + let commandx = exploded[0]; + let bannedcommands = ["exec", "exit"]; + if (!bannedcommands.includes(commandx)) { + let argsx = exploded.slice(1); + resolveCommand(commandx, socket, argsx, buffer, sessions, filesystem, curdir, curdirx); + } + else{ + buffer[socket.id] += "Error: " + commandx + " is a restricted command\n"; + } + } + } + else{ + buffer[socket.id] += "exec: " + file + ": Is not a file\n"; + } + } + break; + case "ls": + buffer[socket.id] += "Files in the current directory:\n"; + //list only first level files + for (var key in curdir[socket.id]) { + //buffer[socket.id] += key + "\n"; + //also print if it is a directory or file + if (typeof curdir[socket.id][key] == "string") { + buffer[socket.id] += key + " (file)\n"; + } + else if (typeof curdir[socket.id][key] == "object") { + buffer[socket.id] += key + " (directory)\n"; + } + else { + buffer[socket.id] += key + " (unknown)\n"; + } + } + + break; + case "cd": + if (args.length == 0) { + buffer[socket.id] += "Please specify a directory.\n"; + + } + else { + if(args[0] == "..") { + //go up one directory + //recursively scan filesystem until we find curdir and then set curdir to its parent + //check curdirx is not empty + if (curdirx[socket.id].length > 0) { + //pop off last element + var sync = "filesystem[socket.id]"; + for(let i = 0; i < curdirx[socket.id].length; i++) { + sync += "['" + curdirx[socket.id][i] + "']"; + } + sync += " = curdir[socket.id];"; + console.log(sync); + eval(sync); + curdirx[socket.id].pop(); + //curdir = filesystem[socket.id][(curdirx[socket.id][0])][(curdirx[socket.id][1])].......; + //i know i shouldnt use eval but I don't know any other way to do this + var cmdexec = "curdir[socket.id] = filesystem[socket.id]"; + //syncing = write curdir to a path in the filesystem + for (let i = 0; i < curdirx[socket.id].length; i++) { + cmdexec += "[(curdirx[socket.id][" + i + "])]"; + } + eval(cmdexec); + } + } + else { + if (curdir[socket.id][args[0]] != undefined) { + //check if type dict + if (typeof curdir[socket.id][args[0]] == "object") { + curdir[socket.id] = curdir[socket.id][args[0]]; + buffer[socket.id] += "Changed directory to " + args[0] + "\n"; + curdirx[socket.id].push(args[0]); + } + else{ + buffer[socket.id] += "cd: " + args[0] + ": Is not a directory\n"; + } + + } + else { + buffer[socket.id] += "Directory " + args[0] + " does not exist.\n"; + + } + } + } + break; + case "pwd": + var curdirasstring = curdirx[socket.id].join("/"); + buffer[socket.id] += "Current directory: " + curdirasstring + "\n"; + + break; + case "mkdir": + if (args.length == 0) { + buffer[socket.id] += "Please specify a directory.\n"; + + } + else { + if (curdir[socket.id][args[0]]) { + buffer[socket.id] += "Directory " + args[0] + " already exists.\n"; + + } + else { + curdir[socket.id][args[0]] = {}; + buffer[socket.id] += "Created directory " + args[0] + "\n"; + + } + } + break; + //invalid command + default: + buffer[socket.id] += "Invalid command.\n"; + } + buffer[socket.id] += "#"; +} +export {resolveCommand}; \ No newline at end of file diff --git a/commands/cp.ts b/commands/cp.ts new file mode 100644 index 0000000..e69de29 diff --git a/commands/echo.ts b/commands/echo.ts new file mode 100644 index 0000000..e69de29 diff --git a/commands/exec.ts b/commands/exec.ts new file mode 100644 index 0000000..e69de29 diff --git a/commands/exit.ts b/commands/exit.ts new file mode 100644 index 0000000..e69de29 diff --git a/commands/help.ts b/commands/help.ts new file mode 100644 index 0000000..e69de29 diff --git a/commands/ls.ts b/commands/ls.ts new file mode 100644 index 0000000..e69de29 diff --git a/commands/man.ts b/commands/man.ts new file mode 100644 index 0000000..e69de29 diff --git a/commands/mkdir.ts b/commands/mkdir.ts new file mode 100644 index 0000000..e69de29 diff --git a/commands/mv.ts b/commands/mv.ts new file mode 100644 index 0000000..e69de29 diff --git a/commands/overwrite.ts b/commands/overwrite.ts new file mode 100644 index 0000000..e69de29 diff --git a/commands/pwd.ts b/commands/pwd.ts new file mode 100644 index 0000000..e69de29 diff --git a/commands/rm.ts b/commands/rm.ts new file mode 100644 index 0000000..e69de29 diff --git a/commands/rmdir.ts b/commands/rmdir.ts new file mode 100644 index 0000000..e69de29 diff --git a/commands/screenshot.ts b/commands/screenshot.ts new file mode 100644 index 0000000..e69de29 diff --git a/commands/spam.ts b/commands/spam.ts new file mode 100644 index 0000000..e69de29 diff --git a/commands/touch.ts b/commands/touch.ts new file mode 100644 index 0000000..e69de29 diff --git a/index.js b/index.js index 7c95d8b..7889603 100644 --- a/index.js +++ b/index.js @@ -1,15 +1,13 @@ "use strict"; exports.__esModule = true; -var SerAny = require('serialize-anything'); var http = require('http'); var express = require('express'); var app = express(); var server = http.createServer(app); var port = process.env.PORT || 8480; -var fs = require('fs'); var Server = require("socket.io").Server; -var abort = require('process').abort; var io = new Server(server); +var commands_1 = require("./commands/commands"); app.get('/', function (req, res) { res.sendFile(__dirname + '/index.html'); }); @@ -58,7 +56,7 @@ io.on('connection', function (socket) { }); buffer[socket.id] += "\n"; console.log("Executing command: \"" + commandName + "\" with arguments: \"" + commandArgs + "\""); - resolveCommand(commandName, socket, commandArgs); + (0, commands_1.resolveCommand)(commandName, socket, commandArgs, buffer, sessions, filesystem, curdir, curdirx); } else { buffer[socket.id] += key; @@ -70,255 +68,6 @@ io.on('disconnect', function (socket) { console.log('user disconnected'); buffer[socket.id] = ""; }); -function resolveCommand(commandname, socket, args) { - switch (commandname) { - case "help": - buffer[socket.id] += "Available commands:\n"; - buffer[socket.id] += "help - shows this help\n"; - buffer[socket.id] += "clear - clears the console\n"; - buffer[socket.id] += "exit - exits the console\n"; - buffer[socket.id] += "ls - lists the files in the current directory\n"; - buffer[socket.id] += "cd - changes the current directory\n"; - buffer[socket.id] += "echo - prints the arguments\n"; - buffer[socket.id] += "mkdir - creates a new directory\n"; - buffer[socket.id] += "cat - prints the contents of a file\n"; - buffer[socket.id] += "touch - creates a new file\n"; - buffer[socket.id] += "rm - removes a file\n"; - buffer[socket.id] += "mv - moves a file\n"; - buffer[socket.id] += "cp - copies a file\n"; - buffer[socket.id] += "rmdir - removes a directory\n"; - buffer[socket.id] += "spam - spams the console\n"; - buffer[socket.id] += "write - writes the arguments to a file\n"; - buffer[socket.id] += "screenshot - takes a screenshot\n"; - break; - case "savesess": - if (args.length == 2) { - if (args[0] == "kryptic") { - sessions[args[1]] = []; - sessions[args[1]]["buffer"] = buffer[socket.id].slice(); - sessions[args[1]]["filesystem"] = JSON.parse(JSON.stringify(filesystem[socket.id])); - sessions[args[1]]["curdir"] = JSON.parse(JSON.stringify(curdir[socket.id])); - var data = SerAny.serialize(sessions); - fs.writeFileSync("./sessions.json", data); - buffer[socket.id] += "Session saved.\n"; - } - else { - buffer[socket.id] += "Invalid command."; - } - } - else { - buffer[socket.id] += "Invalid command."; - } - break; - case "loadsess": - if (args.length == 1) { - sessions = SerAny.deserialize(fs.readFileSync("./sessions.json")); - if (sessions[args[0]] != undefined) { - filesystem[socket.id] = sessions[args[0]]["filesystem"]; - curdir[socket.id] = sessions[args[0]]["curdir"]; - buffer[socket.id] = sessions[args[0]]["buffer"]; - buffer[socket.id] += "Session loaded.\n"; - } - } - else { - } - break; - case "wee": - buffer[socket.id] += "woo\n"; - break; - case "woo": - buffer[socket.id] += "wee\n"; - break; - case "screenshot": - curdir[socket.id][args[0]] = buffer[socket.id]; - buffer[socket.id] += "Screenshot saved to " + args[0] + "\n"; - break; - case "rm": - if (curdir[socket.id][args[0]] != undefined) { - if (typeof curdir[socket.id][args[0]] == "string") { - delete curdir[socket.id][args[0]]; - buffer[socket.id] += "File " + args[0] + " removed\n"; - } - else { - buffer[socket.id] += "Error: " + args[0] + " is not a file\n"; - } - } - else { - buffer[socket.id] += "Error: " + args[0] + " does not exist\n"; - } - break; - case "mv": - if (curdir[socket.id][args[0]] != undefined) { - if (typeof curdir[socket.id][args[0]] == "string") { - curdir[socket.id][args[1]] = curdir[socket.id][args[0]]; - delete curdir[socket.id][args[0]]; - buffer[socket.id] += "File " + args[0] + " moved to " + args[1] + "\n"; - } - else { - buffer[socket.id] += "Error: " + args[0] + " is not a file\n"; - } - } - else { - buffer[socket.id] += "Error: " + args[0] + " does not exist\n"; - } - break; - case "cp": - if (curdir[socket.id][args[0]] != undefined) { - if (typeof curdir[socket.id][args[0]] == "string") { - curdir[socket.id][args[1]] = curdir[socket.id][args[0]].slice(0); - buffer[socket.id] += "File " + args[0] + " copied to " + args[1] + "\n"; - } - else { - buffer[socket.id] += "Error: " + args[0] + " is not a file\n"; - } - } - else { - buffer[socket.id] += "Error: " + args[0] + " does not exist\n"; - } - break; - case "rmdir": - if (curdir[socket.id][args[0]] != undefined) { - if (typeof curdir[socket.id][args[0]] == "object") { - delete curdir[socket.id][args[0]]; - buffer[socket.id] += "Directory " + args[0] + " removed\n"; - } - else { - buffer[socket.id] += "Error: " + args[0] + " is not a directory\n"; - } - } - else { - buffer[socket.id] += "Error: " + args[0] + " does not exist\n"; - } - break; - case "spam": - for (var i = 0; i < parseInt(args[0]); i++) { - buffer[socket.id] += args.slice(1).join(" ") + "\n"; - } - break; - case "touch": - if (args.length == 0) { - buffer[socket.id] += "touch: missing operand\n"; - } - else { - curdir[socket.id][args[0]] = ""; - } - break; - case "write": - if (args.length == 0) { - buffer[socket.id] += "write: missing operand\n"; - } - else { - curdir[socket.id][args[0]] = ""; - for (var i = 1; i < args.length; i++) { - curdir[socket.id][args[0]] += args[i] + " "; - } - } - break; - case "cat": - if (args.length == 0) { - buffer[socket.id] += "cat: missing operand\n"; - } - else { - var file = args[0]; - if (curdir[socket.id][file] == undefined) { - buffer[socket.id] += "cat: " + file + ": No such file or directory\n"; - } - else if (typeof curdir[socket.id][file] == "string") { - buffer[socket.id] += curdir[socket.id][file] + "\n"; - } - else { - buffer[socket.id] += "cat: " + file + ": Is not a file\n"; - } - } - break; - case "echo": - buffer[socket.id] += args.join(' '); - buffer[socket.id] += "\n"; - break; - case "clear": - buffer[socket.id] = ""; - break; - case "exit": - buffer[socket.id] = ""; - buffer[socket.id] += "Bye!\n"; - socket.disconnect(); - break; - case "ls": - buffer[socket.id] += "Files in the current directory:\n"; - for (var key in curdir[socket.id]) { - if (typeof curdir[socket.id][key] == "string") { - buffer[socket.id] += key + " (file)\n"; - } - else if (typeof curdir[socket.id][key] == "object") { - buffer[socket.id] += key + " (directory)\n"; - } - else { - buffer[socket.id] += key + " (unknown)\n"; - } - } - break; - case "cd": - if (args.length == 0) { - buffer[socket.id] += "Please specify a directory.\n"; - } - else { - if (args[0] == "..") { - if (curdirx[socket.id].length > 0) { - var sync = "filesystem[socket.id]"; - for (var i = 0; i < curdirx[socket.id].length; i++) { - sync += "['" + curdirx[socket.id][i] + "']"; - } - sync += " = curdir[socket.id];"; - console.log(sync); - eval(sync); - curdirx[socket.id].pop(); - var cmdexec = "curdir[socket.id] = filesystem[socket.id]"; - for (var i = 0; i < curdirx[socket.id].length; i++) { - cmdexec += "[(curdirx[socket.id][" + i + "])]"; - } - eval(cmdexec); - } - } - else { - if (curdir[socket.id][args[0]] != undefined) { - if (typeof curdir[socket.id][args[0]] == "object") { - curdir[socket.id] = curdir[socket.id][args[0]]; - buffer[socket.id] += "Changed directory to " + args[0] + "\n"; - curdirx[socket.id].push(args[0]); - } - else { - buffer[socket.id] += "cd: " + args[0] + ": Is not a directory\n"; - } - } - else { - buffer[socket.id] += "Directory " + args[0] + " does not exist.\n"; - } - } - } - break; - case "pwd": - var curdirasstring = curdirx[socket.id].join("/"); - buffer[socket.id] += "Current directory: " + curdirasstring + "\n"; - break; - case "mkdir": - if (args.length == 0) { - buffer[socket.id] += "Please specify a directory.\n"; - } - else { - if (curdir[socket.id][args[0]]) { - buffer[socket.id] += "Directory " + args[0] + " already exists.\n"; - } - else { - curdir[socket.id][args[0]] = {}; - buffer[socket.id] += "Created directory " + args[0] + "\n"; - } - } - break; - default: - buffer[socket.id] += "Invalid command.\n"; - } - buffer[socket.id] += "#"; -} server.listen(port, function () { console.log('Server listening at port %d', port); }); diff --git a/index.js.map b/index.js.map index 6e22ac0..7cbd629 100644 --- a/index.js.map +++ b/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;AACA,IAAM,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAC7C,IAAI,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAC3B,IAAI,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AAEjC,IAAI,GAAG,GAAG,OAAO,EAAE,CAAC;AACpB,IAAI,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;AACpC,IAAI,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;AACpC,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AACf,IAAA,MAAM,GAAK,OAAO,CAAC,WAAW,CAAC,OAAzB,CAA0B;AAChC,IAAA,KAAK,GAAK,OAAO,CAAC,SAAS,CAAC,MAAvB,CAAwB;AAErC,IAAM,EAAE,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;AAC9B,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,UAAC,GAAW,EAAE,GAAY;IACnC,GAAG,CAAC,QAAQ,CAAC,SAAS,GAAG,aAAa,CAAC,CAAC;AAC1C,CAAC,CAAC,CAAC;AAIL,IAAI,MAAM,GAA6B,EAAE,CAAC;AAE1C,IAAI,UAAU,GAAQ,EAAE,CAAC;AAEzB,IAAI,MAAM,GAAQ,EAAE,CAAC;AAErB,IAAI,QAAQ,GAAQ,EAAE,CAAC;AAEvB,IAAI,OAAO,GAAQ,EAAE,CAAC;AAEtB,SAAS,UAAU,CAAC,MAAa,EAAE,OAAiC;IAChE,IAAI,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAE9B,IAAI,IAAI,QAAQ,CAAC;IACjB,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAChC,CAAC;AACD,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,UAAC,MAAa;IAC9B,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;IACvB,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;IAExB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,2BAA2B,CAAC;IAChD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,8CAA8C,CAAC;IACpE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC;IAEzB,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE3B,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,UAAC,IAAI;QACvB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAGjC,IAAI,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAEpC,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAIlB,IAAI,IAAI,IAAI,CAAC,EAAC;YAGV,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,GAAG,EAAE;gBAChC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC/D,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACxC;SACJ;aACI,IAAG,IAAI,IAAI,EAAE,EAAE;YAEhB,IAAI,OAAK,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,OAAO,GAAG,OAAK,CAAC,OAAK,CAAC,MAAM,GAAC,CAAC,CAAC,CAAC;YAEpC,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAE/B,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YACnE,IAAI,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAEhC,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,UAAS,GAAG;gBACtC,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;YACtB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;YAE1B,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,WAAW,GAAG,uBAAuB,GAAG,WAAW,GAAG,IAAI,CAAC,CAAC;YAClG,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;SACpD;aACG;YAEA,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC;SAC5B;QAED,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AACH,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,UAAC,MAAa;IAC9B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACjC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;AAC3B,CAAC,CAAC,CAAC;AACH,SAAS,cAAc,CAAC,WAAkB,EAAE,MAAa,EAAE,IAAa;IACpE,QAAQ,WAAW,EAAE;QACjB,KAAK,MAAM;YACP,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,uBAAuB,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,0BAA0B,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,8BAA8B,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,4BAA4B,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,iDAAiD,CAAC;YACvE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,sCAAsC,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,+BAA+B,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,mCAAmC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,uCAAuC,CAAC;YAC7D,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,8BAA8B,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,uBAAuB,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,qBAAqB,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,sBAAsB,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,+BAA+B,CAAC;YAErD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,4BAA4B,CAAC;YAElD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,0CAA0C,CAAC;YAEhE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,mCAAmC,CAAC;YACzD,MAAM;QACV,KAAK,UAAU;YACX,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE;gBAClB,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE;oBACtB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;oBACvB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;oBACxD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBACpF,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC5E,IAAI,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;oBAEtC,EAAE,CAAC,aAAa,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;oBAE1C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,kBAAkB,CAAC;iBAC3C;qBACI;oBACD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,kBAAkB,CAAC;iBAC3C;aACJ;iBACI;gBACD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,kBAAkB,CAAC;aAC3C;YACD,MAAM;QACV,KAAK,UAAU;YACX,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE;gBAClB,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBAClE,IAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE;oBAC/B,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;oBACxD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;oBAChD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;oBAChD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,mBAAmB,CAAC;iBAC5C;aACJ;iBACI;aAEJ;YACD,MAAM;QAEV,KAAK,KAAK;YACN,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC;YAC7B,MAAM;QACV,KAAK,KAAK;YACN,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC;YAC7B,MAAM;QAEV,KAAK,YAAY;YACb,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,sBAAsB,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YAE7D,MAAM;QACV,KAAK,IAAI;YACL,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE;gBACzC,IAAI,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE;oBAC/C,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC;iBACzD;qBACI;oBACD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC;iBACjE;aACJ;iBACI;gBACD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC;aAClE;YACD,MAAM;QACV,KAAK,IAAI;YACL,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE;gBACzC,IAAI,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE;oBAC/C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBACxD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;iBAC1E;qBACI;oBACD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC;iBACjE;aACJ;iBACI;gBACD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC;aAClE;YACD,MAAM;QACV,KAAK,IAAI;YACL,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE;gBACzC,IAAI,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE;oBAC/C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACjE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,aAAa,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;iBAC3E;qBACI;oBACD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC;iBACjE;aACJ;iBACI;gBACD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC;aAClE;YACD,MAAM;QACV,KAAK,OAAO;YACR,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE;gBACzC,IAAI,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE;oBAC/C,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC;iBAC9D;qBACI;oBACD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,uBAAuB,CAAC;iBACtE;aACJ;iBACI;gBACD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC;aAClE;YACD,MAAM;QACV,KAAK,MAAM;YAEP,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACxC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;aACvD;YACD,MAAM;QACV,KAAK,OAAO;YACR,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE;gBAClB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,0BAA0B,CAAC;aACnD;iBACI;gBACD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;aACnC;YAED,MAAM;QACV,KAAK,OAAO;YACR,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE;gBAClB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,0BAA0B,CAAC;aACnD;iBACI;gBACD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;gBAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBAClC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;iBAC/C;aACJ;YACD,MAAM;QACV,KAAK,KAAK;YACN,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE;gBAClB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,wBAAwB,CAAC;aACjD;iBACI;gBACD,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACnB,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE;oBACtC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,OAAO,GAAG,IAAI,GAAG,+BAA+B,CAAC;iBACzE;qBAEI,IAAG,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE;oBAChD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;iBACvD;qBACG;oBACA,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,OAAO,GAAG,IAAI,GAAG,mBAAmB,CAAC;iBAC7D;aACJ;YAED,MAAM;QACV,KAAK,MAAM;YACP,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;YAC1B,MAAM;QACV,KAAK,OAAO;YACR,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;YAEvB,MAAM;QACV,KAAK,MAAM;YACP,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC;YAE9B,MAAM,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM;QACV,KAAK,IAAI;YACL,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,mCAAmC,CAAC;YAEzD,KAAK,IAAI,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;gBAG/B,IAAI,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,QAAQ,EAAE;oBAC3C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,GAAG,WAAW,CAAC;iBAC1C;qBACI,IAAI,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,QAAQ,EAAE;oBAChD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,GAAG,gBAAgB,CAAC;iBAC/C;qBACI;oBACD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,GAAG,cAAc,CAAC;iBAC7C;aACJ;YAED,MAAM;QACV,KAAK,IAAI;YACL,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE;gBAClB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,+BAA+B,CAAC;aAExD;iBACI;gBACD,IAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE;oBAIhB,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;wBAE/B,IAAI,IAAI,GAAG,uBAAuB,CAAC;wBACnC,KAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;4BAC/C,IAAI,IAAI,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;yBAC/C;wBACD,IAAI,IAAI,uBAAuB,CAAC;wBAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;wBAClB,IAAI,CAAC,IAAI,CAAC,CAAC;wBACX,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;wBAGzB,IAAI,OAAO,GAAG,2CAA2C,CAAC;wBAE1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;4BAChD,OAAO,IAAI,uBAAuB,GAAG,CAAC,GAAG,KAAK,CAAC;yBAClD;wBACD,IAAI,CAAC,OAAO,CAAC,CAAC;qBACjB;iBACJ;qBACI;oBACD,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE;wBAEzC,IAAI,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE;4BAC/C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;4BAC/C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,uBAAuB,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;4BAC9D,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;yBACpC;6BACG;4BACA,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,wBAAwB,CAAC;yBACpE;qBAEJ;yBACI;wBACD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,oBAAoB,CAAC;qBAEtE;iBACJ;aACJ;YACD,MAAM;QACV,KAAK,KAAK;YACN,IAAI,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAElD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,qBAAqB,GAAG,cAAc,GAAG,IAAI,CAAC;YAEnE,MAAM;QACV,KAAK,OAAO;YACR,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE;gBAClB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,+BAA+B,CAAC;aAExD;iBACI;gBACD,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;oBAC5B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,oBAAoB,CAAC;iBAEtE;qBACI;oBACD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;oBAChC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,oBAAoB,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;iBAE9D;aACJ;YACD,MAAM;QAEV;YACI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,oBAAoB,CAAC;KACjD;IACD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC;AAE7B,CAAC;AACD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;IAChB,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC,CAAC,CAAC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/index.ts b/index.ts index 5cd8f1a..1622ff3 100644 --- a/index.ts +++ b/index.ts @@ -1,16 +1,16 @@ //start ws server with socket.io -const SerAny = require('serialize-anything'); var http = require('http'); var express = require('express'); import { Request, Response } from 'express'; var app = express(); var server = http.createServer(app); var port = process.env.PORT || 8480; -var fs = require('fs'); const { Server } = require("socket.io"); -const { abort } = require('process'); import { Socket } from 'socket.io'; const io = new Server(server); +//get resolvecommand from commands.ts +import { resolveCommand } from './commands/commands'; + app.get('/', (req:Request, res:Response) => { res.sendFile(__dirname + '/index.html'); }); @@ -85,7 +85,7 @@ io.on('connection', (socket:Socket) => { buffer[socket.id] += "\n"; //remove # in beginning of commandname console.log("Executing command: \"" + commandName + "\" with arguments: \"" + commandArgs + "\""); - resolveCommand(commandName, socket, commandArgs); + resolveCommand(commandName, socket, commandArgs, buffer, sessions, filesystem, curdir, curdirx); } else{ //add key to buffer @@ -99,292 +99,7 @@ io.on('disconnect', (socket:Socket) => { console.log('user disconnected'); buffer[socket.id] = ""; }); -function resolveCommand(commandname:string, socket:Socket, args:string[]) { - switch (commandname) { - case "help": - buffer[socket.id] += "Available commands:\n"; - buffer[socket.id] += "help - shows this help\n"; - buffer[socket.id] += "clear - clears the console\n"; - buffer[socket.id] += "exit - exits the console\n"; - buffer[socket.id] += "ls - lists the files in the current directory\n"; - buffer[socket.id] += "cd - changes the current directory\n"; - buffer[socket.id] += "echo - prints the arguments\n"; - buffer[socket.id] += "mkdir - creates a new directory\n"; - buffer[socket.id] += "cat - prints the contents of a file\n"; - buffer[socket.id] += "touch - creates a new file\n"; - buffer[socket.id] += "rm - removes a file\n"; - buffer[socket.id] += "mv - moves a file\n"; - buffer[socket.id] += "cp - copies a file\n"; - buffer[socket.id] += "rmdir - removes a directory\n"; - //spam - buffer[socket.id] += "spam - spams the console\n"; - //command to write rest of args to file - buffer[socket.id] += "write - writes the arguments to a file\n"; - //command to take a screenshot which is saved in the current directory with filename from args - buffer[socket.id] += "screenshot - takes a screenshot\n"; - break; - case "savesess": - if (args.length == 2) { - if (args[0] == "kryptic") { - sessions[args[1]] = []; - sessions[args[1]]["buffer"] = buffer[socket.id].slice(); - sessions[args[1]]["filesystem"] = JSON.parse(JSON.stringify(filesystem[socket.id])); - sessions[args[1]]["curdir"] = JSON.parse(JSON.stringify(curdir[socket.id])); - var data = SerAny.serialize(sessions); - //write all sessions to a single file called sessions.json - fs.writeFileSync("./sessions.json", data); - - buffer[socket.id] += "Session saved.\n"; - } - else { - buffer[socket.id] += "Invalid command."; - } - } - else { - buffer[socket.id] += "Invalid command."; - } - break; - case "loadsess": - if (args.length == 1) { - sessions = SerAny.deserialize(fs.readFileSync("./sessions.json")); - if(sessions[args[0]] != undefined) { - filesystem[socket.id] = sessions[args[0]]["filesystem"]; - curdir[socket.id] = sessions[args[0]]["curdir"]; - buffer[socket.id] = sessions[args[0]]["buffer"]; - buffer[socket.id] += "Session loaded.\n"; - } - } - else { - - } - break; - case "wee": - buffer[socket.id] += "woo\n"; - break; - case "woo": - buffer[socket.id] += "wee\n"; - break; - //implement more commands - case "screenshot": - curdir[socket.id][args[0]] = buffer[socket.id]; - buffer[socket.id] += "Screenshot saved to " + args[0] + "\n"; - - break; - case "rm": - if (curdir[socket.id][args[0]] != undefined) { - if (typeof curdir[socket.id][args[0]] == "string") { - delete curdir[socket.id][args[0]]; - buffer[socket.id] += "File " + args[0] + " removed\n"; - } - else { - buffer[socket.id] += "Error: " + args[0] + " is not a file\n"; - } - } - else { - buffer[socket.id] += "Error: " + args[0] + " does not exist\n"; - } - break; - case "mv": - if (curdir[socket.id][args[0]] != undefined) { - if (typeof curdir[socket.id][args[0]] == "string") { - curdir[socket.id][args[1]] = curdir[socket.id][args[0]]; - delete curdir[socket.id][args[0]]; - buffer[socket.id] += "File " + args[0] + " moved to " + args[1] + "\n"; - } - else { - buffer[socket.id] += "Error: " + args[0] + " is not a file\n"; - } - } - else { - buffer[socket.id] += "Error: " + args[0] + " does not exist\n"; - } - break; - case "cp": - if (curdir[socket.id][args[0]] != undefined) { - if (typeof curdir[socket.id][args[0]] == "string") { - curdir[socket.id][args[1]] = curdir[socket.id][args[0]].slice(0); - buffer[socket.id] += "File " + args[0] + " copied to " + args[1] + "\n"; - } - else { - buffer[socket.id] += "Error: " + args[0] + " is not a file\n"; - } - } - else { - buffer[socket.id] += "Error: " + args[0] + " does not exist\n"; - } - break; - case "rmdir": - if (curdir[socket.id][args[0]] != undefined) { - if (typeof curdir[socket.id][args[0]] == "object") { - delete curdir[socket.id][args[0]]; - buffer[socket.id] += "Directory " + args[0] + " removed\n"; - } - else { - buffer[socket.id] += "Error: " + args[0] + " is not a directory\n"; - } - } - else { - buffer[socket.id] += "Error: " + args[0] + " does not exist\n"; - } - break; - case "spam": - //spam arguments times from first argument - for (let i = 0; i < parseInt(args[0]); i++) { - buffer[socket.id] += args.slice(1).join(" ") + "\n"; - } - break; - case "touch": - if (args.length == 0) { - buffer[socket.id] += "touch: missing operand\n"; - } - else { - curdir[socket.id][args[0]] = ""; - } - - break; - case "write": - if (args.length == 0) { - buffer[socket.id] += "write: missing operand\n"; - } - else { - curdir[socket.id][args[0]] = ""; - for (let i = 1; i < args.length; i++) { - curdir[socket.id][args[0]] += args[i] + " "; - } - } - break; - case "cat": - if (args.length == 0) { - buffer[socket.id] += "cat: missing operand\n"; - } - else { - let file = args[0]; - if (curdir[socket.id][file] == undefined) { - buffer[socket.id] += "cat: " + file + ": No such file or directory\n"; - } - //check if type string - else if(typeof curdir[socket.id][file] == "string") { - buffer[socket.id] += curdir[socket.id][file] + "\n"; - } - else{ - buffer[socket.id] += "cat: " + file + ": Is not a file\n"; - } - } - - break; - case "echo": - buffer[socket.id] += args.join(' '); - buffer[socket.id] += "\n"; - break; - case "clear": - buffer[socket.id] = ""; - - break; - case "exit": - buffer[socket.id] = ""; - buffer[socket.id] += "Bye!\n"; - - socket.disconnect(); - break; - case "ls": - buffer[socket.id] += "Files in the current directory:\n"; - //list only first level files - for (var key in curdir[socket.id]) { - //buffer[socket.id] += key + "\n"; - //also print if it is a directory or file - if (typeof curdir[socket.id][key] == "string") { - buffer[socket.id] += key + " (file)\n"; - } - else if (typeof curdir[socket.id][key] == "object") { - buffer[socket.id] += key + " (directory)\n"; - } - else { - buffer[socket.id] += key + " (unknown)\n"; - } - } - - break; - case "cd": - if (args.length == 0) { - buffer[socket.id] += "Please specify a directory.\n"; - - } - else { - if(args[0] == "..") { - //go up one directory - //recursively scan filesystem until we find curdir and then set curdir to its parent - //check curdirx is not empty - if (curdirx[socket.id].length > 0) { - //pop off last element - var sync = "filesystem[socket.id]"; - for(let i = 0; i < curdirx[socket.id].length; i++) { - sync += "['" + curdirx[socket.id][i] + "']"; - } - sync += " = curdir[socket.id];"; - console.log(sync); - eval(sync); - curdirx[socket.id].pop(); - //curdir = filesystem[socket.id][(curdirx[socket.id][0])][(curdirx[socket.id][1])].......; - //i know i shouldnt use eval but I don't know any other way to do this - var cmdexec = "curdir[socket.id] = filesystem[socket.id]"; - //syncing = write curdir to a path in the filesystem - for (let i = 0; i < curdirx[socket.id].length; i++) { - cmdexec += "[(curdirx[socket.id][" + i + "])]"; - } - eval(cmdexec); - } - } - else { - if (curdir[socket.id][args[0]] != undefined) { - //check if type dict - if (typeof curdir[socket.id][args[0]] == "object") { - curdir[socket.id] = curdir[socket.id][args[0]]; - buffer[socket.id] += "Changed directory to " + args[0] + "\n"; - curdirx[socket.id].push(args[0]); - } - else{ - buffer[socket.id] += "cd: " + args[0] + ": Is not a directory\n"; - } - - } - else { - buffer[socket.id] += "Directory " + args[0] + " does not exist.\n"; - - } - } - } - break; - case "pwd": - var curdirasstring = curdirx[socket.id].join("/"); - - buffer[socket.id] += "Current directory: " + curdirasstring + "\n"; - - break; - case "mkdir": - if (args.length == 0) { - buffer[socket.id] += "Please specify a directory.\n"; - - } - else { - if (curdir[socket.id][args[0]]) { - buffer[socket.id] += "Directory " + args[0] + " already exists.\n"; - - } - else { - curdir[socket.id][args[0]] = {}; - buffer[socket.id] += "Created directory " + args[0] + "\n"; - - } - } - break; - //invalid command - default: - buffer[socket.id] += "Invalid command.\n"; - } - buffer[socket.id] += "#"; - -} server.listen(port, function() { console.log('Server listening at port %d', port); }); \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index df4c454..12d2852 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,6 +4,7 @@ "noImplicitAny": true, "removeComments": true, "preserveConstEnums": true, + "suppressImplicitAnyIndexErrors": true, "sourceMap": true }, "files": [