OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-tps / addons / editor_screenshot / editor_screenshot.gd

67 lines · gd ref:
@tool
extends EditorPlugin

var _f12_was_pressed: bool = false
var _tcp_server: TCPServer = null
var _screenshot_dir: String = "/home/fleeky/Desktop/hyper-tps"
const TCP_PORT = 6008


func _enter_tree() -> void:
	set_process(true)
	# Start TCP server for CLI-triggered screenshots
	_tcp_server = TCPServer.new()
	var err: int = _tcp_server.listen(TCP_PORT, "127.0.0.1")
	if err == OK:
		print("Editor Screenshot plugin loaded — F12 or: echo screenshot | nc localhost %d" % TCP_PORT)
	else:
		print("Editor Screenshot plugin loaded — F12 only (TCP port %d in use)" % TCP_PORT)
		_tcp_server = null


func _exit_tree() -> void:
	if _tcp_server:
		_tcp_server.stop()
		_tcp_server = null


func _process(_delta: float) -> void:
	# F12 hotkey
	var pressed: bool = Input.is_key_pressed(KEY_F12)
	if pressed and not _f12_was_pressed:
		_take_screenshot()
	_f12_was_pressed = pressed

	# Check for TCP connections
	if _tcp_server and _tcp_server.is_connection_available():
		var peer: StreamPeerTCP = _tcp_server.take_connection()
		if peer:
			# Take screenshot and respond with path
			var path: String = _take_screenshot()
			if not path.is_empty():
				peer.put_data((path + "\n").to_utf8_buffer())
			else:
				peer.put_data("ERROR: screenshot failed\n".to_utf8_buffer())
			peer.disconnect_from_host()


func _take_screenshot() -> String:
	var vp: SubViewport = get_editor_interface().get_editor_viewport_3d(0)
	if not vp:
		print("Editor Screenshot: no 3D viewport found")
		return ""
	var img: Image = vp.get_texture().get_image()
	if not img:
		print("Editor Screenshot: failed to get viewport image")
		return ""
	DirAccess.make_dir_recursive_absolute(_screenshot_dir)
	var ts: String = Time.get_datetime_string_from_system().replace(":", "-")
	var path: String = "%s/editor_%s.png" % [_screenshot_dir, ts]
	var err: int = img.save_png(path)
	if err == OK:
		print("Editor screenshot saved: %s" % path)
		return path
	else:
		print("Editor screenshot FAILED (error %d): %s" % [err, path])
		return ""