hamncheese/hamncheese/Scripts/edge.gd
2023-09-19 20:07:55 -05:00

85 lines
2.5 KiB
GDScript

extends Node
const MODE_READ := "r"
const MODE_WRITE := "w"
var _edge_pid := -1
var _udp := PacketPeerUDP.new()
var _sequence := 1
var _password := "n2n"
var _data_buffer := {}
var _data_type := {}
var _timer : Timer
signal data_recieved(type: String, data: Array)
signal network_died
func _on_timer_timeout():
if !OS.is_process_running(_edge_pid):
stop_edge()
network_died.emit()
if _udp.is_socket_connected():
_send("info")
_send("edges")
func _process(_delta):
if _udp.is_socket_connected():
var data = _udp.get_packet().get_string_from_ascii()
if _udp.get_packet_error() == OK:
var json = JSON.new()
var error = json.parse(data)
if error == OK:
var received = json.data
# Is this the start of a sequence?
if received["_type"] == "begin":
# Nuke anything currently in this sequence's slot.
_data_buffer[received["_tag"]] = [] # This is a dictionary of tags->arrays of dictionaries.
_data_type[received["_tag"]] = received["cmd"] # This is a dictionary of tags->strings
# Is this the end of a squence?
elif received["_type"] == "end":
data_recieved.emit(_data_type[received["_tag"]], _data_buffer[received["_tag"]])
elif received["_type"] == "error":
_data_buffer[received["_tag"]] = []
_data_buffer[received["_tag"]].append(received)
data_recieved.emit("error", _data_buffer[received["_tag"]])
else:
_data_buffer[received["_tag"]].append(received)
func _send(what: String, mode: String = MODE_READ):
if _udp.is_socket_connected():
var packet = mode + " " + str(_sequence) + ":1:" + _password + " " + what
_udp.put_packet(packet.to_ascii_buffer())
_sequence += 1
if _sequence > 999:
_sequence = 1
func start_edge(community: String, key: String, supernode: String, port: int = 7777, my_port: int = 5643, management_port: int = 5644):
_password = Util.generate_password()
_edge_pid = await Process.elevate(OS.get_user_data_dir() + "/edge", ["--management-password", _password, "-c", community, "-k", key, "-l", supernode + ":" + str(port), "-f"])
if _edge_pid < 0:
await Dialog.alert("Error", "Unable to start network layer!")
return false
_udp.bind(my_port, "127.0.0.1")
_udp.connect_to_host("127.0.0.1", management_port)
_timer = Timer.new()
_timer.wait_time = 3
_timer.autostart = true
_timer.timeout.connect(_on_timer_timeout)
Engine.get_main_loop().current_scene.add_child(_timer)
_timer.timeout.emit()
return true
func stop_edge():
if _timer != null:
_timer.queue_free()
_send("stop", MODE_WRITE)
_udp.close()
_edge_pid = -1