duncgibbs 99de9e8b40
Some checks failed
linting & formatting / build (push) Failing after 5s
itch.io publish action / build (linux64, x86_64) (push) Failing after 34s
itch.io publish action / build (osx, app) (push) Failing after 30s
itch.io publish action / build (win64, exe) (push) Failing after 31s
initial commit
2026-04-13 11:34:00 -05:00

143 lines
4.5 KiB
GDScript

extends Control
const HOLE_PUNCHING_COMPLIANCE_TEXT: Dictionary[TubeNetworkDiagnosisPeer.Compliance, String] = {
TubeNetworkDiagnosisPeer.Compliance.UNKNOWN: "Unknown",
TubeNetworkDiagnosisPeer.Compliance.YES: "likely to succeed",
TubeNetworkDiagnosisPeer.Compliance.NO: "likely to fail",
}
const HOLE_PUNCHING_COMPLIANCE_COLOR: Dictionary[TubeNetworkDiagnosisPeer.Compliance, Color] = {
TubeNetworkDiagnosisPeer.Compliance.UNKNOWN: Color.BEIGE,
TubeNetworkDiagnosisPeer.Compliance.YES: Color.PALE_GREEN,
TubeNetworkDiagnosisPeer.Compliance.NO: Color.CRIMSON,
}
@export var inspector: EditorTubeClientPanel
var client: TubeClient:
set(x):
if client != x:
if null != client:
client._upnp.port_mapped.disconnect(
sucess_port_mapping
)
client._upnp.warning_raised.disconnect(
fail_port_mapping
)
if null != x:
x._upnp.port_mapped.connect(
sucess_port_mapping
)
x._upnp.warning_raised.connect(
fail_port_mapping
)
client = x
if not is_instance_valid(client):
return
if is_instance_valid(client_label):
client_label.text = client.name
if is_instance_valid(context_label):
context_label.text = client.context.resource_name
if is_instance_valid(app_id_label):
app_id_label.text = client.context.app_id
if is_instance_valid(root_node_label):
root_node_label.text = client.multiplayer_root_node.get_path()
detect_nat()
detect_upnp_port_mapping()
var network_diagnosis_peer := TubeNetworkDiagnosisPeer.new(4443)
@onready var client_label: Label = %ClientLabel
@onready var context_label: Label = %ContextLabel
@onready var app_id_label: Label = %AppIdLabel
@onready var root_node_label: Label = %RootNodeLabel
@onready var nat_detection_label: Label = %NATDetectionLabel
@onready var upnp_port_mapping_label: Label = %UPNPPortMappingLabel
func _ready() -> void:
network_diagnosis_peer.warning_raised.connect(
_on_network_diagnosis_peer_warning_raised
)
network_diagnosis_peer.nat_hole_punching_compliance_updated.connect(
_on_network_diagnosis_peer_nat_hole_punching_compliance_updated
)
func _process(delta: float):
network_diagnosis_peer._process(delta)
func _on_network_diagnosis_peer_warning_raised(message: String):
if is_instance_valid(inspector):
inspector.add_message_item_control("Network diagnosis: " + message).warning()
func _on_network_diagnosis_peer_nat_hole_punching_compliance_updated(compliance: TubeNetworkDiagnosisPeer.Compliance):
if is_instance_valid(nat_detection_label):
nat_detection_label.text = HOLE_PUNCHING_COMPLIANCE_TEXT[compliance]
nat_detection_label.modulate = HOLE_PUNCHING_COMPLIANCE_COLOR[compliance]
func _on_nat_detection_button_pressed() -> void:
detect_nat()
func detect_nat():
if OS.get_name() == "Web":
if is_instance_valid(inspector):
inspector.add_message_item_control("NAT hole punching detection is not available on Web").warning()
return
if not is_instance_valid(client):
inspector.add_message_item_control("NAT hole punching detection needs a tube client set on inspector").warning()
return
if len(client.context.stun_servers_urls) < 2:
if is_instance_valid(inspector):
inspector.add_message_item_control("NAT hole punching detection can only be done with 2 or more STUN urls").warning()
return
network_diagnosis_peer.start_nat_hole_punching_detection(client.context.stun_servers_urls)
func _on_upnp_port_mapping_button_pressed() -> void:
detect_upnp_port_mapping()
func detect_upnp_port_mapping():
if OS.get_name() == "Web":
if is_instance_valid(inspector):
inspector.add_message_item_control("Port mapping detection is not available on Web").warning()
return
if not is_instance_valid(client):
inspector.add_message_item_control("Port mapping detection needs a tube client set on inspector").warning()
return
var port := 4443
client._upnp.add_port_mapping(port, port)
client._upnp.delete_port_mapping(port)
func sucess_port_mapping(public_port: int, local_port: int):
if is_instance_valid(upnp_port_mapping_label):
upnp_port_mapping_label.text = HOLE_PUNCHING_COMPLIANCE_TEXT[TubeNetworkDiagnosisPeer.Compliance.YES]
upnp_port_mapping_label.modulate = HOLE_PUNCHING_COMPLIANCE_COLOR[TubeNetworkDiagnosisPeer.Compliance.YES]
func fail_port_mapping(message: String):
if is_instance_valid(upnp_port_mapping_label):
upnp_port_mapping_label.text = HOLE_PUNCHING_COMPLIANCE_TEXT[TubeNetworkDiagnosisPeer.Compliance.NO]
upnp_port_mapping_label.modulate = HOLE_PUNCHING_COMPLIANCE_COLOR[TubeNetworkDiagnosisPeer.Compliance.NO]