Completed
Push — master ( 57abcf...bb1066 )
by Travis
12:58 queued 09:31
created

Client::__call()   B

Complexity

Conditions 5
Paths 6

Size

Total Lines 28
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 5.009

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 28
ccs 13
cts 14
cp 0.9286
rs 8.439
cc 5
eloc 13
nc 6
nop 2
crap 5.009
1
<?php
2
3
namespace Syntax\SteamApi;
4
5
use stdClass;
6
use GuzzleHttp\Client as GuzzleClient;
7
use GuzzleHttp\Psr7\Request;
8
use Exception;
9
use GuzzleHttp\Exception\ClientErrorResponseException;
10
use GuzzleHttp\Exception\ServerErrorResponseException;
11
use Syntax\SteamApi\Exceptions\ApiCallFailedException;
12
use Syntax\SteamApi\Exceptions\ClassNotFoundException;
13
14
/**
15
 * @method \Syntax\SteamApi\Steam\News       news()
16
 * @method \Syntax\SteamApi\Steam\Player     player($steamId)
17
 * @method \Syntax\SteamApi\Steam\User       user($steamId)
18
 * @method \Syntax\SteamApi\Steam\User\Stats userStats($steamId)
19
 * @method \Syntax\SteamApi\Steam\App        app()
20
 * @method \Syntax\SteamApi\Steam\Group      group()
21
 * @method \Syntax\SteamApi\Steam\Item       item($appId)
22
 */
