refactored lobby logic; streamlined commands and added PeerMessages to client for more cohesive socket messaging

This commit is contained in:
2025-07-20 17:37:10 +02:00
parent b97d454402
commit 08799a3809
9 changed files with 170 additions and 125 deletions
+6 -37
View File
@@ -12,12 +12,6 @@ extends Control
@export var name_input: LineEdit
@export var lobby_code_input: LineEdit
@export var output: Label
func _write_line(text: String) -> void:
#output.text += text + "\n"
pass
func _on_create_lobby_button_pressed() -> void:
client.create_lobby(name_input.text.strip_edges())
@@ -28,34 +22,6 @@ func _on_disconnect_lobby_button_pressed() -> void:
leave_lobby_button.disabled = true
client.leave_lobby()
func _on_web_client_tcp_connected_to_server() -> void:
_write_line("You are connected to the server")
func _on_web_client_tcp_connection_error_occurred() -> void:
#connect_button.disabled = false
pass
func _on_web_client_tcp_disconnected_from_server() -> void:
_write_line("You were disconnected from the server")
func _on_web_client_tcp_connected_to_lobby(lobby_id: String) -> void:
lobby_code_input.text = lobby_id
_write_line("You connected to lobby {lobby_id}".format({"lobby_id": lobby_id}))
func _on_web_client_tcp_disconnected_from_lobby() -> void:
_write_line("You disconnected from the lobby")
func _on_web_client_tcp_client_joined_lobby(client_name: String, connected_client_names: Array) -> void:
_write_line("{client_name} joined the lobby{you}".format({
"client_name": client_name,
"you": " (that's you!)" if client_name == name_input.text.strip_edges() else ""
}))
_update_connected_players(connected_client_names)
func _on_web_client_tcp_client_left_lobby(client_name: String, connected_client_names: Array) -> void:
_write_line("{client_name} left the lobby".format({"client_name": client_name}))
_update_connected_players(connected_client_names)
func _on_web_client_tcp_connection_status_changed(new_status: WebClient.ConnectionStatus) -> void:
match new_status:
WebClient.ConnectionStatus.DISCONNECTED:
@@ -96,8 +62,11 @@ func _on_web_client_tcp_connection_status_changed(new_status: WebClient.Connecti
name_input.editable = false
lobby_code_input.editable = false
func _on_web_client_tcp_received_connection_message(message: String) -> void:
_write_line(message)
func _update_connected_players(new_client_names: Array[String]) -> void:
connected_players_label.text = "Connected Players:\n" + "\n".join(new_client_names)
func _on_web_client_connected_to_lobby(lobby_id: String, client_id: String) -> void:
lobby_code_input.text = lobby_id
func _on_web_client_connected_clients_changed(connected_client_names: Array[String]) -> void:
_update_connected_players(connected_client_names)
+61 -62
View File
@@ -9,7 +9,6 @@ const SENDER_SYSTEM: String = "SYSTEM"
## Remote: wss://denizk0461.dev/magsrv
const SERVER_ADDRESS: String = "127.0.0.1:9974"
#var _tcp := StreamPeerTCP.new()
var _socket := WebSocketPeer.new()
var _new_status: int = WebSocketPeer.STATE_CLOSED
@@ -18,6 +17,7 @@ var _processed_status: int = -1
var _lobby_id: String
var _client_id: String
var _client_name: String
var _is_host: bool
var received_data: Array
var cached_response: String
@@ -32,18 +32,10 @@ var _connected_client_names: Array[String] = []
@export var chat_panel: ChatPanel
signal connected_to_server()
signal connection_error_occurred()
signal disconnected_from_server()
signal connected_to_lobby(lobby_id: String, client_id: String)
signal connected_to_lobby(lobby_id: String)
signal disconnected_from_lobby()
signal received_client_id(client_id: String)
signal connected_clients_changed(connected_client_names: Array[String])
signal client_joined_lobby(client_name: String, connected_client_names: Array[String])
signal client_left_lobby(client_name: String, connected_client_names: Array[String])
signal received_connection_message(message: String)
signal received_chat_message(client_name: String, message: String)
signal connection_status_changed(new_status: ConnectionStatus)
@@ -85,17 +77,14 @@ func _process(_delta: float) -> void:
if not _processed_status == _new_status:
match _new_status:
WebSocketPeer.STATE_OPEN:
print("open")
connected_to_server.emit()
chat_panel.put_chat_message(SENDER_SYSTEM, "You successfully connected to the server.")
connection_status_changed.emit(ConnectionStatus.LOBBYLESS)
WebSocketPeer.STATE_CONNECTING:
print("connecting")
connection_status_changed.emit(ConnectionStatus.ATTEMPTING_CONNECTION)
WebSocketPeer.STATE_CLOSING:
print("closing")
pass
WebSocketPeer.STATE_CLOSED:
print("closed")
chat_panel.put_chat_message(SENDER_SYSTEM, "You lost connection to the server.")
connection_status_changed.emit(ConnectionStatus.DISCONNECTED)
_processed_status = _new_status
@@ -103,10 +92,7 @@ func _process(_delta: float) -> void:
if _processed_status == WebSocketPeer.STATE_OPEN:
while _socket.get_available_packet_count():
cached_response = _socket.get_packet().get_string_from_utf8()
#print(cached_response)
#cached_response += (received_data[1] as PackedByteArray).get_string_from_utf8()
if cached_response.ends_with("}"):
#print(cached_response)
_handle_response(cached_response)
cached_response = ""
@@ -122,29 +108,33 @@ func _listen_for_data() -> void:
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"]
received_client_id.emit.call_deferred(_client_id)
connected_to_lobby.emit.call_deferred(_lobby_id)
connection_status_changed.emit.call_deferred(ConnectionStatus.JOINED)
"created_lobby":
_lobby_id = data["lobby_id"]
_client_id = data["client_id"]
chat_panel.put_chat_message(SENDER_SYSTEM, "You created and connected to lobby {lobby_id} with client ID {client_id}.".format({
"lobby_id": _lobby_id,
"client_id": _client_id,
}))
connection_status_changed.emit.call_deferred(ConnectionStatus.JOINED)
connected_to_lobby.emit.call_deferred(_lobby_id, _client_id)
"join_lobby_response":
_handle_join(data)
"client_joined_lobby":
print(data["connected_client_ids"])
"joined_lobby":
_connected_client_ids.assign(data["connected_client_ids"])
_connected_client_names.assign(data["connected_client_names"])
client_joined_lobby.emit.call_deferred(data["new_client_name"], _connected_client_names)
connected_clients_changed.emit.call_deferred(_connected_client_names)
chat_panel.put_chat_message(SENDER_SYSTEM, "{client_name} joined the lobby.".format({
"client_name": data["client_name"],
}))
"leave_lobby_request":
leave_lobby()
"leave_lobby":
if data["status"] == "ok":
client_left_lobby.emit.call_deferred(data["client_name"])
"client_left_lobby":
"left_lobby":
_connected_client_ids.assign(data["connected_client_ids"])
_connected_client_names.assign(data["connected_client_names"])
client_left_lobby.emit.call_deferred(data["client_name"], _connected_client_names)
connected_clients_changed.emit.call_deferred(_connected_client_names)
chat_panel.put_chat_message(SENDER_SYSTEM, "{client_name} left the lobby.".format({
"client_name": data["client_name"],
}))
## A chat message has been received
"receive_chat_message":
@@ -203,16 +193,19 @@ func _handle_response(response: String) -> void:
func _handle_join(data) -> void:
match data["status"]:
"lobby_not_found":
received_connection_message.emit.call_deferred("Could not join; lobby does not exist")
chat_panel.put_chat_message(SENDER_SYSTEM, "Could not join; lobby does not exist.")
connection_status_changed.emit.call_deferred(ConnectionStatus.LOBBYLESS)
"lobby_full":
received_connection_message.emit.call_deferred("Could not join; lobby is full")
chat_panel.put_chat_message(SENDER_SYSTEM, "Could not join; lobby is full.")
connection_status_changed.emit.call_deferred(ConnectionStatus.LOBBYLESS)
"ok":
_client_id = data["client_id"]
connected_to_lobby.emit.call_deferred(_lobby_id)
received_client_id.emit.call_deferred(_client_id)
chat_panel.put_chat_message(SENDER_SYSTEM, "You connected to lobby {lobby_id} with client ID {client_id}.".format({
"lobby_id": _lobby_id,
"client_id": _client_id,
}))
connection_status_changed.emit.call_deferred(ConnectionStatus.JOINED)
connected_to_lobby.emit.call_deferred(_lobby_id, _client_id)
func _exit_tree() -> void:
disconnect_from_server()
@@ -224,31 +217,9 @@ func connect_to_server(text: String) -> void:
func disconnect_from_server() -> void:
_socket.close()
disconnected_from_server.emit()
chat_panel.put_chat_message(SENDER_SYSTEM, "You were disconnected from the server.")
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))
connection_status_changed.emit.call_deferred(ConnectionStatus.ATTEMPTING_JOIN)
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))
pass
@@ -309,5 +280,33 @@ func submit_play_winner(winning_client_id: String) -> void:
func _send_message(message: String) -> void:
_socket.send_text(message)
func create_lobby(client_name: String) -> void:
_client_name = client_name
_send_message(PeerMessages.create_lobby(client_name))
func join_lobby(lobby_id: String, client_name: String) -> void:
_lobby_id = lobby_id
_client_name = client_name
_send_message(PeerMessages.join_lobby(_lobby_id, client_name))
connection_status_changed.emit.call_deferred(ConnectionStatus.ATTEMPTING_JOIN)
func leave_lobby() -> void:
_send_message(PeerMessages.leave_lobby(_lobby_id, _client_id))
connection_status_changed.emit.call_deferred(ConnectionStatus.LOBBYLESS)
# Notify user about disconnect
chat_panel.put_chat_message(SENDER_SYSTEM, "You were disconnected from the lobby {lobby_id}.".format({
"lobby_id": _lobby_id,
}))
# Reset saved data about lobby and client
_lobby_id = ""
_client_id = ""
_client_name = ""
func _on_chat_panel_message_sent(message: String) -> void:
_send_message(TCPMessages.send_chat_message(_lobby_id, _client_id, message))
_send_message(PeerMessages.send_chat_message(_lobby_id, _client_id, message))