extends Node const TPut := preload("res://addons/godot_xterm/util/tput.gd") signal exited(status) var line := "" var _tput @onready var terminal = $Terminal @onready var _has_js: bool = OS.has_feature("web") func prompt(prompt: String): _tput.setaf(TPut.ANSIColor.bright_green) terminal.write(prompt) _tput.sgr0() func _ready(): _tput = TPut.new(terminal) _tput.setaf(TPut.ANSIColor.bright_cyan) terminal.write("*** Web Console ***\r\n\r\n") _tput.setaf(TPut.ANSIColor.yellow) terminal.write("Input will be passed to Godot's JavaScript.eval() function.\r\n") terminal.write("Some things you could try:\r\n\r\n") terminal.write(">> 1 + 1\r\n") terminal.write(">> window.location\r\n") terminal.write(">> alert('Hello')\r\n\r\n") _tput.setaf(TPut.ANSIColor.bright_cyan) terminal.write("Enter 'q', 'quit', or 'exit' to return to the previous menu.\r\n\r\n") _tput.sgr0() prompt(">> ") terminal.grab_focus() func grab_focus(): terminal.grab_focus() func _on_Terminal_key_pressed(_data, event: InputEventKey): if not event: return # For some reason, data String is malformed on Web, so only use event.unicode. var data = char(event.unicode) match event.keycode: KEY_ENTER: terminal.write("\r\n") if line == "q" or line == "quit" or line == "exit": return emit_signal("exited", 0) if not _has_js: var msg := "WebConsole only available in Web build." push_error(msg) _tput.setaf(TPut.ANSIColor.red) terminal.write(msg) _tput.sgr0() prompt("\r\n>> ") else: var json = JavaScriptBridge.eval("JSON.stringify(%s)" % line, true) _tput.setaf(TPut.ANSIColor.magenta) terminal.write(str(json)) _tput.sgr0() line = "" _tput.sgr0() prompt("\r\n>> ") KEY_BACKSPACE: if line.length() > 0: terminal.write("\b \b") line = line.substr(0, line.length() - 1) _: line += data terminal.write(data)