aboutsummaryrefslogtreecommitdiff
path: root/lib/MasterWebInterface/Handler/Json/JsonServerInfo.pm
blob: e6f5b449aa686121c7b199c03e5074cdf7b8a101 (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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package MasterWebInterface::Handler::Json::JsonServerInfo;
use strict;
use TUWF ':html';
use Exporter 'import';
use JSON;

TUWF::register(
    qr{json/(.[\w]{1,20})/([\:\.\w]{9,35})} => \&json_serverinfo,
);

################################################################################
# Server Info
# Show server info for an individual server
# Same as &server_info, but with json output. 
# returns "error:1" if errors occurred
################################################################################
sub json_serverinfo 
{
    my ($self, $gamename, $s_addr, $s_port) = @_;

    # parse from ipv4/6 and soft sanity check
    my ($ip, $port) = $self->from_addr_str($s_addr);

    # select server from database
    my $info = $self->dbGetServerInfo(
        ip => $ip,
        hostport => $port,
        limit => 1,
    )->[0] if ($ip && $port);

    # display an error in case of an invalid IP or port
    unless ($info)
    {
        my %err = (error => 1, ip => $ip, port => $port);
        my $e = \%err;
        my $json_data = encode_json $e;
        my $json_data_size = keys %$e;

        # return json data as the response
        print { $self->resFd() } $json_data;

        # set content type at the end
        $self->resHeader("Access-Control-Allow-Origin", "*");
        $self->resHeader("Content-Type", "application/json; charset=UTF-8");
        return;
    }

    # load player data if available
    my %players = ();
    my $pl_list = $self->dbGetPlayerInfoList(sid => $info->{id});
    
    for (my $i=0; defined $pl_list->[$i]->{name}; $i++) 
    {
        $players{"player_$i"} = $pl_list->[$i];
    }
    
    use Data::Dumper 'Dumper';
    my $str = Dumper $pl_list;
    
    # merge 
    #$info = { %$info, %$details } if $details;
    $info = { %$info, %players  } if %players;


    # find the correct thumbnail, otherwise game default, otherwise 333 default
    my $mapname = lc $info->{mapname};

    # if map figure exists, use it
    if (-e "$self->{root}/s/map/$info->{gamename}/$mapname.jpg") 
    {
        # map image
        $info->{mapurl} = "/map/$info->{gamename}/$mapname.jpg";
    }
    # if not, game default image
    elsif (-e "$self->{root}/s/map/default/$info->{gamename}.jpg") 
    {
        # game image
        $info->{mapurl} = "/map/default/$info->{gamename}.jpg";
    }
    # otherwise 333networks default
    else
    {
        # 333networks default
        $info->{mapurl} = "/map/default/333networks.jpg";
    }
    
    # encode
    my $json_data = encode_json $info;
    my $json_data_size = keys %$info;

    # return json data as the response
    print { $self->resFd() } $json_data;

    # set content type and allow off-domain access (for example jQuery)
    $self->resHeader("Access-Control-Allow-Origin", "*");
    $self->resHeader("Content-Type", "application/json; charset=UTF-8");
}

1;