TerminalHomepage/js/commands.js

280 lines
8.4 KiB
JavaScript

// Run input as command if possible
function runCommand(input) {
// Return on no input
if (input === "")
return "";
// Get current mode
const modeSplit = chatMode.split(' ');
if (modeSplit[0] !== "default") {
const lowerIn = input.toLowerCase();
// Run exit command in other mode
if (lowerIn.startsWith("exit")) {
cmd_exit();
return "";
// Run clear command in other modes
} else if (lowerIn.startsWith("clear")) {
cmd_clear();
return "";
}
}
// Handle different chat modes
switch (modeSplit[0]) {
case "msg":
// Send direct message, rename previous pretext to own name
directMessage(modeSplit[1].split(','), input);
renameToSelf();
// Return without message
return "";
case "chat":
// Send group message, rename previous pretext to own name
groupMessage(modeSplit[1].split(','), input);
renameToSelf();
// Return without message
return "";
}
// Default chat mode:
let output = "";
const lowerIn = input.toLowerCase();
// Go through properties of window
for (const func in window) {
const splits = func.split("cmd_");
// If property is prefixed with 'cmd_' (a 'command', so an executable function)
if (splits.length === 2) {
const name = splits[1];
const lowerNm = name.toLowerCase();
// If command is called without parameters
if (lowerIn === lowerNm) {
output = window[func]();
break;
// If command is called with parameters
} else if (lowerIn.startsWith(lowerNm + " ")) {
// Parameters always follow the command name after first space
const params = input.split(" ").filter((e,i)=>i!==0);
output = window[func](params);
break;
}
}
}
// Standard output:
if (output === "")
output = `${input.split(" ")[0]}: command not found`;
if (output === undefined)
output = "";
// Return command output
return output;
}
// Display 'help' message
function cmd_help() {
return "Commands list:<br>" +
" -about Information about this website<br>"+
" -reload Reload the page (deletes all session data)<br>" +
" -clear Clear terminal screen (keeps all session data)<br>" +
" -history Displays the command history of this session<br>" +
" -exec Execute arbitrary math and logic equations<br>" +
" -nick Choose your username. Do not use spaces in it<br>" +
" -msg Open a direct chat to the provided user/-s by name<br>" +
" -ls List all connected users by name and id<br>" +
" -ping Ping the host to request two-way-delay<br>" +
" -chat Open a group chat to the provided chat/-s by name<br>" +
" -logout Disconnect from the host. This deletes your user";
}
// Display 'about' message
function cmd_about() {
return "This website is based on the general idea and design of a terminal.<br>" +
"It serves the purpose of a homepage. It exists just for the fun of creating it.";
}
// Reload page
function cmd_reload() {
window.location.reload();
// Return without message
return null;
}
// Clear terminal window
function cmd_clear() {
setTimeout(() => {
// Remove all children except core elements and banner
const tbc = tbDiv.children;
for (let i = tbc.length-3; i > 1; i--)
tbDiv.removeChild(tbc[i]);
// Replace last child with new (current) pretext
const prelink = document.createElement("a");
prelink.innerHTML = pretext.current;
tbDiv.replaceChild(prelink, tbc[1]);
// Reset cursor position
cursorPosition = 0;
cursorYOffset = 7;
updateCursor();
}, 50);
// Return without message
return null;
}
// Display the command history line by line
function cmd_history() {
let output = "";
// Get history
const hl = history.list;
for (let i = 0; i < hl.length; i++) {
// Add line break on every command except last
const lineBreak = (i !== hl.length - 1) ? "<br>" : "";
output += `${i+1} ${hl[i]}${lineBreak}`;
}
// Return output list
return output;
}
// Execute arbitrary math and logic equations
function cmd_exec(input) {
// No input was given
if (input === undefined)
return "You must enter parameters!";
// Input contains letters or invalid characters
const str = input.join(' ');
if (/[',:;a-zA-Z]/.test(str) || str === "")
return "Invalid input!";
// Input is inside of character range with exceptions
const chars = str.split('').filter(e => {
const code = e.charCodeAt(0);
const s = code === 32;
const a = code > 36;
const b = code < 63;
const c = code === 94;
const d = code === 124;
return !(s || a && b || c || d);
});
// If exceptions remain, invalid input was given
if (chars.length > 0)
return "Invalid input!";
// Execute input and return output
return eval(str).toString();
}
// Echo out any given text
function cmd_echo(input) {
if (input === undefined)
return " ";
return input.join(' ');
}
// Set users' name
function cmd_nick(input) {
if (input === undefined)
return "No nickname was given!";
// Rename user
if (!!window.localStorage.getItem("connected"))
sendNickname(input[0]);
// Connect with given name
else
connect(input[0]);
return null;
}
// Check whether user is allowed to chat
function canChatCheck(input) {
if (input === undefined)
return "No recipient was given!";
if (!window.localStorage.getItem("connected"))
return "You are not connected! Use the 'nick' command to connect using your username.";
if (window.localStorage.getItem("name") === "")
return "You do not have a name!";
return "";
}
// Initialize messaging
function messagingIniti(mode, name) {
// Get recipient username without spaces and pretext
pretext.current = `Chat (${name})> `;
// Set chat mode to direct messages and start pulling
chatMode = `${mode} ${name}`;
const ownName = window.localStorage.getItem("name");
const id = window.localStorage.getItem("id");
const encode = encodeURIComponent(`${ownName}#${id}`);
userData.chat = new EventSource(`/getChat?full=${encode}`);
userData.chat.onmessage = (event) => {
const data = JSON.parse(event.data);
outputText({
preNext: `${data.from}: `,
output: data.message
});
}
}
// Initialize direct chat
function cmd_msg(input) {
let output = canChatCheck(input);
if (output !== "") return output;
messagingIniti('msg', input[0]);
}
// Exit current level (example: chat -> main)
function cmd_exit(error) {
const level = chatMode.split(' ')[0];
if (level === "default")
return "Already at top-level!";
// Set mode to default and reset pretext
chatMode = "default";
pretext.current = pretext.original;
// Do individual resets
switch (level) {
case "chat":
case "msg":
// Stop chat pulling
userData.chat.close();
userData.chat = null;
break;
}
// Exit was called automatically. Print error.
if (error)
outputText({output: error});
}
// List all users to be able to chat with
function cmd_ls() {
if (!window.localStorage.getItem("connected"))
return "You are not connected! Use the 'nick' command to connect using your username.";
requestUsernames();
return null;
}
// Ping host for two-way-delay
function cmd_ping() {
if (!window.localStorage.getItem("connected"))
return "You are not connected! Use the 'nick' command to connect using your username.";
requestPing();
return null;
}
// User wants to log out
function cmd_logout() {
if (!window.localStorage.getItem("connected"))
return "You are not even connected yet!";
disconnect();
}
// Initialize group chat
function cmd_chat(input) {
let output = canChatCheck(input);
if (output !== "") return output;
messagingIniti('chat', input[0]);
sendChatInit(input[0].split(','));
}