From f4ea9f57c627c5e25cb91ef23c79229d42c09b77 Mon Sep 17 00:00:00 2001 From: bluesaxman Date: Thu, 1 Oct 2020 00:29:59 +0000 Subject: [PATCH] large logic rework for smooth game setup, and error handling --- Server/server.pl | 52 ++++++++++++++++++++++------------- UI/index.html | 70 +++++++++++++++++++++++++++++------------------- 2 files changed, 77 insertions(+), 45 deletions(-) diff --git a/Server/server.pl b/Server/server.pl index b02f8f2..f1836fc 100755 --- a/Server/server.pl +++ b/Server/server.pl @@ -272,18 +272,28 @@ sub normalizeSession { my $origin = 'ws://test.murkfall.net'; sub joinSession { - my ($sessionID, $userID) = @_; - unless (defined($sessions{$sessionID})) { - print $sessionID." does not exsist, attempting to create...\n"; - if (generateSession($sessionID)) { - print "Session ".$sessionID." has been created.\n"; - + my $conn = shift; + unless (defined($conn->{session})) { + $conn->{session} = generateSession(); + $conn->send_utf8('{"session":"'.$conn->{session}.'"}'); + return 0; + } + unless (defined($sessions{$conn->{session}})) { + print $conn->{session}." does not exsist, attempting to create...\n"; + if (my $genSession = generateSession($conn->{session})) { + if ( $genSession == $conn->{session} ) { + print "Session ".$conn->{session}." has been created.\n"; + } else { + print "ERROR: issues with creating session ".$conn->{session}."\n"; + print "Session ".$genSession." used instead\n"; + $conn->{session} = $genSession; + } } else { - print "ERROR: Could not create session ".$sessionID."\n"; + print "ERROR: Could not create session ".$conn->{session}."\n"; return 0; } } - unless (addUser($sessionID,$userID)) { + unless (addUser($conn->{session},$conn->{user})) { #assume rejoining user } return 1; @@ -310,8 +320,7 @@ my $server = Net::WebSocket::Server->new( }, ready => sub { my ($conn) = @_; - $conn->send_utf8('{"request":"user"}'); - $conn->send_utf8('{"request":"session"}'); + $conn->send_utf8('{"request":"join"}'); }, utf8 => sub { my ($conn, $msg) = @_; @@ -320,20 +329,27 @@ my $server = Net::WebSocket::Server->new( eval { $messageData = from_json($msg) }; if ($@) { $conn->send_utf8('{"error":100, "message":"ERROR: Invalid json"}'); return 0;} - if (defined($messageData->{user})) { + if ( grep( /^user$/, keys(%$messageData)) ) { $conn->{user} = $messageData->{user}; # Need to check if userID is unique - $conn->send_utf8('{"info":"user success"}'); + $conn->send_utf8('{"info":"user success","request":"join"}'); } - if (defined($messageData->{session})) { - unless(defined($conn->{user})) { $conn->send_utf8('{"error":200, "message":"Could not join session, no user defined", "request":"user"}'); $conn->send_utf8('{"request":"session"}'); return 0; } - $conn->{session} = $messageData->{session}; - $conn->send_utf8('{"info":"session success", "request":"join"}'); + if ( grep( /^session$/, keys(%$messageData)) ) { + if (defined($messageData->{session})) { + $conn->{session} = $messageData->{session}; + $conn->send_utf8('{"info":"session success", "request":"join"}'); + } else { + $conn->{session} = generateSession(); + $conn->send_utf8('{"session":"'.$conn->{session}.'"}'); + $conn->disconnect(4101,"Closed in anticipation of rejoin with new session"); + } } if (defined($messageData->{action})) { if ($messageData->{action} =~ /join/ ) { - if (joinSession($conn->{session},$conn->{user})) { $conn->send_utf8('{"info":"join success", "request":"update"}'); - } else { $conn->send_utf8('{"error":201,"message":"could not create session","request":"session"}') } } + unless ( grep( /^session$/, %$conn) ) { $conn->send_utf8('{"request":"session"}'); return 1; } + unless ( grep( /^user$/, %$conn) ) { $conn->send_utf8('{"request":"user"}'); return 1; } + if (joinSession($conn)) { $conn->send_utf8('{"info":"join success", "request":"update"}'); + } else { $conn->send_utf8('{"error":201,"message":"could not create session","request":"close"}') } } if ($messageData->{action} =~ /update/ ) { my $sessionID = $conn->{session}; normalizeSession($conn->{session}); for ($conn->server->connections) { if ($_->{session} == $conn->{session}) { #This might be a lot to do at once, might need to break it up in the future. # Update all connections joined to this session. diff --git a/UI/index.html b/UI/index.html index 8e3ad0e..19eb129 100644 --- a/UI/index.html +++ b/UI/index.html @@ -154,15 +154,51 @@ function updateEvent() { } } +function getSession(callback) { + popupDialog("gettingStarted","Welcome to Deckard and company", false, inputDialog,{"content":"Please enter a game ID or leave blank to start a new game","inputType":"number"},function (value) { + if (Number.isInteger(Number.parseInt(value))) { + window.gameState.session = Number.parseInt(value); + } else { + window.gameState.session = ""; + } + window.history.pushState(null,null,window.location.origin+window.location.pathname+"?s="+window.gameState.session); + callback(); + }); +} + +function getUser(callback) { + popupDialog("gettingStarted","Welcome to Deckard and company", false, inputDialog, {"content":"Please enter a username","inputType":"text"},function (value) { + if ((null != value) && ("" != value)) { + window.gameState.user = value; + } else { + window.gameState.user = "Unknown"+(new Date()).getTime(); + } + callback(); + }); +} + function startGameSession() { window.gameSession = new WebSocket(server); gameSession.onmessage = function (event) { var message = JSON.parse(event.data); if (message.userID) { window.userID = message.userID; } + if (message.session) { + gameSession.close(4100,"Restarting with new session"); + window.location.search = "s="+message.session; + } if (message.message) { console.log(message.message); } if (message.request) { - if ("session" == message.request) { window.gameSession.send('{"session":'+window.gameState.session+'}'); } - if ("user" == message.request) { window.gameSession.send('{"user":"'+window.gameState.user+'"}'); } + if ("session" == message.request) { + if (!gameState.session) { + getSession(function () { + window.gameSession.send('{"session":'+(window.gameState.session ? window.gameState.session : null)+'}'); + + }); + } else { window.gameSession.send('{"session":"'+gameState.session+'"}'); } + } + if ("user" == message.request) { + getUser(function () { window.gameSession.send('{"user":"'+window.gameState.user+'"}'); }); + } if ("join" == message.request) { window.gameSession.send('{"action":"join"}'); } if ("update" == message.request) { window.gameSession.send('{"action":"update"}'); } } @@ -172,6 +208,7 @@ function startGameSession() { if ("play" == message.action) { window.UI.menu.pools.button.checked = true; } if ("muligan" == message.action) { window.UI.menu.decks.button.checked = true; } if ("clear" == message.action) { window.UI.menu.decks.button.checked = true; } + if ("close" == message.action) { gameSession.close(4000,"close was requested"); } updateEvent(); } if (message.users) { window.gameState.users = message.users; updateEvent(); } @@ -224,30 +261,9 @@ window.UI.menu.options = menuButton("#menu","Options","menu",false); window.UI.display = elementPlace("body","display",null,"div"); var parms = new URLSearchParams(window.location.search); -if (!parms.get("s")) { - popupDialog("gettingStarted","Welcome to Deckard and company", false, inputDialog,{"content":"Please enter a game ID or leave blank to start a new game","inputType":"number"}, - function (value) { - if (Number.isInteger(Number.parseInt(value))) { - window.gameState.session = Number.parseInt(value); - } else { - window.gameState.session = null; - } - window.location.search = '?s='+window.gameState.session; -// window.location.reload(); - }); -} else { - window.gameState.session = parms.get("s"); - if (!window.gameState.user) { - popupDialog("gettingStarted","Welcome to Deckard and company", false, inputDialog, {"content":"Please enter a username","inputType":"text"}, - function (value) { - if ((null != value) && ("" != value)) { - window.gameState.user = value; - } else { - window.gameState.user = "Unknown"+(new Date()).getTime(); - } - startGameSession(); - }); - } else { startGameSession(); } -} +console.log(parms.get("s")); +window.gameState.session = parms.get("s"); +startGameSession(); +