Gtar   A
last analyzed

Complexity

Total Complexity 7

Size/Duplication

Total Lines 130
Duplicated Lines 0 %

Test Coverage

Coverage 71.88%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 7
eloc 44
c 1
b 0
f 0
dl 0
loc 130
ccs 23
cts 32
cp 0.7188
rs 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
A beforeSend() 0 14 2
A processResponse() 0 43 5
1
<?php
2
/**
3
 * This file is part of GameQ.
4
 *
5
 * GameQ is free software; you can redistribute it and/or modify
6
 * it under the terms of the GNU Lesser General Public License as published by
7
 * the Free Software Foundation; either version 3 of the License, or
8
 * (at your option) any later version.
9
 *
10
 * GameQ is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU Lesser General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU Lesser General Public License
16
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
 */
18
namespace GameQ\Protocols;
19
20
use GameQ\Exception\Protocol as Exception;
21
use GameQ\Result;
22
use GameQ\Server;
23
24
/**
25
 * Grand Theft Auto Rage Protocol Class
26
 * https://rage.mp/masterlist/
27
 *
28
 * Result from this call should be a header + JSON response
29
 *
30
 * @author K700 <[email protected]>
31
 * @author Austin Bischoff <[email protected]>
32
 */
33
class Gtar extends Http
34
{
35
    /**
36
     * Packets to send
37
     *
38
     * @var array
39
     */
40
    protected $packets = [
41
        self::PACKET_STATUS => "GET /master/ HTTP/1.0\r\nHost: cdn.rage.mp\r\nAccept: */*\r\n\r\n",
42
    ];
43
44
    /**
45
     * Http protocol is SSL
46
     *
47
     * @var string
48
     */
49
    protected $transport = self::TRANSPORT_SSL;
50
51
    /**
52
     * The protocol being used
53
     *
54
     * @var string
55
     */
56
    protected $protocol = 'gtar';
57
58
    /**
59
     * String name of this protocol class
60
     *
61
     * @var string
62
     */
63
    protected $name = 'gtar';
64
65
    /**
66
     * Longer string name of this protocol class
67
     *
68
     * @var string
69
     */
70
    protected $name_long = "Grand Theft Auto Rage";
71
72
    /**
73
     * Holds the real ip so we can overwrite it back
74
     *
75
     * @var string
76
     */
77
    protected $realIp = null;
78
79
    protected $realPortQuery = null;
80
81
    /**
82
     * Normalize some items
83
     *
84
     * @var array
85
     */
86
    protected $normalize = [
87
        // General
88
        'general' => [
89
            // target       => source
90
            'dedicated'  => 'dedicated',
91
            'hostname'   => 'hostname',
92
            'mod'        => 'mod',
93
            'maxplayers' => 'maxplayers',
94
            'numplayers' => 'numplayers',
95
        ],
96
    ];
97
98 12
    public function beforeSend(Server $server)
99
    {
100
        // Loop over the packets and update them
101 12
        foreach ($this->packets as $packetType => $packet) {
102
            // Fill out the packet with the server info
103 12
            $this->packets[$packetType] = sprintf($packet, $server->ip . ':' . $server->port_query);
104
        }
105
106 12
        $this->realIp = $server->ip;
107 12
        $this->realPortQuery = $server->port_query;
108
109
        // Override the existing settings
110 12
        $server->ip = 'cdn.rage.mp';
111 12
        $server->port_query = 443;
112
    }
113
114
    /**
115
     * Process the response
116
     *
117
     * @return array
118
     * @throws Exception
119
     */
120 12
    public function processResponse()
121
    {
122
        // No response, assume offline
123 12
        if (empty($this->packets_response)) {
124
            return [
125
                'gq_address'    => $this->realIp,
126
                'gq_port_query' => $this->realPortQuery,
127
            ];
128
        }
129
130
        // Implode and rip out the JSON
131 12
        preg_match('/\{(.*)\}/ms', implode('', $this->packets_response), $matches);
132
133
        // Return should be JSON, let's validate
134 12
        if (!isset($matches[0]) || ($json = json_decode($matches[0])) === null) {
135
            throw new Exception("JSON response from Gtar protocol is invalid.");
136
        }
137
138 12
        $address = $this->realIp.':'.$this->realPortQuery;
139 12
        $server = $json->$address;
140
141 12
        if (empty($server)) {
142
            return [
143
                'gq_address'    => $this->realIp,
144
                'gq_port_query' => $this->realPortQuery,
145
            ];
146
        }
147
148 12
        $result = new Result();
149
150
        // Server is always dedicated
151 12
        $result->add('dedicated', 1);
152
153 12
        $result->add('gq_address', $this->realIp);
154 12
        $result->add('gq_port_query', $this->realPortQuery);
155
156
        // Add server items
157 12
        $result->add('hostname', $server->name);
158 12
        $result->add('mod', $server->gamemode);
159 12
        $result->add('numplayers', $server->players);
160 12
        $result->add('maxplayers', $server->maxplayers);
161
162 12
        return $result->fetch();
163
    }
164
}
165