93 lines
2.8 KiB
Perl
Executable File

#!/usr/bin/perl -w
use strict;
use warnings;
use POSIX;
use Net::WebSocket::Server;
use JSON;
my $origin = 'ws://localhost';
my %sessions = ();
sub generateSession {
my $newSession = shift;
unless (defined $newSession) { $newSession = time; }
if ( grep( /$newSession/, keys %sessions ) ) {
generateSession();
} else {
print "Adding session ".$newSession." to database\n";
$sessions{$newSession} = ();
$sessions{$newSession}{"id"} = $newSession;
$sessions{$newSession}{"users"} = [];
$sessions{$newSession}{"decks"} = ();
$sessions{$newSession}{"pools"} = ();
}
return $newSession;
}
sub joinSession {
my ($sessionID, $conn) = @_;
print "Connection attempts to use session ".$sessionID."\n";
unless ( grep( /$sessionID/, keys %sessions ) ) {
print "Session ".$sessionID." does not yet exsist, creating...\n";
$sessionID = generateSession($sessionID);
}
push(@{$sessions{$sessionID}{"users"}}, $conn->{"initHand"}->res->key);
$conn->{"currentSession"} = $sessions{$sessionID};
print "A client has connected to session: ".$conn->{"currentSession"}{"id"}."\n";
}
#sub shuffleDeck {
# my @deck = @_;
# my $index = 0;
# for (@deck) {
# my $swapCardIndex = floor(rand() * @deck);
# my $swapCard = @deck[$swapCardIndex];
# @deck[$swapCardIndex] = $_;
# $deck[$index] = $swapCard;
# $index++;
# }
#}
Net::WebSocket::Server->new(
listen => 8080,
on_connect => sub {
my ($serv, $conn) = @_;
$conn->on(
handshake => sub {
my ($conn,$handshake) = @_;
$conn->{"initHand"} = $handshake;
},
ready => sub {
my ($conn) = @_;
#strip the / off of the resource request and then assign just the request to $session
my $session = (split("/", $conn->{"initHand"}->req->resource_name))[1];
unless ($session) { $conn->send_utf8(generateSession()); $conn->disconnect(); print "Severed client, no session given\n"; }
joinSession($session,$conn);
#Check for user ID, if none $conn->disconnect("noid",generateUser());
},
utf8 => sub {
my ($conn, $msg) = @_;
my $sessionID = $conn->{"currentSession"}{"id"};
my $messageData = "";
eval { $messageData = from_json($msg) };
if ($@) { $conn->send_utf8('{"error":1, "message":"ERROR: Invalid json"}'); return 0;}
if ($messageData->{"type"} eq "message") {
print "'".$messageData->{"message"}."' sent in session ".$sessionID."\n";
for ($conn->server->connections) {
if ($_->{"currentSession"}{"id"} == $sessionID) { $_->send_utf8(to_json($messageData)); }
}
}
if ($messageData->{"type"} eq "update") {
print "Updating session ".$sessionID."\n";
for ($conn->server->connections) {
if ($_->{"currentSession"}{"id"} == $sessionID) {$_->send_utf(to_json($messageData)); }
}
}
},
);
},
)->start;