23
class Client
24
{
25
    use SteamId;
26
27
    public $validFormats = ['json', 'xml', 'vdf'];
28
29
    protected $url = 'http://api.steampowered.com/';
30
31
    protected $client;
32
33
    protected $interface;
34
35
    protected $method;
36
37
    protected $version = 'v0002';
38
39
    protected $apiKey;
40
41
    protected $apiFormat = 'json';
42
43
    protected $steamId;
44
45
    protected $isService = false;
46
47 42
    public function __construct()
48
    {
49 42
        $apiKey = $this->getApiKey();
50
51 42
        $this->client = new GuzzleClient();
52 42
        $this->apiKey = $apiKey;
53
54
        // Set up the Ids
55 42
        $this->setUpFormatted();
56 42
    }
57
58
    public function get()
59
    {
60
        return $this;
61
    }
62
63 2
    public function getSteamId()
64
    {
65 2
        return $this->steamId;
66
    }
67
68
    /**
69
     * @param string $arguments
70
     *
71
     * @return string
72
     *
73
     * @throws ApiArgumentRequired
74
     * @throws ApiCallFailedException
75
     */
76 10
    protected function setUpService($arguments = null)
77
    {
78
        // Services have a different url syntax
79 10
        if ($arguments == null) {
0 ignored issues
show
Bug introduced by
It seems like you are loosely comparing $arguments of type string|null against null; this is ambiguous if the string can be empty. Consider using a strict comparison === instead.
Loading history...
80
            throw new ApiArgumentRequired;
81
        }
82
83
        $parameters = [
84 10
            'key'        => $this->apiKey,
85 10
            'format'     => $this->apiFormat,
86 10
            'input_json' => $arguments,
87 10
        ];
88
89 10
        $steamUrl = $this->buildUrl(true);
90
91
        // Build the query string
92 10
        $parameters = http_build_query($parameters);
93
94
        // Send the request and get the results
95 10
        $request  = new Request('GET', $steamUrl . '?' . $parameters);
96 10
        $response = $this->sendRequest($request);
0 ignored issues
show
Documentation introduced by
$request is of type object<GuzzleHttp\Psr7\Request>, but the function expects a object<Guzzle\Http\Message\RequestInterface>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
97
98
        // Pass the results back
99 10
        return $response->body;
100
    }
101
102 17
    protected function setUpClient(array $arguments = [])
103 1
    {
104 17
        $versionFlag = ! is_null($this->version);
105 17
        $steamUrl    = $this->buildUrl($versionFlag);
106
107
        $parameters = [
108 17
            'key'    => $this->apiKey,
109 17
            'format' => $this->apiFormat,
110 17
        ];
111
112 17
        if (! empty($arguments)) {
113 16
            $parameters = array_merge($arguments, $parameters);
114 16
        }
115
116
        // Build the query string
117 17
        $parameters = http_build_query($parameters);
118
119
        // Send the request and get the results
120 17
        $request  = new Request('GET', $steamUrl . '?' . $parameters);
121 17
        $response = $this->sendRequest($request);
0 ignored issues
show
Documentation introduced by
$request is of type object<GuzzleHttp\Psr7\Request>, but the function expects a object<Guzzle\Http\Message\RequestInterface>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
122
123
        // Pass the results back
124 17
        return $response->body;
125
    }
126
127 4
    protected function setUpXml(array $arguments = [])
128
    {
129 4
        $steamUrl = $this->buildUrl();
130
131
        // Build the query string
132 4
        $parameters = http_build_query($arguments);
133
134
        // Pass the results back
135 4
        return simplexml_load_file($steamUrl . '?' . $parameters);
136
    }
137
138
    /**
139
     * @param \Guzzle\Http\Message\RequestInterface $request
140
     *
141
     * @throws ApiCallFailedException
142
     * @return stdClass
143
     */
144 27
    protected function sendRequest($request)
145
    {
146
        // Try to get the result.  Handle the possible exceptions that can arise
147
        try {
148 27
            $response = $this->client->send($request);
149
150 27
            $result       = new stdClass();
151 27
            $result->code = $response->getStatusCode();
152 27
            $result->body = json_decode($response->getBody(true));
0 ignored issues
show
Unused Code introduced by
The call to ResponseInterface::getBody() has too many arguments starting with true.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
153 27
        } catch (ClientErrorResponseException $e) {
0 ignored issues
show
Bug introduced by
The class GuzzleHttp\Exception\ClientErrorResponseException does not exist. Did you forget a USE statement, or did you not list all dependencies?

Scrutinizer analyzes your composer.json/composer.lock file if available to determine the classes, and functions that are defined by your dependencies.

It seems like the listed class was neither found in your dependencies, nor was it found in the analyzed files in your repository. If you are using some other form of dependency management, you might want to disable this analysis.

Loading history...
154
            throw new ApiCallFailedException($e->getMessage(), $e->getResponse()->getStatusCode(), $e);
155
        } catch (ServerErrorResponseException $e) {
0 ignored issues
show
Bug introduced by
The class GuzzleHttp\Exception\ServerErrorResponseException does not exist. Did you forget a USE statement, or did you not list all dependencies?

Scrutinizer analyzes your composer.json/composer.lock file if available to determine the classes, and functions that are defined by your dependencies.

It seems like the listed class was neither found in your dependencies, nor was it found in the analyzed files in your repository. If you are using some other form of dependency management, you might want to disable this analysis.

Loading history...
156
            throw new ApiCallFailedException('Api call failed to complete due to a server error.', $e->getResponse()->getStatusCode(), $e);
157
        } catch (Exception $e) {
158
            throw new ApiCallFailedException($e->getMessage(), $e->getCode(), $e);
159
        }
160
161
        // If all worked out, return the result
162 27
        return $result;
163
    }
164
165 30
    private function buildUrl($version = false)
166
    {
167
        // Set up the basic url
168 30
        $url = $this->url . $this->interface . '/' . $this->method . '/';
169
170
        // If we have a version, add it
171 30
        if ($version) {
172 25
            return $url . $this->version . '/';
173
        }
174
175 5
        return $url;
176
    }
177
178 33
    public function __call($name, $arguments)
179
    {
180
        // Handle a steamId being passed
181 33
        if (! empty($arguments) && count($arguments) == 1) {
182 27
            $this->steamId = $arguments[0];
183
184 27
            $this->convertSteamIdTo64();
185 27
        }
186
187
        // Inside the root steam directory
188 33
        $class      = ucfirst($name);
189 33
        $steamClass = '\Syntax\SteamApi\Steam\\' . $class;
190
191 33
        if (class_exists($steamClass)) {
192 28
            return new $steamClass($this->steamId);
193
        }
194
195
        // Inside a nested directory
196 6
        $class      = implode('\\', preg_split('/(?=[A-Z])/', $class, -1, PREG_SPLIT_NO_EMPTY));
197 6
        $steamClass = '\Syntax\SteamApi\Steam\\' . $class;
198
199 6
        if (class_exists($steamClass)) {
200 6
            return new $steamClass($this->steamId);
201
        }
202
203
        // Nothing found
204
        throw new ClassNotFoundException($name);
205
    }
206
207
    /**
208
     * @param Collection $objects
209
     *
210
     * @return $this
211
     */
212 7
    protected function sortObjects($objects)
213
    {
214 7
        return $objects->sortBy(function ($object) {
215 7
            return $object->name;
216 7
        });
217
    }
218
219
    /**
220
     * @param string $method
221
     * @param string $version
222
     */
223 10
    protected function setApiDetails($method, $version)
224
    {
225 10
        $this->method  = $method;
226 10
        $this->version = $version;
227 10
    }
228
229 10
    protected function getServiceResponse($arguments)
230
    {
231 10
        $arguments = json_encode($arguments);
232
233
        // Get the client
234 10
        $client = $this->setUpService($arguments)->response;
235
236 10
        return $client;
237
    }
238
239
    /**
240
     * @return string
241
     * @throws Exceptions\InvalidApiKeyException
242
     */
243 42
    protected function getApiKey()
244
    {
245 42
        $apiKey = \Config::get('steam-api.steamApiKey');
246
247 42
        if ($apiKey == 'YOUR-API-KEY') {
248
            throw new Exceptions\InvalidApiKeyException();
249
        }
250 42
        if (is_null($apiKey) || $apiKey == '' || $apiKey == []) {
251 42
            $apiKey = getenv('apiKey');
252 42
        }
253
254 42
        return $apiKey;
255
    }
256
257 27
    private function convertSteamIdTo64()
258
    {
259 27
        if (is_array($this->steamId)) {
260 1
            array_walk($this->steamId, function (&$id) {
261 1
                if (strpos($id, ':') !== false) {
262
                    // Convert the id to all types and grab the 64 bit version
263 1
                    $id = $this->convertToAll($id)->id64;
264 1
                }
265 1
            });
266 27
        } elseif (strpos(':', $this->steamId) !== false) {
267
            // Convert the id to all types and grab the 64 bit version
268
            $this->steamId = $this->convertToAll($this->steamId)->id64;
269
        }
270 27
    }
271
}
272