diff options
Diffstat (limited to 'lib/MasterWebInterface/Handler/Servers.pm')
| -rwxr-xr-x | lib/MasterWebInterface/Handler/Servers.pm | 180 |
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; |
