import { SAASimulator } from "./SaaSimulator"; import { input, number, select, Separator } from '@inquirer/prompts'; import readline, { clearLine } from "readline"; const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); async function clearLastLine(line: number) { readline.moveCursor(process.stdout, 0, -1); readline.clearLine(process.stdout, 0); readline.moveCursor(process.stdout, 0, -1); readline.clearLine(process.stdout, 0); } async function readCommands(filename: string): Promise { return Bun.file(filename).json(); } async function selectSaa() { if (saas.length < 1) { currentState = "mainMenu"; console.log("There are no SAAs") return Promise.resolve(); } else if (saas.length >= 1) { let saaChoices = saas.map((saa, index) => { return { name: `Saa Exercise: ${saa.getExId()} Party: ${saa.getPartyId()}`, value: index } }); saaChoices.push({name:"Back",value: -1}); let lastCursorPos = rl.getCursorPos().cols; const answer: number = await select({ message: "Select Saa to control", choices: saaChoices }); clearLastLine(lastCursorPos); if(answer == -1){ currentState = "mainMenu"; return Promise.resolve(); } selectedSaa = answer; } currentState = "controlSaa"; return Promise.resolve(); } async function connectSaa(){ let uri: string; if (!process.env.URI) { let answer; do { answer = await input({ message: "Enter the uri of the Excon Json Interface:" }); } while (!answer || answer == ""); uri = answer; } else { uri = process.env.URI; } let port: number; if (!process.env.EXCONPORT) { let answer; do { answer = await number({ message: "Enter the port of the Excon Json Interface:" }); } while (!answer); port = answer; } else { port = Number.parseInt(process.env.EXCONPORT); if (port == undefined) { console.log("The port from the environment variable is invalid!"); } } saas[selectedSaa].connect(uri,port); currentState = "mainMenu"; } async function registerSaa(){ if (!process.env.EXCONPORT) { let partyIds = await saas[selectedSaa].getPartys("http://localhost", 7300, 42); console.log(partyIds[0]) const choices = partyIds.map((partyIds: any) => { return { name: partyIds.name, value: partyIds.id } }) let lastCursorPos = rl.getCursorPos().cols; const answer = await select({ message: "Select a party.", choices: choices }) clearLastLine(lastCursorPos); selectedPartyId = answer; }else{ const partyId = Number.parseInt(process.env.PARTYID || ""); if (partyId == undefined) { console.log("The port from the environment variable is invalid!"); } selectedPartyId = partyId } saas[selectedSaa].register(selectedPartyId); } let selectedSaa = 0; let selectedPartyId = 3; const saas: SAASimulator[] = []; const commands = await readCommands("commands.json"); let currentState = "mainMenu"; let commandFuncitons: any = { createSaa: createSaa, selectSaa: selectSaa, connectSaa:connectSaa ,registerSaa: registerSaa}; while (true) { let currentCommand = commands.commands.find((command: any) => { return command.state === currentState; }); let currentChoices = currentCommand.options; let lastCursorPos = rl.getCursorPos().cols; const answer: string = await select({ message: currentCommand.message, choices: currentChoices }); clearLastLine(lastCursorPos); if (answer.charAt(0) == '$') { } if(!commandFuncitons[answer]){ console.error(`commandFunction for ${answer} does not exist`); }else{ await commandFuncitons[answer](); } } async function createSaa() { let uri: string; if (!process.env.URI) { let answer; do { answer = await input({ message: "Enter the uri of the Excon Json Interface:" }); } while (!answer || answer == ""); uri = answer; } else { uri = process.env.URI; } let port: number; if (!process.env.EXCONPORT) { let answer; do { answer = await number({ message: "Enter the port of the Excon Json Interface:" }); } while (!answer); port = answer; } else { port = Number.parseInt(process.env.EXCONPORT); if (port == undefined) { console.log("The port from the environment variable is invalid!"); } } const saa = new SAASimulator(); const exerciseIds = await saa.getExerciseIds(uri, port); console.log(exerciseIds) let exerciseId: number; if (!process.env.EXERCISEID) { const choices = exerciseIds.map((exerciseId: number) => { return { name: exerciseId.toString(), value: exerciseId } }) let lastCursorPos = rl.getCursorPos().cols; const answer = await select({ message: "Select an exercise.", choices: choices }) clearLastLine(lastCursorPos); exerciseId = answer; } else { exerciseId = Number.parseInt(process.env.EXERCISEID); if (!exerciseIds.includes(exerciseId)) { console.log("The exerciseId from the environment variable is invalid!"); } } saa.setExerciseId(exerciseId); saas.push(saa); } let uri: string; if (!process.env.URI) { let answer; do { answer = await input({ message: "Enter the uri of the Excon Json Interface:" }); } while (!answer || answer == ""); uri = answer; } else { uri = process.env.URI; } let port: number; if (!process.env.EXCONPORT) { let answer; do { answer = await number({ message: "Enter the port of the Excon Json Interface:" }); } while (!answer); port = answer; } else { port = Number.parseInt(process.env.EXCONPORT); if (port == undefined) { console.log("The port from the environment variable is invalid!"); } } const saa = new SAASimulator(); const exerciseIds = await saa.getExerciseIds(uri, port); let exerciseId: number; if (!process.env.EXERCISEID) { const choices = exerciseIds.map((exerciseId: number) => { return { name: exerciseId.toString(), value: exerciseId } }) const answer = await select({ message: "Select an exercise.", choices: choices }) exerciseId = answer; } else { exerciseId = Number.parseInt(process.env.EXERCISEID); if (!exerciseIds.includes(exerciseId)) { console.log("The exerciseId from the environment variable is invalid!"); } } saa.setExerciseId(exerciseId); console.log(await saa.getPartys(uri, port, exerciseId)); saa.connect(uri, port); setTimeout(() => { saa.sendTelegram({ uuid: "", version: "", timestamp: 1, sender: "", reciver: "", referenceUuid: "" }, { type: "EX-Anmeldung", typeId: 1, data: { partyId: 3 } }) }, 1000); setTimeout(() => { saa.getParticipantNumbers(); }, 1000); setTimeout(() => { saa.sendTelegram({ type: "EX-SQ(WS)", typeId: 7, data: { typ: "Pzh", kenner: "A", status: "Einsatzbereit" } }, { typeId: 7 }) }, 2000); setTimeout(() => { saa.getParticipantNumbers(); }, 3000);