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;
|