online multiplayer chess game (note server currently down)
meaningfull errors: complements https://github.com/bend-n/gd-chess-server/commit/ca2f597
bendn 2022-09-10
parent a629c6e · commit 5be0b62
-rw-r--r--networking/PacketHandler.gd66
-rw-r--r--ui/menus/account/Account.gd24
2 files changed, 64 insertions, 26 deletions
diff --git a/networking/PacketHandler.gd b/networking/PacketHandler.gd
index d9760bd..5a950e3 100644
--- a/networking/PacketHandler.gd
+++ b/networking/PacketHandler.gd
@@ -16,6 +16,7 @@ signal rematch_result(what)
signal signinresult(what)
signal signupresult(what)
+const DEFAULT_ERROR_MESSAGE = "Error. Please report this issue to bendn."
const HEADERS := {
"joinrequest": "J",
"hostrequest": "H",
@@ -98,16 +99,7 @@ func _data_recieved() -> void:
yield(get_tree().create_timer(.5), "timeout")
emit_signal("info_recieved", text)
HEADERS.spectate:
- # handle spectate here
- if typeof(text) == TYPE_STRING: # ew error
- set_lobby_status(text, false)
- lobby.set_buttons(true)
- return
- Globals.spectating = true
- _start_game()
- yield(get_tree().create_timer(.5), "timeout")
- Globals.grid.load_pgn(text.pgn)
- emit_signal("info_recieved", text)
+ spectate_result(text)
HEADERS.loadpgn:
emit_signal("load_pgn", text)
HEADERS.signal:
@@ -143,22 +135,53 @@ func _connection_error() -> void:
go_back("Connection error, please check your internet, and reload the game.", false)
+const join_err_table := {
+ "FULL": "This game is full. Double check your spelling, or host your own game..",
+ "NOT_EXIST": "This game does not exist. Double check your spelling, or host it.",
+ "NO_GAMECODE": "Your game name is empty.",
+ "NO_ID": "Your id is undefined. Please report this issue to bendn."
+}
+
+
func join_result(accepted) -> void:
- handle_result(accepted, "Joined!")
+ handle_result(accepted, "Joined!", join_err_table)
+
+
+const host_err_table := {
+ "ALREADY_EXISTS": "This game name is taken. Pick a new name.", # game is full
+ "ALREADY_EXISTS_EMPTY": "This game name is taken. Pick a new name, or join.", # someone else hosted, but noone is joining them :(
+ "NO_GAMECODE": "Your game name is empty.",
+ "NO_ID": "Your id is undefined. Please report this issue to bendn."
+}
func host_result(accepted) -> void:
- set_hosting(handle_result(accepted, "Hosted!"))
+ set_hosting(handle_result(accepted, "Hosted!", host_err_table))
-func handle_result(accepted, resultstring: String) -> bool:
- emit_signal("request_result", false if typeof(accepted) != TYPE_DICTIONARY else true)
- if typeof(accepted) == TYPE_DICTIONARY:
+const spectate_err_table := {"NOT_EXIST": "This game does not exist. Double check your spelling, or host it."}
+
+
+func spectate_result(accepted) -> void:
+ if handle_result(accepted, "Watching", spectate_err_table, true):
+ Globals.spectating = true
+ _start_game()
+ yield(get_tree().create_timer(.5), "timeout")
+ Globals.grid.load_pgn(accepted.pgn)
+ emit_signal("info_recieved", accepted)
+
+
+func handle_result(accepted, resultstring: String, err_table: Dictionary, quick_return := false) -> bool:
+ var err = accepted.get("err", false)
+ emit_signal("request_result", false if err else true)
+ if !err:
+ if quick_return:
+ return true
Globals.team = "w" if accepted.idx == 0 else "b"
Log.debug("Team set to " + Utils.expand_color(Globals.team))
set_lobby_status(resultstring, true)
return true
- set_lobby_status(accepted, false)
+ set_lobby_status(err_table.get(err, "Error. Please report this issue to bendn."), false)
lobby.set_buttons(true)
return false
@@ -267,3 +290,14 @@ func relay_signal(body: Dictionary, header: String) -> Dictionary: # its really
func send_mov(mov: String) -> void:
send_gamecode_packet({move = mov}, HEADERS.move)
+
+
+static func construct_errstr(packet, err_table, default_message := DEFAULT_ERROR_MESSAGE) -> String:
+ var errstr: String = ""
+ var err: String = packet.get("err", false)
+ if err:
+ errstr = err_table.get(err, default_message)
+ var stack = packet.get("stack", false)
+ if stack:
+ errstr += " (Stack trace: %s) " % stack
+ return errstr
diff --git a/ui/menus/account/Account.gd b/ui/menus/account/Account.gd
index 62c1e37..f76df91 100644
--- a/ui/menus/account/Account.gd
+++ b/ui/menus/account/Account.gd
@@ -41,14 +41,16 @@ func signin():
PacketHandler.signin(Creds.data)
-func _on_signin_result(result):
- var status_set = !autologin
+func _on_signin_result(result: Dictionary) -> void:
+ var status_set = not autologin # not a autologin
if autologin:
autologin = false
- yield(get_tree().create_timer(.5), "timeout")
+ yield(get_tree().create_timer(.25), "timeout")
$choose/signin/signinbutton.disabled = false
- if typeof(result) == TYPE_STRING: # ew, error, get it away from me
- return reset(result, status_set)
+ var err = result.get("err", false)
+ if err:
+ var err_table := {"INVALID_DATA": "Username/password incorrect."}
+ return reset(PacketHandler.construct_errstr(result, err_table) if status_set else "", status_set)
Creds.data.uuid = result.id # server uses `id` instead of `uuid`...
Creds.data.country = result.country
on_successful()
@@ -61,15 +63,17 @@ func signup():
PacketHandler.signup(Creds.data)
-func _on_signup_result(result: String):
+func _on_signup_result(result: Dictionary):
$choose/signup/signupbutton.disabled = false
- if "err:" in result: # ew error go awway
- return reset(result)
- Creds.data.uuid = result
+ var err = result.get("err", false)
+ if err:
+ var err_table = {"ALREADY_EXISTS": "That user already exists. Pick a different username."}
+ return reset(PacketHandler.construct_errstr(result, err_table))
+ Creds.data.uuid = result.id
on_successful()
-func reset(reason: String, reset_creds := true):
+func reset(reason: String, reset_creds := true) -> void:
if reason:
status.set_text(reason, 5)
if reset_creds: