aboutsummaryrefslogtreecommitdiff
path: root/lib/MasterServer/Database/Pg/dbBeacon.pm
diff options
context:
space:
mode:
authorDarkelarious <darkelarious@333networks.com>2015-02-09 07:58:06 +0100
committerDarkelarious <darkelarious@333networks.com>2015-02-09 07:58:06 +0100
commit5057ec47aa9a1702b2483e0a0b3ba325bb0b7abb (patch)
treeb1a394f64ec7ec2cf69f33bceb54a5b51199c0a4 /lib/MasterServer/Database/Pg/dbBeacon.pm
parent6ac9d390e417b868b6ed79441b8cc6e1b2ebeb13 (diff)
downloadMasterServer-Perl-5057ec47aa9a1702b2483e0a0b3ba325bb0b7abb.tar.gz
MasterServer-Perl-5057ec47aa9a1702b2483e0a0b3ba325bb0b7abb.zip
receive UDP beacons, validate them and store with country indicator
Diffstat (limited to 'lib/MasterServer/Database/Pg/dbBeacon.pm')
-rwxr-xr-xlib/MasterServer/Database/Pg/dbBeacon.pm123
1 files changed, 123 insertions, 0 deletions
diff --git a/lib/MasterServer/Database/Pg/dbBeacon.pm b/lib/MasterServer/Database/Pg/dbBeacon.pm
new file mode 100755
index 0000000..a234b25
--- /dev/null
+++ b/lib/MasterServer/Database/Pg/dbBeacon.pm
@@ -0,0 +1,123 @@
+
+package MasterServer::Database::Pg::dbBeacon;
+
+use strict;
+use warnings;
+use Exporter 'import';
+
+our @EXPORT = qw| add_beacon get_pending_beacon remove_pending set_direct_beacon |;
+
+## Update beacon in serverlist or pending list. Add if beacon does not exist in
+## either list. Return 0,1,2 if success in adding or -1 on error
+sub add_beacon {
+ my ($self, $ip, $beaconport, $heartbeat, $gamename, $secure) = @_;
+
+ # if address is in list, update the timestamp
+ my $u = $self->{dbh}->do(
+ "UPDATE serverlist
+ SET beacon = NOW(),
+ updated = NOW(),
+ gamename = ?,
+ b333ms = TRUE
+ WHERE ip = ?
+ AND port = ?",
+ undef, lc $gamename, $ip, $heartbeat);
+
+ # notify
+ $self->log("updated", "beacon heartbeat for $ip:$heartbeat") if ($u > 0);
+
+ # if serverlist was updated return 0
+ return 0 if ($u > 0);
+
+ # if it is already in the pending list, update it with a new challenge
+ $u = $self->{dbh}->do(
+ "UPDATE pending
+ SET added = NOW(),
+ beaconport = ?,
+ gamename = ?,
+ secure = ?
+ WHERE ip = ?
+ AND heartbeat = ?",
+ undef, $beaconport, lc $gamename, $secure, $ip, $heartbeat);
+
+ # notify
+ $self->log("updated", "beacon heartbeat $ip:$beaconport pending $gamename:$heartbeat") if ($u > 0);
+
+ # beacon was already in pending list and was updated
+ return 1 if ($u > 0);
+
+ # if not found, add it
+ $u = $self->{dbh}->do(
+ "INSERT INTO pending (ip, beaconport, heartbeat, gamename, secure)
+ SELECT ?, ?, ?, ?, ?",
+ undef, $ip, $beaconport, $heartbeat, lc $gamename, $secure);
+
+ # notify
+ $self->log("added", "beacon heartbeat $ip:$beaconport pending $gamename:$heartbeat") if ($u > 0);
+
+ # it was added to pending
+ return 2 if ($u > 0);
+
+ # or else report error
+ $self->log("error", "an error occurred adding beacon $ip:$beaconport with $gamename:$heartbeat to the pending list");
+ return -1;
+}
+
+
+## Get pending server by ip, beacon port.
+sub get_pending_beacon {
+ my ($self, $ip, $port) = @_;
+
+ # if address is in list, update the timestamp
+ return $self->{dbh}->selectall_arrayref(
+ "SELECT * FROM pending
+ WHERE ip = ?
+ AND beaconport = ?",
+ undef, $ip, $port)->[0];
+}
+
+
+## server checks out, remove entry from the pending list.
+sub remove_pending {
+ my ($self, $id) = @_;
+
+ # if address is in list, update the timestamp
+ my $u = $self->{dbh}->do("DELETE FROM pending WHERE id = ?", undef, $id);
+
+ # notify
+ $self->log("deleted", "removed pending id $id from the list of pending servers") if ($u > 0);
+
+ # it was added to pending
+ return 2 if ($u > 0);
+
+ # or else report error
+ $self->log("error", "an error occurred deleting server $id from the pending list");
+ return -1;
+}
+
+
+## mark server as "direct beacon to this masterserver"
+sub set_direct_beacon {
+ my ($self, $ip, $port) = @_;
+
+ # update or add server to serverlist
+ my $u = $self->{dbh}->do("UPDATE serverlist
+ SET b333ms = TRUE
+ WHERE ip = ?
+ AND port = ?",
+ undef, $ip, $port);
+
+ # notify
+ $self->log("updated", "$ip:$port is a direct beacon.") if ($u > 0);
+
+ # if found, updated; done
+ return 0 if ($u > 0);
+
+ # or else report error
+ $self->log("error", "an error occurred setting server $ip:$port as direct beacon");
+ return -1;
+}
+
+
+
+1;