207 lines
6.1 KiB
JavaScript
207 lines
6.1 KiB
JavaScript
const terminalContainer = document.getElementById("terminal");
|
|
const hostname = `192.168.${Math.floor(Math.random() * 100)}.${Math.floor(Math.random() * 255)}`;
|
|
|
|
|
|
document.addEventListener("DOMContentLoaded", function () {
|
|
createNewTerminalLine()
|
|
document.querySelector(".pathText").innerHTML = `guest@${hostname}`;
|
|
addInputEventListeners();
|
|
});
|
|
|
|
async function sendCommand(e){
|
|
const command = e.target.value;
|
|
deactivateAllStuff();
|
|
|
|
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);
|
|
|
|
// Make a GET request using the fetch API
|
|
const response = await fetch(url);
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`Error: ${response.status} - ${response.statusText}`);
|
|
}
|
|
|
|
// Parse the JSON response
|
|
const files = await response.json();
|
|
|
|
// Handle the execution response
|
|
handleExecutionResponse(files);
|
|
} catch (error) {
|
|
console.error("Error:", error.message);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function deactivateAllStuff() {
|
|
const blinkies = document.querySelectorAll(".pathBlinky");
|
|
for (let i = 0; i < blinkies.length; i++){
|
|
blinkies[i].remove();
|
|
}
|
|
|
|
const actives = document.querySelectorAll(".activeLine");
|
|
for (let i = 0; i < actives.length; i++){
|
|
actives[i].classList.remove("activeLine");
|
|
}
|
|
|
|
let input = document.getElementById("terminalInput");
|
|
input.disabled = true;
|
|
input.setAttribute("id", "");
|
|
|
|
}
|
|
|
|
|
|
function handleExecutionResponse(response) {
|
|
//Show Response
|
|
createNewTextLine(response.response);
|
|
|
|
//create new terminal line.
|
|
createNewTerminalLine();
|
|
}
|
|
|
|
|
|
function createNewTextLine(text){
|
|
let commandResponse = document.createElement("div")
|
|
commandResponse.classList.add("terminalLine");
|
|
|
|
let textElement = document.createElement("span");
|
|
textElement.classList.add("responseText");
|
|
textElement.innerHTML = text;
|
|
|
|
commandResponse.appendChild(textElement)
|
|
terminalContainer.appendChild(commandResponse);
|
|
}
|
|
|
|
function createNewTerminalLine(){
|
|
let newTerminalLine = document.createElement("div");
|
|
newTerminalLine.classList.add("terminalLine");
|
|
newTerminalLine.classList.add("activeLine");
|
|
|
|
let pathText = document.createElement("h4")
|
|
pathText.innerHTML=`guest@${hostname}`;
|
|
pathText.classList.add("pathText");
|
|
|
|
let pathColon = document.createElement("h4")
|
|
pathColon.innerHTML = ":";
|
|
pathColon.classList.add("pathColon");
|
|
|
|
let pathPath = document.createElement("h4");
|
|
fetch('/currentDir')
|
|
.then(response => response.text())
|
|
.then(data => {
|
|
if (data.startsWith("/home/guest")){
|
|
pathPath.innerHTML = "~"+data.split("/home/guest")[1]
|
|
} else {
|
|
pathPath.innerHTML = data;
|
|
}
|
|
pathPath.classList.add("pathPath");
|
|
})
|
|
.catch(error => console.error('Error:', error));
|
|
|
|
let pathDollar = document.createElement("h4");
|
|
pathDollar.innerHTML = "$";
|
|
pathDollar.classList.add("pathDollar");
|
|
|
|
|
|
let newTerminalInput = document.createElement("input");
|
|
newTerminalInput.setAttribute("type", "text");
|
|
newTerminalInput.setAttribute("value", "");
|
|
newTerminalInput.setAttribute("id", "terminalInput");
|
|
newTerminalInput.classList.add("terminalInput");
|
|
|
|
let blinky = document.createElement("div");
|
|
blinky.classList.add("pathBlinky");
|
|
|
|
newTerminalLine.appendChild(pathText);
|
|
newTerminalLine.appendChild(pathColon);
|
|
newTerminalLine.appendChild(pathPath);
|
|
newTerminalLine.appendChild(pathDollar);
|
|
newTerminalLine.appendChild(newTerminalInput);
|
|
newTerminalLine.appendChild(blinky);
|
|
|
|
terminalContainer.appendChild(newTerminalLine)
|
|
|
|
addInputEventListeners();
|
|
}
|
|
|
|
|
|
function resizeInput() {
|
|
const inputText = terminalInput.value;
|
|
const inputWidth = measureTextWidth(inputText);
|
|
const maxWidth = 300; // Set your desired maximum width
|
|
|
|
if (inputWidth <= maxWidth) {
|
|
terminalInput.style.width = inputWidth + "px";
|
|
} else {
|
|
terminalInput.style.width = maxWidth + "px";
|
|
terminalInput.value = inputText.slice(0, -1); // Remove the last character
|
|
}
|
|
}
|
|
|
|
function measureTextWidth(text) {
|
|
const nonBreakingSpace = '\u00A0';
|
|
const sanitizedText = text.replace(/ /g, nonBreakingSpace);
|
|
|
|
const fakeElement = document.createElement("div");
|
|
fakeElement.style.visibility = "hidden";
|
|
fakeElement.style.position = "absolute";
|
|
fakeElement.style.top = "0";
|
|
fakeElement.style.left = "0";
|
|
fakeElement.style.width = "auto";
|
|
fakeElement.style.fontFamily = "Source Code Pro";
|
|
fakeElement.style.fontSize = "16px";
|
|
fakeElement.style.whiteSpace = "nowrap";
|
|
fakeElement.innerHTML = sanitizedText;
|
|
|
|
document.body.appendChild(fakeElement);
|
|
const width = fakeElement.offsetWidth;
|
|
document.body.removeChild(fakeElement);
|
|
|
|
return width;
|
|
}
|
|
|
|
function addInputEventListeners() {
|
|
const terminalInput = document.getElementById("terminalInput");
|
|
|
|
terminalInput.addEventListener("input", function (e) {
|
|
resizeInput();
|
|
});
|
|
resizeInput()
|
|
|
|
terminalInput.addEventListener('blur', function(e) {
|
|
e.preventDefault();
|
|
setTimeout(() => {
|
|
terminalInput.focus();
|
|
}, 0);
|
|
}, false);
|
|
|
|
document.addEventListener('click', function(e) {
|
|
e.preventDefault();
|
|
setTimeout(() => {
|
|
terminalInput.focus();
|
|
}, 0);
|
|
}, false);
|
|
terminalInput.focus();
|
|
|
|
terminalInput.addEventListener("keydown", async function (e) {
|
|
if (e.key === "Enter"){
|
|
await sendCommand(e);
|
|
}
|
|
})
|
|
|
|
return;
|
|
} |