aboutsummaryrefslogtreecommitdiff
path: root/lib/MasterWebInterface/Handler
diff options
context:
space:
mode:
authorDarkelarious <darkelarious@333networks.com>2022-08-26 13:26:33 +0200
committerDarkelarious <darkelarious@333networks.com>2022-08-26 13:26:33 +0200
commit8ec88b566c5f3edc65f25adc0716c3493689cd08 (patch)
treedbbde9a694f6b4052ec39a45f0010955c668da3c /lib/MasterWebInterface/Handler
parentc5f43733533fe9b5708bd065a12c5fac86ccebed (diff)
downloadWebInterface-Perl-8ec88b566c5f3edc65f25adc0716c3493689cd08.tar.gz
WebInterface-Perl-8ec88b566c5f3edc65f25adc0716c3493689cd08.zip
advanced filtering
Diffstat (limited to 'lib/MasterWebInterface/Handler')
-rwxr-xr-xlib/MasterWebInterface/Handler/ErrorPages.pm6
-rwxr-xr-xlib/MasterWebInterface/Handler/Games.pm9
-rwxr-xr-xlib/MasterWebInterface/Handler/ServInfo.pm15
-rwxr-xr-xlib/MasterWebInterface/Handler/Servers.pm91
4 files changed, 78 insertions, 43 deletions
diff --git a/lib/MasterWebInterface/Handler/ErrorPages.pm b/lib/MasterWebInterface/Handler/ErrorPages.pm
index ccf5555..1678acc 100755
--- a/lib/MasterWebInterface/Handler/ErrorPages.pm
+++ b/lib/MasterWebInterface/Handler/ErrorPages.pm
@@ -9,7 +9,7 @@ TUWF::set(
);
TUWF::register(
- qr{500} => sub {die "Process died on purpose, but with a lot of text to test if the whole error is correctly displayed on the screen when debug information is enabled in the website configuration, "},
+ qr{500} => sub {die "Process died on purpose, but with a lot of text to test if the whole error is correctly displayed on the screen when debug information is enabled in the website configuration. "},
);
#
@@ -32,7 +32,7 @@ sub handle404
$self->resStatus(404);
$self->htmlHeader(title => '404 - Not Found');
- $self->htmlSearchBox(title => "Servers", action => "/s", sel => 's', fq => '');
+ $self->htmlFilterBox(title => "Servers", action => "/s", sel => 's', fq => '');
div class => "mainbox warning";
div class => "header";
@@ -72,7 +72,7 @@ sub handle500
$self->resStatus(500);
$self->htmlHeader(title => '500 - Internal Server Error');
- $self->htmlSearchBox(title => "Servers", action => "/s", sel => 's', fq => '');
+ $self->htmlFilterBox(title => "Servers", action => "/s", sel => 's', fq => '');
div class => "mainbox warning";
div class => "header";
diff --git a/lib/MasterWebInterface/Handler/Games.pm b/lib/MasterWebInterface/Handler/Games.pm
index affebf6..cec7ab1 100755
--- a/lib/MasterWebInterface/Handler/Games.pm
+++ b/lib/MasterWebInterface/Handler/Games.pm
@@ -6,8 +6,8 @@ use TUWF ':html';
use Exporter 'import';
TUWF::register(
- qr{g} => \&gamelist,
- qr{g(|/all)} => \&gamelist,
+ qr{g} => \&gamelist,
+ qr{g/all} => \&gamelist,
);
#
@@ -35,11 +35,10 @@ sub gamelist
search => $f->{q},
results => $f->{r},
all => $all,
-
);
$self->htmlHeader(title => "Browse Games");
- $self->htmlSearchBox(title => "Games", action => "/g/all", sel => 'g', fq => $f->{q});
+ $self->htmlFilterBox(title => "Games", action => "/g/all", sel => 'g', fq => $f->{q});
#
# game list
@@ -100,7 +99,7 @@ sub gamelist
# number of beacons / servers
td title => ($l->{num_direct} // 0) . " / " . ($l->{num_total} // 0),
- $l->{num_direct} // 0;
+ $l->{num_total} // 0;
end;
},
);
diff --git a/lib/MasterWebInterface/Handler/ServInfo.pm b/lib/MasterWebInterface/Handler/ServInfo.pm
index fbe5d35..8b3d7d8 100755
--- a/lib/MasterWebInterface/Handler/ServInfo.pm
+++ b/lib/MasterWebInterface/Handler/ServInfo.pm
@@ -45,8 +45,12 @@ sub show_server
# otherwise not found in database, soft error page (no 404 status)
$self->htmlHeader(title => 'Server not found');
- $self->htmlSearchBox(title => "Servers", action => "/s", sel => 's', fq => '');
-
+ $self->htmlFilterBox(
+ sel => 's',
+ fq => '',
+ ($gamename ? (gamename => $gamename) : () ),
+ );
+
div class => "mainbox warning";
div class => "header";
h1 'Server not found';
@@ -83,11 +87,10 @@ sub show_server
#
# generate info page
$self->htmlHeader(title => $info->{hostname} // "Server");
- $self->htmlSearchBox(
- title => "$gamedescription Servers",
- action => "/s/$gamename",
+ $self->htmlFilterBox(
+ gamename => $gamename,
sel => 's',
- fq => ''
+ fq => '',
);
# serverinfo box
diff --git a/lib/MasterWebInterface/Handler/Servers.pm b/lib/MasterWebInterface/Handler/Servers.pm
index 98d27df..34c0182 100755
--- a/lib/MasterWebInterface/Handler/Servers.pm
+++ b/lib/MasterWebInterface/Handler/Servers.pm
@@ -5,9 +5,9 @@ use TUWF ':html';
use Exporter 'import';
TUWF::register(
- qr{} => \&serverlist,
- qr{s} => \&serverlist,
- qr{s/([\w]{1,20})} => \&serverlist,
+ qr{} => \&serverlist,
+ qr{(s|adv)} => \&serverlist,
+ qr{(s|adv)/([\w]{0,20})} => \&serverlist,
);
#
@@ -15,60 +15,91 @@ TUWF::register(
#
sub serverlist
{
- my($self, $gamename) = @_;
- $gamename = "all" unless $gamename;
+ my($self, $adv, $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 => 'r', required => 0, default => 50, template => 'page' },
{ get => 'q', required => 0, default => '', maxlength => 90 },
- { get => 'g', required => 0, default => '', maxlength => 90 },
+
+ # advanced search
+ { get => 'gamename', required => 0, default => '', maxlength => 90 }, # gamename in advanced search
+ { get => 'gametype', required => 0, default => '', maxlength => 90 }, # gametype
+ { get => 'hostname', required => 0, default => '', maxlength => 90 }, # hostname (replaces q in advanced search)
+ { get => 'mapname', required => 0, default => '', maxlength => 90 }, # mapname
+ { get => 'country', required => 0, default => '', maxlength => 90 }, # country (code)
);
return $self->resNotFound if $f->{_err};
- # load server list from database
+ # set correct gamename (form always overwrites url)
+ $gamename = ( $f->{gamename} ? $f->{gamename} : $gamename);
+
+ # load server list from database FIXME order of list, duplicates
my ( $list, $np, $p ) = $self->dbServerListGet(
sort => $f->{s},
reverse => $f->{o} eq 'd',
- gamename => $gamename,
search => $f->{q},
page => $f->{p},
+ results => 50,
updated => $self->{window_time},
- results => $f->{r},
- gametype => $f->{g},
- # don't show 333networks in default list
- $gamename ne "333networks" ? ( nolist => "333networks") : (),
+ gamename => $gamename,
+ gametype => $f->{gametype},
+ hostname => $f->{hostname},
+ mapname => $f->{mapname},
+ country => $f->{country},
+
+ # don't show 333networks in default list, but show in advanced search by default
+ !($gamename eq "333networks" or $f->{gamename} eq "333networks") ? ( nolist => "333networks") : (),
);
- # game name description in title
- my $gn_desc = $self->dbGetGameDesc($gamename) // $gamename;
-
# Write page
- $self->htmlHeader(title => "Browse $gn_desc game servers");
- $self->htmlSearchBox(
- title => "$gn_desc Servers",
- action => "/s/$gamename",
- sel => 's',
- fq => $f->{q}
- );
-
+ $self->htmlHeader(title => "Servers");
+
+ # search box type: simple or advanced
+ if ($adv eq 'adv')
+ {
+ # advanced filter box with additional search fields
+ $self->htmlAdvancedFilterBox(
+ sel => 's',
+ %{$f}, # previous parameters
+ gamename => $gamename,
+ );
+ }
+ else # $adv eq "adv"
+ {
+ # simple search box
+ $self->htmlFilterBox(
+ sel => 's',
+ ($gamename ? (gamename => $gamename) : () ),
+ action => "/s/$gamename",
+ fq => $f->{q},
+ );
+ }
+
+ # construct page URLs
+ my $pageurl = "/$adv/$gamename?"
+ . ( $adv eq "adv" ? "gamename=$f->{gamename}&gametype=$f->{gametype}&hostname=$f->{hostname}&mapname=$f->{mapname}&country=$f->{country}&o=$f->{o};s=$f->{s}" : "")
+ . ( $adv eq "s" ? "o=$f->{o};s=$f->{s};q=$f->{q}" : "");
+ my $sorturl = "/$adv/$gamename?"
+ . ( $adv eq "adv" ? "gamename=$f->{gamename}&gametype=$f->{gametype}&hostname=$f->{hostname}&mapname=$f->{mapname}&country=$f->{country}" : "")
+ . ( $adv eq "s" ? "q=$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}",
+ nextpage => [$p,50],
+ pageurl => $pageurl, #"/$adv/$gamename?o=$f->{o};s=$f->{s};q=$f->{q}",
+ sorturl => $sorturl, #"/$adv/$gamename?q=$f->{q}",
class => "serverlist",
($p <= 0) ? (footer => sub
{
Tr;
- td colspan => 6, class => 'tc2', 'No online servers found';
+ td colspan => 6, class => 'tc2', 'No online servers found.';
end 'tr';
}) : (),
header => [
@@ -86,6 +117,7 @@ sub serverlist
Tr $n % 2 ? (class => 's odd') : (class => 's');
# country flag
+ # TODO: advanced filter by country only
my ($flag, $country) = $self->countryflag($l->{country});
td class => "tc1",
style => "background-image: url(/flag/$flag.svg);",
@@ -108,7 +140,7 @@ sub serverlist
td class => "tc3 icon",
style => "background-image: url(/icon32/$gn.png);",
title => $l->{label};
- a href => "/s/$gn", "";
+ a href => "/$adv/$gn", "";
end;
}
else
@@ -117,6 +149,7 @@ sub serverlist
}
# game type (hover: raw, display: parsed)
+ # TODO: advanced filter by gametype only
td class => "tc4",
title => $l->{gametype},
$self->better_gametype($l->{gametype});