aboutsummaryrefslogtreecommitdiff
path: root/lib/MasterWebInterface/Database/Servers.pm
blob: f8a4b661707e7a5d878bc6fb858a1c1721bc6527 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package MasterWebInterface::Database::Servers;
use strict;
use warnings;
use Exporter 'import';
our @EXPORT = qw| dbServerListGet |;

################################################################################
## get the serverlist
################################################################################
sub dbServerListGet {
  my $s = shift;
  my %o = ( page => 1, 
            results => 50, 
            @_ 
  );
    
  my %where = (
    # gamename and char are "all" or value
    $o{gamename} !~ /all/ ? ('serverlist.gamename = ?' => $o{gamename})       : (),
    $o{updated}  ? ('dt_updated > ?'                => (time-$o{updated})) : (),
    #$o{gamename} ? ('serverlist.gamename = ?'       => $o{gamename})       : (),
    $o{nolist}   ? ('serverlist.gamename <> ?'      => $o{nolist})         : (),
    $o{search}   ? ('LOWER(hostname) LIKE LOWER(?)' => "%$o{search}%")     : (),
    $o{popserv}  ? ('numplayers > ?'                => 0)                  : (),
    $o{utdemo}   ? ('gamever = ?'                   => '348')              : (),
    
    #advanced search
    $o{hostname} ? ('LOWER(hostname) LIKE LOWER(?)' => "%$o{hostname}%")     : (),
    $o{gametype} ? ('LOWER(gametype) LIKE LOWER(?)' => "%$o{gametype}%")     : (),
    $o{mapname}  ? ('(LOWER(mapname) LIKE LOWER(?) OR LOWER(maptitle) LIKE LOWER(?))' => ["%$o{mapname}%", "%$o{mapname}%"]) : (),
    $o{country}  ? ('country         LIKE UPPER(?)' => $o{country})        : (),
    
    # sanity check for unresponsive servers or faulty queries tools, except ST:Bcommander which /is/ faulty by default
    $o{gamename} !~ /bcommander/ ? ('hostport > ?' => 0) : (),
  );
  
  my @select = ( qw| id ip hostport hostname serverlist.gamename country numplayers maxplayers maptitle mapname gametype dt_added label dt_updated| );

  my $order = sprintf {
    hostname    => 'hostname %s',
    gamename    => 'serverlist.gamename %s, gametype',
    country     => 'country %s',
    dt_added    => 'dt_added %s',
    gametype    => 'gametype %s, mapname',
    numplayers  => 'numplayers %s, maxplayers',
    maptitle    => 'maptitle %s',
    mapname     => 'mapname %s',
  }->{ $o{sort} // 'dt_added' }, $o{reverse} ? 'DESC' : 'ASC';
  
  my($r, $np) = $s->dbPage(\%o, q|
    SELECT !s FROM serverlist
      LEFT JOIN serverinfo ON serverlist.id = serverinfo.sid
      LEFT JOIN gameinfo ON serverlist.gamename = gameinfo.gamename
      !W
      ORDER BY !s |,
    join(', ', @select), \%where, $order
  );

  my $p = $s->dbAll( q|
    SELECT COUNT(*) AS num
    FROM serverlist
    LEFT JOIN serverinfo ON serverlist.id = serverinfo.sid
    !W|, \%where,
  )->[0]{num};
  return wantarray ? ($r, $np, $p) : $r;

}


1;