large logic rework for smooth game setup, and error handling
This commit is contained in:
parent
3b88dba9a2
commit
f4ea9f57c6
@ -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.
|
||||
|
@ -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();
|
||||
|
||||
</script>
|
||||
</html>
|
||||
|
Loading…
x
Reference in New Issue
Block a user