OverviewFilesCommitsIssuesDocsReleasesPeers

hyperswarm-peer / project / test_peer.gd

79 lines · gd ref:
extends Node
## Test scene for HyperswarmMultiplayerPeer.
## Run two instances: one as server, one as client.

@export var is_server: bool = true
@export var server_port: int = 9514
@export var server_address: String = "127.0.0.1"

@onready var status_label: Label = $UI/VBox/StatusLabel
@onready var log_text: RichTextLabel = $UI/VBox/LogText
@onready var input_field: LineEdit = $UI/VBox/HBox/InputField
@onready var send_button: Button = $UI/VBox/HBox/SendButton

var peer: HyperswarmMultiplayerPeer


func _ready() -> void:
	peer = HyperswarmMultiplayerPeer.new()

	send_button.pressed.connect(_on_send)
	input_field.text_submitted.connect(func(_t: String): _on_send())

	if is_server:
		_start_server()
	else:
		_start_client()

	multiplayer.multiplayer_peer = peer
	multiplayer.peer_connected.connect(_on_peer_connected)
	multiplayer.peer_disconnected.connect(_on_peer_disconnected)


func _start_server() -> void:
	var err := peer.create_server(server_port)
	if err != OK:
		_log("Failed to start server: %d" % err)
		return
	_log("Server started on port %d" % server_port)
	_log("Unique ID: %d" % peer.get_unique_id())
	status_label.text = "Server (port %d)" % server_port


func _start_client() -> void:
	var err := peer.create_client(server_address, server_port)
	if err != OK:
		_log("Failed to connect: %d" % err)
		return
	_log("Connecting to %s:%d..." % [server_address, server_port])
	status_label.text = "Client (connecting...)"


func _on_peer_connected(id: int) -> void:
	_log("Peer connected: %d" % id)
	status_label.text = "Connected (peer %d)" % multiplayer.get_unique_id()


func _on_peer_disconnected(id: int) -> void:
	_log("Peer disconnected: %d" % id)


func _on_send() -> void:
	var text := input_field.text.strip_edges()
	if text == "":
		return
	input_field.text = ""
	_log("[Me] %s" % text)
	rpc("_receive_message", text)


@rpc("any_peer", "reliable")
func _receive_message(text: String) -> void:
	var sender := multiplayer.get_remote_sender_id()
	_log("[Peer %d] %s" % [sender, text])


func _log(msg: String) -> void:
	log_text.append_text(msg + "\n")
	print(msg)