This repository has been archived on 2026-05-26. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
magician/components/web_client_tcp.gd
T

138 lines
4.0 KiB
GDScript
Raw Normal View History

class_name WebClientTCP
extends Node
var _tcp := StreamPeerTCP.new()
var _new_status: int = -1
var _processed_status: int = -1
var _lobby_id: String
var _client_id: String
var _client_name: String
var received_data = ""
var _thread: Thread
var _stop_thread: bool = false
signal connected_to_server()
signal connection_error_occurred()
signal disconnected_from_server()
signal connected_to_lobby(lobby_id: String)
signal disconnected_from_lobby()
signal client_joined_lobby(client_name: String)
signal client_left_lobby(client_name: String)
signal received_chat_message(client_name: String, message: String)
signal connection_status_changed(new_status: ConnectionStatus)
enum ConnectionStatus {
DISCONNECTED,
ATTEMPTING_CONNECTION,
LOBBYLESS, # == connected
ATTEMPTING_JOIN,
JOINED,
}
func _process(_delta: float) -> void:
_tcp.poll()
_new_status = _tcp.get_status()
# Ensure status change is only processed once
if not _processed_status == _new_status:
match _new_status:
StreamPeerTCP.Status.STATUS_NONE:
connection_status_changed.emit(ConnectionStatus.DISCONNECTED)
StreamPeerTCP.Status.STATUS_CONNECTING:
connection_status_changed.emit(ConnectionStatus.ATTEMPTING_CONNECTION)
StreamPeerTCP.Status.STATUS_CONNECTED:
_thread = Thread.new()
_thread.start(_listen_for_data)
connected_to_server.emit()
connection_status_changed.emit(ConnectionStatus.LOBBYLESS)
StreamPeerTCP.Status.STATUS_ERROR:
connection_error_occurred.emit()
connection_status_changed.emit(ConnectionStatus.DISCONNECTED)
_processed_status = _new_status
func _listen_for_data() -> void:
2025-07-02 22:16:52 +02:00
while not _stop_thread and not _tcp.get_status() == StreamPeerTCP.Status.STATUS_ERROR:
received_data += _tcp.get_utf8_string(1)
print(received_data)
if received_data.ends_with("}"):
_handle_response(received_data)
received_data = ""
func _handle_response(response: String) -> void:
var data = JSON.parse_string(response)
match data["response"]:
"create_lobby":
if data["status"] == "ok":
_lobby_id = data["lobby_id"]
_client_id = data["client_id"]
connected_to_lobby.emit.call_deferred(_lobby_id)
connection_status_changed.emit.call_deferred(ConnectionStatus.JOINED)
"join_lobby":
if data["status"] == "ok":
_client_id = data["client_id"]
connected_to_lobby.emit.call_deferred(_lobby_id)
connection_status_changed.emit.call_deferred(ConnectionStatus.JOINED)
"client_joined_lobby":
client_joined_lobby.emit.call_deferred(data["new_client_name"])
2025-07-02 22:16:52 +02:00
"leave_lobby_request":
leave_lobby()
"leave_lobby":
if data["status"] == "ok":
client_left_lobby.emit.call_deferred(data["client_name"])
"client_left_lobby":
client_left_lobby.emit.call_deferred(data["client_name"])
"receive_chat_message":
received_chat_message.emit.call_deferred(data["client_name"], data["message"])
func _exit_tree() -> void:
disconnect_from_server()
func connect_to_server() -> void:
_tcp.connect_to_host("127.0.0.1", 9974)
_tcp.set_no_delay(true)
connected_to_server.emit()
func disconnect_from_server() -> void:
_tcp.disconnect_from_host()
_stop_thread = true
if _thread:
_thread.wait_to_finish()
disconnected_from_server.emit()
connection_status_changed.emit(ConnectionStatus.DISCONNECTED)
func create_lobby(client_name: String) -> void:
_client_name = client_name
_send_message(TCPMessages.create_lobby(client_name))
func join_lobby(lobby_id: String, client_name: String) -> void:
_lobby_id = lobby_id
_client_name = client_name
_send_message(TCPMessages.join_lobby(_lobby_id, client_name))
func leave_lobby() -> void:
_send_message(TCPMessages.leave_lobby(_lobby_id, _client_id))
_lobby_id = ""
_client_id = ""
_client_name = ""
disconnected_from_lobby.emit.call_deferred()
connection_status_changed.emit.call_deferred(ConnectionStatus.LOBBYLESS)
func send_chat_message(message: String) -> void:
_send_message(TCPMessages.send_chat_message(_lobby_id, _client_id, message))
func _send_message(message: String) -> void:
_tcp.put_data(message.to_utf8_buffer())