diff --git a/components/client_interface.gd b/components/client_interface.gd index e7c89d2..bec6f02 100644 --- a/components/client_interface.gd +++ b/components/client_interface.gd @@ -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) diff --git a/components/web_client.gd b/components/web_client.gd index 297246f..1a87773 100644 --- a/components/web_client.gd +++ b/components/web_client.gd @@ -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)) diff --git a/environment_manager.gd b/environment_manager.gd index c908b39..bd0d62a 100644 --- a/environment_manager.gd +++ b/environment_manager.gd @@ -76,9 +76,6 @@ func _on_web_client_tcp_client_order_received(client_ids: Array[String], client_ hand_associations[client_ids[index]] = hand -func _on_web_client_tcp_received_client_id(client_id: String) -> void: - _own_client_id = client_id - func _on_web_client_tcp_cards_received(cards: Dictionary) -> void: for client_id in cards.keys(): var card_ids: Array[int] @@ -139,3 +136,6 @@ func _on_web_client_tcp_received_end_game_request() -> void: for score_result: ScoreResult in scores: hand_associations[score_result.client_id].display_rank(rank, score_result.score) rank -= 1 + +func _on_web_client_connected_to_lobby(lobby_id: String, client_id: String) -> void: + _own_client_id = client_id diff --git a/game.tscn b/game.tscn index e1fb4f8..bf19356 100644 --- a/game.tscn +++ b/game.tscn @@ -369,26 +369,19 @@ script = ExtResource("8_j5wjh") playing_card_scene = ExtResource("6_eow3j") [connection signal="cards_received" from="WebClient" to="EnvironmentManager" method="_on_web_client_tcp_cards_received"] -[connection signal="client_joined_lobby" from="WebClient" to="Interface/ClientInterface" method="_on_web_client_tcp_client_joined_lobby"] -[connection signal="client_joined_lobby" from="WebClient" to="HBoxContainer/GameUI" method="_on_web_client_tcp_client_joined_lobby"] -[connection signal="client_left_lobby" from="WebClient" to="Interface/ClientInterface" method="_on_web_client_tcp_client_left_lobby"] -[connection signal="client_left_lobby" from="WebClient" to="HBoxContainer/GameUI" method="_on_web_client_tcp_client_left_lobby"] [connection signal="client_order_received" from="WebClient" to="EnvironmentManager" method="_on_web_client_tcp_client_order_received"] -[connection signal="connected_to_lobby" from="WebClient" to="Interface/ClientInterface" method="_on_web_client_tcp_connected_to_lobby"] -[connection signal="connected_to_server" from="WebClient" to="Interface/ClientInterface" method="_on_web_client_tcp_connected_to_server"] -[connection signal="connection_error_occurred" from="WebClient" to="Interface/ClientInterface" method="_on_web_client_tcp_connection_error_occurred"] +[connection signal="connected_clients_changed" from="WebClient" to="Interface/ClientInterface" method="_on_web_client_connected_clients_changed"] +[connection signal="connected_clients_changed" from="WebClient" to="HBoxContainer/GameUI" method="_on_web_client_connected_clients_changed"] +[connection signal="connected_to_lobby" from="WebClient" to="Interface/ClientInterface" method="_on_web_client_connected_to_lobby"] +[connection signal="connected_to_lobby" from="WebClient" to="EnvironmentManager" method="_on_web_client_connected_to_lobby"] [connection signal="connection_status_changed" from="WebClient" to="Interface/ClientInterface" method="_on_web_client_tcp_connection_status_changed"] [connection signal="connection_status_changed" from="WebClient" to="Interface/ChatPanel" method="_on_web_client_connection_status_changed"] [connection signal="connection_status_changed" from="WebClient" to="Interface/ConnectionOverlay" method="_on_web_client_connection_status_changed"] -[connection signal="disconnected_from_lobby" from="WebClient" to="Interface/ClientInterface" method="_on_web_client_tcp_disconnected_from_lobby"] -[connection signal="disconnected_from_server" from="WebClient" to="Interface/ClientInterface" method="_on_web_client_tcp_disconnected_from_server"] [connection signal="new_round_started" from="WebClient" to="EnvironmentManager" method="_on_web_client_tcp_new_round_started"] [connection signal="notify_play_card_request" from="WebClient" to="HBoxContainer/GameUI" method="_on_web_client_tcp_notify_play_card_request"] [connection signal="received_bet_request" from="WebClient" to="HBoxContainer/GameUI" method="_on_web_client_tcp_received_bet_request"] [connection signal="received_bet_request" from="WebClient" to="HBoxContainer/GameUI/BetContainer/BetInput" method="_on_web_client_tcp_received_bet_request"] [connection signal="received_chat_message" from="WebClient" to="Interface/ClientInterface" method="_on_web_client_tcp_received_chat_message"] -[connection signal="received_client_id" from="WebClient" to="EnvironmentManager" method="_on_web_client_tcp_received_client_id"] -[connection signal="received_connection_message" from="WebClient" to="Interface/ClientInterface" method="_on_web_client_tcp_received_connection_message"] [connection signal="received_end_game_request" from="WebClient" to="EnvironmentManager" method="_on_web_client_tcp_received_end_game_request"] [connection signal="received_expected_bet" from="WebClient" to="EnvironmentManager" method="_on_web_client_tcp_received_expected_bet"] [connection signal="received_first_card" from="WebClient" to="EnvironmentManager/PlayerHand0" method="_on_web_client_tcp_received_first_card"] diff --git a/game_client.gd b/game_client.gd index 224a82f..35dfcf7 100644 --- a/game_client.gd +++ b/game_client.gd @@ -69,12 +69,6 @@ func _set_current_round(round: int) -> void: _current_round = round round_label.text = str(_current_round) -func _on_web_client_tcp_client_joined_lobby(client_name: String, connected_client_names: Array[String]) -> void: - _update_player_count(connected_client_names.size()) - -func _on_web_client_tcp_client_left_lobby(client_name: String, connected_client_names: Array[String]) -> void: - _update_player_count(connected_client_names.size()) - func _on_player_hand_card_selected(card_id: int) -> void: play_card_button.disabled = card_id == -1 @@ -106,3 +100,7 @@ func _on_web_client_tcp_received_win() -> void: func _on_web_client_tcp_request_next_play() -> void: _start_next_play() + + +func _on_web_client_connected_clients_changed(connected_client_names: Array[String]) -> void: + _update_player_count(connected_client_names.size()) diff --git a/globals/peer_messages.gd b/globals/peer_messages.gd new file mode 100644 index 0000000..6078ed1 --- /dev/null +++ b/globals/peer_messages.gd @@ -0,0 +1,85 @@ +extends Node + +func create_lobby( + client_name: String, +) -> String: + return JSON.stringify({ + "response": "create_lobby", + "client_name": client_name, + }) + +func join_lobby( + lobby_id: String, + client_name: String, +) -> String: + return JSON.stringify({ + "response": "join_lobby", + "lobby_id": lobby_id, + "client_name": client_name, + }) + +func leave_lobby( + lobby_id: String, + client_id: String, +) -> String: + return JSON.stringify({ + "response": "leave_lobby", + "lobby_id": lobby_id, + "client_id": client_id, + }) + +func start_game( + lobby_id: String, +) -> String: + return JSON.stringify({ + "response": "start_game", + "lobby_id": lobby_id, + }) + +func submit_bet( + lobby_id: String, + client_id: String, + bet: int, +) -> String: + return JSON.stringify({ + "response": "submit_bet", + "lobby_id": lobby_id, + "client_id": client_id, + "bet": bet, + }) + +func submit_card( + lobby_id: String, + client_id: String, + card_id: int, +) -> String: + return JSON.stringify({ + "response": "submit_bet", + "lobby_id": lobby_id, + "client_id": client_id, + "card_id": card_id, + }) + +func submit_take_winner( + lobby_id: String, + client_id: String, + winner_client_id, +) -> String: + return JSON.stringify({ + "response": "submit_bet", + "lobby_id": lobby_id, + "client_id": client_id, + "winner_client_id": winner_client_id, + }) + +func send_chat_message( + lobby_id: String, + client_id: String, + message: String, +) -> String: + return JSON.stringify({ + "response": "send_chat_message", + "lobby_id": lobby_id, + "client_id": client_id, + "message": message, + }) diff --git a/globals/peer_messages.gd.uid b/globals/peer_messages.gd.uid new file mode 100644 index 0000000..af91bca --- /dev/null +++ b/globals/peer_messages.gd.uid @@ -0,0 +1 @@ +uid://do1kihnsu3gty diff --git a/project.godot b/project.godot index 2364a14..37686f7 100644 --- a/project.godot +++ b/project.godot @@ -19,6 +19,7 @@ config/icon="res://icon.svg" TCPMessages="*res://globals/tcp_messages.gd" CardManager="*res://cards/card_manager.tscn" +PeerMessages="*res://globals/peer_messages.gd" [display] diff --git a/server_tcp.py b/server_tcp.py index 3734cb1..2be6b74 100644 --- a/server_tcp.py +++ b/server_tcp.py @@ -69,9 +69,9 @@ class LobbyManager: await self.broadcast_message( lobby_id, json.dumps({ - "response": "client_joined_lobby", - "new_client_id": client_id, - "new_client_name": client_name, + "response": "joined_lobby", + "client_id": client_id, + "client_name": client_name, "connected_client_ids": self.get_lobby_client_ids(lobby_id), "connected_client_names": self.get_lobby_client_names(lobby_id), }) @@ -92,7 +92,7 @@ class LobbyManager: await self.broadcast_message( lobby_id, json.dumps({ - "response": "client_left_lobby", + "response": "left_lobby", "status": "ok", "client_name": client_name, "connected_client_ids": self.get_lobby_client_ids(lobby_id), @@ -302,8 +302,7 @@ async def process_input(message: str, websocket) -> None: new_lobby_id, new_client_id, json.dumps({ - "response": "create_lobby", - "status": "ok", + "response": "created_lobby", "lobby_id": new_lobby_id, "client_id": new_client_id, }),