aboutsummaryrefslogtreecommitdiff
path: root/lib/MasterWebInterface/Handler/Servers.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/MasterWebInterface/Handler/Servers.pm')
-rwxr-xr-xlib/MasterWebInterface/Handler/Servers.pm180
1 files changed, 180 insertions, 0 deletions
diff --git a/lib/MasterWebInterface/Handler/Servers.pm b/lib/MasterWebInterface/Handler/Servers.pm
new file mode 100755
index 0000000..374cddf
--- /dev/null
+++ b/lib/MasterWebInterface/Handler/Servers.pm
@@ -0,0 +1,180 @@
+package MasterWebInterface::Handler::Servers;
+use strict;
+use utf8;
+use TUWF ':html';
+use Exporter 'import';
+
+TUWF::register(
+ qr{} => \&serverlist,
+ qr{s} => \&serverlist,
+ qr{s/(.[\w]{1,20})} => \&serverlist,
+);
+
+################################################################################
+# List servers
+# Generate a list of selected games in the database per game (arg: gamename)
+################################################################################
+sub serverlist
+{
+ my($self, $gamename) = @_;
+ $gamename = "all" unless $gamename;
+
+ # sorting, page
+ my $f = $self->formValidate(
+ {
+ get => 's',
+ required => 0,
+ default => 'gamename',
+ enum => [ qw| hostname gamename country dt_added gametype numplayers mapname | ]
+ },
+ {
+ get => 'o',
+ required => 0,
+ default => 'a',
+ enum => [ 'a','d' ]
+ },
+ {
+ get => 'p',
+ required => 0,
+ default => 1,
+ template => 'page',
+ },
+ {
+ get => 'q',
+ required => 0,
+ default => '',
+ maxlength => 90
+ },
+ {
+ get => 'r',
+ required => 0,
+ default => 50,
+ template => 'page'
+ },
+ {
+ get => 'g',
+ required => 0,
+ default => '',
+ maxlength => 90
+ },
+ );
+ return $self->resNotFound if $f->{_err};
+
+ # load server list from database
+ my ( $list, $np, $p ) = $self->dbServerListGet(
+ sort => $f->{s},
+ reverse => $f->{o} eq 'd',
+ gamename => $gamename,
+ search => $f->{q},
+ page => $f->{p},
+ updated => $self->{window_time},
+ results => $f->{r},
+ gametype => $f->{g},
+ # don't show 333networks in default list
+ $gamename ne "333networks" ? ( nolist => "333networks") : (),
+ );
+
+ # game name description in title
+ my $gn_desc = $self->dbGetGameDesc($gamename) // $gamename;
+
+ #
+ # page
+ #
+
+ # Write page
+ $self->htmlHeader(title => "Browse $gn_desc game servers");
+ $self->htmlSearchBox(
+ title => "$gn_desc Servers",
+ action => "/s/$gamename",
+ sel => 's',
+ fq => $f->{q}
+ );
+
+
+ #
+ # server list
+ $self->htmlBrowse(
+ items => $list,
+ options => $f,
+ total => $p,
+ nextpage => [$p,$f->{r}],
+ pageurl => "/s/$gamename?o=$f->{o};s=$f->{s};q=$f->{q}",
+ sorturl => "/s/$gamename?q=$f->{q}",
+ class => "serverlist",
+ ($p <= 0) ? (footer => sub
+ {
+ Tr;
+ td colspan => 6, class => 'tc2', 'No online servers found';
+ end 'tr';
+ }) : (),
+ header => [
+ [ '', 'country' ],
+ [ 'Server Name', 'hostname' ],
+ [ 'Game', 'gamename' ],
+ [ 'Gametype', 'gametype' ],
+ [ 'Players', 'numplayers' ],
+ [ 'Map', 'mapname' ],
+ ],
+ row => sub
+ {
+
+ my($s, $n, $l) = @_;
+ Tr $n % 2 ? (class => 's odd') : (class => 's');
+
+ # country flag
+ my ($flag, $country) = $self->countryflag($l->{country});
+ td class => "tc1",
+ style => "background-image: url(/flag/$flag.svg);",
+ title => $country,
+ '';
+
+ # server name
+ my $ip = $self->to_ipv4_str($l->{ip});
+ my $hp = $l->{hostport} // 0;
+ my $gn = $l->{gamename} // "";
+ td class => "tc2";
+ a href => "/$gn/$ip:$hp",
+ title => $l->{hostname} // "[unnamed $gn server]",
+ $l->{hostname} // "[unnamed $gn server]";
+ end;
+
+ # gamename + icon
+ if (-e "$self->{root}/s/icon32/$gn.png" )
+ {
+ td class => "tc3 icon",
+ style => "background-image: url(/icon32/$gn.png);",
+ title => $l->{label};
+ a href => "/s/$gn", "";
+ end;
+ }
+ else
+ {
+ td $gn;
+ }
+
+ # game type (CTF, DM, Masterserver, CoopGame)
+ td class => "tc4",
+ title => $l->{gametype} // "",
+ $l->{gametype} // "";
+
+ # number of players / maximum players
+ td class => "tc5";
+ txt $l->{numplayers} // 0;
+ txt "/";
+ txt $l->{maxplayers} // 0;
+ end;
+
+ # map title/name
+ my $mapname = $l->{mapname} // $l->{maptitle} // "";
+ my $maptitle = ( $l->{maptitle} && lc $l->{maptitle} ne "untitled" )
+ ? $l->{maptitle}
+ : $mapname;
+ td class => "tc6", title => $mapname, $maptitle;
+ end;
+ },
+ );
+
+ $self->htmlFooter;
+}
+
+1;