Failed Conditions
Pull Request — master (#353)
by Florian
03:08
created

getPokemonCountsActive()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 7
nc 2
nop 0
dl 0
loc 9
rs 9.6666
c 0
b 0
f 0
1
<?php
2
3
final class QueryManagerMysqlRocketmap extends QueryManagerMysql {
0 ignored issues
show
Coding Style Compatibility introduced by
PSR1 recommends that each class must be in a namespace of at least one level to avoid collisions.

You can fix this by adding a namespace to your class:

namespace YourVendor;

class YourClass { }

When choosing a vendor namespace, try to pick something that is not too generic to avoid conflicts with other libraries.

Loading history...
4
5
	public function __construct() {
6
		parent::__construct();
7
	}
8
9
	public function __destruct() {
10
		parent::__destruct();
11
	}
12
13
	///////////
14
	// Tester
15
	///////////
16
	
17 View Code Duplication
	function testTotalPokemon() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
Comprehensibility Best Practice introduced by
It is recommend to declare an explicit visibility for testTotalPokemon.

Generally, we recommend to declare visibility for all methods in your source code. This has the advantage of clearly communication to other developers, and also yourself, how this method should be consumed.

If you are not sure which visibility to choose, it is a good idea to start with the most restrictive visibility, and then raise visibility as needed, i.e. start with private, and only raise it to protected if a sub-class needs to have access, or public if an external class needs access.

Loading history...
18
		$req = "SELECT COUNT(*) as total FROM pokemon";
19
		$result = $this->mysqli->query($req);
20
		if (!is_object($result)) {
21
			return 1;
22
		} else {
23
			$data = $result->fetch_object();
24
			$total = $data->total;
25
	
26
			if ($total == 0) {
27
				return 2;
28
			}
29
		}
30
		return 0;
31
	}
32
	
33 View Code Duplication
	function testTotalGyms() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
Comprehensibility Best Practice introduced by
It is recommend to declare an explicit visibility for testTotalGyms.

Generally, we recommend to declare visibility for all methods in your source code. This has the advantage of clearly communication to other developers, and also yourself, how this method should be consumed.

If you are not sure which visibility to choose, it is a good idea to start with the most restrictive visibility, and then raise visibility as needed, i.e. start with private, and only raise it to protected if a sub-class needs to have access, or public if an external class needs access.

Loading history...
34
		$req = "SELECT COUNT(*) as total FROM gym";
35
		$result = $this->mysqli->query($req);
36
		if (!is_object($result)) {
37
			return 1;
38
		} else {
39
			$data = $result->fetch_object();
40
			$total = $data->total;
41
	
42
			if ($total == 0) {
43
				return 2;
44
			}
45
		}
46
		return 0;
47
	}
48
	
49 View Code Duplication
	function testTotalPokestops() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
Comprehensibility Best Practice introduced by
It is recommend to declare an explicit visibility for testTotalPokestops.

Generally, we recommend to declare visibility for all methods in your source code. This has the advantage of clearly communication to other developers, and also yourself, how this method should be consumed.

If you are not sure which visibility to choose, it is a good idea to start with the most restrictive visibility, and then raise visibility as needed, i.e. start with private, and only raise it to protected if a sub-class needs to have access, or public if an external class needs access.

Loading history...
50
		$req = "SELECT COUNT(*) as total FROM pokestop";
51
		$result = $this->mysqli->query($req);
52
		if (!is_object($result)) {
53
			return 1;
54
		} else {
55
			$data = $result->fetch_object();
56
			$total = $data->total;
57
	
58
			if ($total == 0) {
59
				return 2;
60
			}
61
		}
62
		return 0;
63
	}
64
	
65
	
66
	/////////////
67
	// Homepage
68
	/////////////
69
	
70
	function getTotalPokemon() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Comprehensibility Best Practice introduced by
It is recommend to declare an explicit visibility for getTotalPokemon.

Generally, we recommend to declare visibility for all methods in your source code. This has the advantage of clearly communication to other developers, and also yourself, how this method should be consumed.

If you are not sure which visibility to choose, it is a good idea to start with the most restrictive visibility, and then raise visibility as needed, i.e. start with private, and only raise it to protected if a sub-class needs to have access, or public if an external class needs access.

Loading history...
71
		$req = "SELECT COUNT(*) AS total FROM pokemon WHERE disappear_time >= UTC_TIMESTAMP()";
72
		$result = $this->mysqli->query($req);
73
		$data = $result->fetch_object();
74
		return $data;
75
	}
76
	
77
	function getTotalLures() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Comprehensibility Best Practice introduced by
It is recommend to declare an explicit visibility for getTotalLures.

Generally, we recommend to declare visibility for all methods in your source code. This has the advantage of clearly communication to other developers, and also yourself, how this method should be consumed.

If you are not sure which visibility to choose, it is a good idea to start with the most restrictive visibility, and then raise visibility as needed, i.e. start with private, and only raise it to protected if a sub-class needs to have access, or public if an external class needs access.

Loading history...
78
		$req = "SELECT COUNT(*) AS total FROM pokestop WHERE lure_expiration >= UTC_TIMESTAMP()";
79
		$result = $this->mysqli->query($req);
80
		$data = $result->fetch_object();
81
		return $data;
82
	}
83
	
84
	function getTotalGyms() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Comprehensibility Best Practice introduced by
It is recommend to declare an explicit visibility for getTotalGyms.

Generally, we recommend to declare visibility for all methods in your source code. This has the advantage of clearly communication to other developers, and also yourself, how this method should be consumed.

If you are not sure which visibility to choose, it is a good idea to start with the most restrictive visibility, and then raise visibility as needed, i.e. start with private, and only raise it to protected if a sub-class needs to have access, or public if an external class needs access.

Loading history...
85
		$req = "SELECT COUNT(DISTINCT(gym_id)) AS total FROM gym";
86
		$result = $this->mysqli->query($req);
87
		$data = $result->fetch_object();
88
		return $data;
89
	}
90
	
91
	function getTotalRaids() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Comprehensibility Best Practice introduced by
It is recommend to declare an explicit visibility for getTotalRaids.

Generally, we recommend to declare visibility for all methods in your source code. This has the advantage of clearly communication to other developers, and also yourself, how this method should be consumed.

If you are not sure which visibility to choose, it is a good idea to start with the most restrictive visibility, and then raise visibility as needed, i.e. start with private, and only raise it to protected if a sub-class needs to have access, or public if an external class needs access.

Loading history...
92
		$req = "SELECT COUNT(*) AS total FROM raid WHERE start <= UTC_TIMESTAMP AND  end >= UTC_TIMESTAMP()";
93
		$result = $this->mysqli->query($req);
94
		$data = $result->fetch_object();
95
		return $data;
96
	}
97
	
98
	function getTotalGymsForTeam($team_id) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Comprehensibility Best Practice introduced by
It is recommend to declare an explicit visibility for getTotalGymsForTeam.

Generally, we recommend to declare visibility for all methods in your source code. This has the advantage of clearly communication to other developers, and also yourself, how this method should be consumed.

If you are not sure which visibility to choose, it is a good idea to start with the most restrictive visibility, and then raise visibility as needed, i.e. start with private, and only raise it to protected if a sub-class needs to have access, or public if an external class needs access.

Loading history...
99
		$req = "SELECT COUNT(DISTINCT(gym_id)) AS total FROM gym WHERE team_id = '".$team_id."'";
100
		$result = $this->mysqli->query($req);
101
		$data = $result->fetch_object();
102
		return $data;
103
	}
104
	
105
	function getRecentAll() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Comprehensibility Best Practice introduced by
It is recommend to declare an explicit visibility for getRecentAll.

Generally, we recommend to declare visibility for all methods in your source code. This has the advantage of clearly communication to other developers, and also yourself, how this method should be consumed.

If you are not sure which visibility to choose, it is a good idea to start with the most restrictive visibility, and then raise visibility as needed, i.e. start with private, and only raise it to protected if a sub-class needs to have access, or public if an external class needs access.

Loading history...
106
		$req = "SELECT DISTINCT pokemon_id, encounter_id, disappear_time, last_modified, (CONVERT_TZ(disappear_time, '+00:00', '".self::$time_offset."')) AS disappear_time_real,
107
					latitude, longitude, cp, individual_attack, individual_defense, individual_stamina
108
					FROM pokemon
109
					ORDER BY last_modified DESC
110
					LIMIT 0,12";
111
		$result = $this->mysqli->query($req);
112
		$data = array();
113
		if ($result->num_rows > 0) {
114
			while ($row = $result->fetch_object()) {
115
				$data[] = $row;
116
			}
117
		}
118
		return $data;
119
	}
120
	
121
	function getRecentMythic($mythic_pokemons) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Comprehensibility Best Practice introduced by
It is recommend to declare an explicit visibility for getRecentMythic.

Generally, we recommend to declare visibility for all methods in your source code. This has the advantage of clearly communication to other developers, and also yourself, how this method should be consumed.

If you are not sure which visibility to choose, it is a good idea to start with the most restrictive visibility, and then raise visibility as needed, i.e. start with private, and only raise it to protected if a sub-class needs to have access, or public if an external class needs access.

Loading history...
122
		$req = "SELECT DISTINCT pokemon_id, encounter_id, disappear_time, last_modified, (CONVERT_TZ(disappear_time, '+00:00', '".self::$time_offset."')) AS disappear_time_real,
123
					latitude, longitude, cp, individual_attack, individual_defense, individual_stamina
124
					FROM pokemon
125
					WHERE pokemon_id IN (".implode(",", $mythic_pokemons).")
126
					ORDER BY last_modified DESC
127
					LIMIT 0,12";
128
		$result = $this->mysqli->query($req);
129
		$data = array();
130
		if ($result->num_rows > 0) {
131
			while ($row = $result->fetch_object()) {
132
				$data[] = $row;
133
			}
134
		}
135
		return $data;
136
	}
137
	
138
	///////////////////
139
	// Single Pokemon
140
	///////////////////
141
	
142 View Code Duplication
	function getGymsProtectedByPokemon($pokemon_id) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
Comprehensibility Best Practice introduced by
It is recommend to declare an explicit visibility for getGymsProtectedByPokemon.

Generally, we recommend to declare visibility for all methods in your source code. This has the advantage of clearly communication to other developers, and also yourself, how this method should be consumed.

If you are not sure which visibility to choose, it is a good idea to start with the most restrictive visibility, and then raise visibility as needed, i.e. start with private, and only raise it to protected if a sub-class needs to have access, or public if an external class needs access.

Loading history...
143
		$req = "SELECT COUNT(DISTINCT(gym_id)) AS total FROM gym WHERE guard_pokemon_id = '".$pokemon_id."'";
144
		$result = $this->mysqli->query($req);
145
		$data = $result->fetch_object();
146
		return $data;
147
	}
148
	
149 View Code Duplication
	function getPokemonLastSeen($pokemon_id) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
Comprehensibility Best Practice introduced by
It is recommend to declare an explicit visibility for getPokemonLastSeen.

Generally, we recommend to declare visibility for all methods in your source code. This has the advantage of clearly communication to other developers, and also yourself, how this method should be consumed.

If you are not sure which visibility to choose, it is a good idea to start with the most restrictive visibility, and then raise visibility as needed, i.e. start with private, and only raise it to protected if a sub-class needs to have access, or public if an external class needs access.

Loading history...
150
		$req = "SELECT disappear_time, (CONVERT_TZ(disappear_time, '+00:00', '".self::$time_offset."')) AS disappear_time_real, latitude, longitude
151
							FROM pokemon
152
							WHERE pokemon_id = '".$pokemon_id."'
153
							ORDER BY disappear_time DESC
154
							LIMIT 0,1";
155
		$result = $this->mysqli->query($req);
156
		$data = $result->fetch_object();
157
		return $data;
158
	}
159
160 View Code Duplication
	function getTop50Pokemon($pokemon_id, $top_order_by, $top_direction) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
Comprehensibility Best Practice introduced by
It is recommend to declare an explicit visibility for getTop50Pokemon.

Generally, we recommend to declare visibility for all methods in your source code. This has the advantage of clearly communication to other developers, and also yourself, how this method should be consumed.

If you are not sure which visibility to choose, it is a good idea to start with the most restrictive visibility, and then raise visibility as needed, i.e. start with private, and only raise it to protected if a sub-class needs to have access, or public if an external class needs access.

Loading history...
161
		$req = "SELECT (CONVERT_TZ(disappear_time, '+00:00', '".self::$time_offset."')) AS distime, pokemon_id, disappear_time, latitude, longitude,
162
							cp, individual_attack, individual_defense, individual_stamina,
163
							ROUND(100*(individual_attack+individual_defense+individual_stamina)/45,1) AS IV, move_1, move_2, form
164
							FROM pokemon
165
							WHERE pokemon_id = '".$pokemon_id."' AND move_1 IS NOT NULL AND move_1 <> '0'
166
							GROUP BY encounter_id
167
							ORDER BY $top_order_by $top_direction, disappear_time DESC
168
							LIMIT 0,50";
169
170
		$result = $this->mysqli->query($req);
171
		$top = array();
172
		while ($data = $result->fetch_object()) {
173
			$top[] = $data;
174
		}
175
		return $top;
176
	}
177
178 View Code Duplication
	function getTop50Trainers($pokemon_id, $best_order_by, $best_direction) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
Comprehensibility Best Practice introduced by
It is recommend to declare an explicit visibility for getTop50Trainers.

Generally, we recommend to declare visibility for all methods in your source code. This has the advantage of clearly communication to other developers, and also yourself, how this method should be consumed.

If you are not sure which visibility to choose, it is a good idea to start with the most restrictive visibility, and then raise visibility as needed, i.e. start with private, and only raise it to protected if a sub-class needs to have access, or public if an external class needs access.

Loading history...
179
		$trainer_blacklist = "";
180
		if (!empty(self::$config->system->trainer_blacklist)) {
181
			$trainer_blacklist = " AND trainer_name NOT IN ('".implode("','", self::$config->system->trainer_blacklist)."')";
182
		}
183
184
		$req = "SELECT trainer_name, ROUND(SUM(100*(iv_attack+iv_defense+iv_stamina)/45),1) AS IV, move_1, move_2, cp,
185
						DATE_FORMAT(last_seen, '%Y-%m-%d') AS lasttime, last_seen
186
						FROM gympokemon
187
						WHERE pokemon_id = '".$pokemon_id."'".$trainer_blacklist."
188
						GROUP BY pokemon_uid
189
						ORDER BY $best_order_by $best_direction, trainer_name ASC
190
						LIMIT 0,50";
191
192
		$result = $this->mysqli->query($req);
193
		$toptrainer = array();
194
		while ($data = $result->fetch_object()) {
195
			$toptrainer[] = $data;
196
		}
197
		return $toptrainer;
198
	}
199
200 View Code Duplication
	public function getPokemonHeatmap($pokemon_id, $start, $end) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
201
		$where = " WHERE pokemon_id = ".$pokemon_id." "
202
			. "AND disappear_time BETWEEN '".$start."' AND '".$end."'";
203
		$req 		= "SELECT latitude, longitude FROM pokemon".$where." ORDER BY disappear_time DESC LIMIT 10000";
204
		$result = $this->mysqli->query($req);
205
		$points = array();
206
		while ($data = $result->fetch_object()) {
207
			$points[] = $data;
208
		}
209
		return $points;
210
	}
211
212 View Code Duplication
	public function getPokemonGraph($pokemon_id) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
213
		$req = "SELECT COUNT(*) AS total,
214
					HOUR(CONVERT_TZ(disappear_time, '+00:00', '".self::$time_offset."')) AS disappear_hour
215
					FROM (SELECT disappear_time FROM pokemon WHERE pokemon_id = '".$pokemon_id."' ORDER BY disappear_time LIMIT 100000) AS pokemonFiltered
216
					GROUP BY disappear_hour
217
					ORDER BY disappear_hour";
218
		$result = $this->mysqli->query($req);
219
		$array = array_fill(0, 24, 0);
220
		while ($result && $data = $result->fetch_object()) {
221
			$array[$data->disappear_hour] = $data->total;
222
		}
223
		// shift array because AM/PM starts at 1AM not 0:00
224
		$array[] = $array[0];
225
		array_shift($array);
226
		return $array;
227
	}
228
229 View Code Duplication
	public function getPokemonLive($pokemon_id, $ivMin, $ivMax, $inmap_pokemons) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
Coding Style introduced by
getPokemonLive uses the super-global variable $_POST which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
230
		$inmap_pkms_filter = "";
231
		$where = " WHERE disappear_time >= UTC_TIMESTAMP() AND pokemon_id = ".$pokemon_id;
232
233
		$reqTestIv = "SELECT MAX(individual_attack) AS iv FROM pokemon ".$where;
234
		$resultTestIv = $this->mysqli->query($reqTestIv);
235
		$testIv = $resultTestIv->fetch_object();
236
		if (!is_null($inmap_pokemons) && ($inmap_pokemons != "")) {
237
			foreach ($_POST['inmap_pokemons'] as $inmap) {
238
				$inmap_pkms_filter .= "'".$inmap."',";
239
			}
240
			$inmap_pkms_filter = rtrim($inmap_pkms_filter, ",");
241
			$where .= " AND encounter_id NOT IN (".$inmap_pkms_filter.") ";
242
		}
243
		if ($testIv->iv != null && !is_null($ivMin) && ($ivMin != "")) {
244
			$where .= " AND ((100/45)*(individual_attack+individual_defense+individual_stamina)) >= (".$ivMin.") ";
245
		}
246
		if ($testIv->iv != null && !is_null($ivMax) && ($ivMax != "")) {
247
			$where .= " AND ((100/45)*(individual_attack+individual_defense+individual_stamina)) <= (".$ivMax.") ";
248
		}
249
		$req = "SELECT pokemon_id, encounter_id, latitude, longitude, disappear_time,
250
						(CONVERT_TZ(disappear_time, '+00:00', '".self::$time_offset."')) AS disappear_time_real,
251
						individual_attack, individual_defense, individual_stamina, move_1, move_2
252
						FROM pokemon ".$where."
253
						ORDER BY disappear_time DESC
254
						LIMIT 5000";
255
		$result = $this->mysqli->query($req);
256
		$spawns = array();
257
		while ($data = $result->fetch_object()) {
258
			$spawns[] = $data;
259
		}
260
		return $spawns;
261
	}
262
263
	public function getPokemonSliederMinMax() {
264
		$req = "SELECT MIN(disappear_time) AS min, MAX(disappear_time) AS max FROM pokemon";
265
		$result = $this->mysqli->query($req);
266
		$data = $result->fetch_object();
267
		return $data;
268
	}
269
270
	public function getMapsCoords() {
271
		$req = "SELECT MAX(latitude) AS max_latitude, MIN(latitude) AS min_latitude, MAX(longitude) AS max_longitude, MIN(longitude) as min_longitude FROM spawnpoint";
272
		$result = $this->mysqli->query($req);
273
		$data = $result->fetch_object();
274
		return $data;
275
	}
276
277
278
	///////////////
279
	// Pokestops
280
	//////////////
281
282
	function getTotalPokestops() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Comprehensibility Best Practice introduced by
It is recommend to declare an explicit visibility for getTotalPokestops.

Generally, we recommend to declare visibility for all methods in your source code. This has the advantage of clearly communication to other developers, and also yourself, how this method should be consumed.

If you are not sure which visibility to choose, it is a good idea to start with the most restrictive visibility, and then raise visibility as needed, i.e. start with private, and only raise it to protected if a sub-class needs to have access, or public if an external class needs access.

Loading history...
283
		$req = "SELECT COUNT(*) as total FROM pokestop";
284
		$result = $this->mysqli->query($req);
285
		$data = $result->fetch_object();
286
		return $data;
287
	}
288
289
	public function getAllPokestops() {
290
		$req = "SELECT latitude, longitude, lure_expiration, UTC_TIMESTAMP() AS now, (CONVERT_TZ(lure_expiration, '+00:00', '".self::$time_offset."')) AS lure_expiration_real FROM pokestop";
291
		$result = $this->mysqli->query($req);
292
		$pokestops = array();
293
		while ($data = $result->fetch_object()) {
294
			$pokestops[] = $data;
295
		}
296
		return $pokestops;
297
	}
298
299
300
	/////////
301
	// Gyms
302
	/////////
303
304
	function getTeamGuardians($team_id) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Comprehensibility Best Practice introduced by
It is recommend to declare an explicit visibility for getTeamGuardians.

Generally, we recommend to declare visibility for all methods in your source code. This has the advantage of clearly communication to other developers, and also yourself, how this method should be consumed.

If you are not sure which visibility to choose, it is a good idea to start with the most restrictive visibility, and then raise visibility as needed, i.e. start with private, and only raise it to protected if a sub-class needs to have access, or public if an external class needs access.

Loading history...
305
		$req = "SELECT COUNT(*) AS total, guard_pokemon_id FROM gym WHERE team_id = '".$team_id ."' GROUP BY guard_pokemon_id ORDER BY total DESC LIMIT 0,3";
306
		$result = $this->mysqli->query($req);
307
		$datas = array();
308
		while ($data = $result->fetch_object()) {
309
			$datas[] = $data;
310
		}
311
		return $datas;
312
	}
313
314
	function getOwnedAndPoints($team_id) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Comprehensibility Best Practice introduced by
It is recommend to declare an explicit visibility for getOwnedAndPoints.

Generally, we recommend to declare visibility for all methods in your source code. This has the advantage of clearly communication to other developers, and also yourself, how this method should be consumed.

If you are not sure which visibility to choose, it is a good idea to start with the most restrictive visibility, and then raise visibility as needed, i.e. start with private, and only raise it to protected if a sub-class needs to have access, or public if an external class needs access.

Loading history...
315
		$req 	= "SELECT COUNT(DISTINCT(gym_id)) AS total, ROUND(AVG(total_cp),0) AS average_points FROM gym WHERE team_id = '".$team_id."'";
316
		$result = $this->mysqli->query($req);
317
		$data = $result->fetch_object();
318
		return $data;
319
	}
320
321
	function getAllGyms() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Comprehensibility Best Practice introduced by
It is recommend to declare an explicit visibility for getAllGyms.

Generally, we recommend to declare visibility for all methods in your source code. This has the advantage of clearly communication to other developers, and also yourself, how this method should be consumed.

If you are not sure which visibility to choose, it is a good idea to start with the most restrictive visibility, and then raise visibility as needed, i.e. start with private, and only raise it to protected if a sub-class needs to have access, or public if an external class needs access.

Loading history...
322
		$req = "SELECT gym_id, team_id, latitude, longitude, (CONVERT_TZ(last_scanned, '+00:00', '".self::$time_offset."')) AS last_scanned, (6 - slots_available) AS level FROM gym";
323
		$result = $this->mysqli->query($req);
324
		$gyms = array();
325
		while ($data = $result->fetch_object()) {
326
			$gyms[] = $data;
327
		}
328
		return $gyms;
329
	}
330
331 View Code Duplication
	public function getGymData($gym_id) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
332
		$req = "SELECT gymdetails.name AS name, gymdetails.description AS description, gymdetails.url AS url, gym.team_id AS team,
333
					(CONVERT_TZ(gym.last_scanned, '+00:00', '".self::$time_offset."')) AS last_scanned, gym.guard_pokemon_id AS guard_pokemon_id, gym.total_cp AS total_cp, (6 - gym.slots_available) AS level
334
					FROM gymdetails
335
					LEFT JOIN gym ON gym.gym_id = gymdetails.gym_id
336
					WHERE gym.gym_id='".$gym_id."'";
337
		$result = $this->mysqli->query($req);
338
		$data = $result->fetch_object();
339
		return $data;
340
	}
341
342
	public function getGymDefenders($gym_id) {
343
		$req = "SELECT DISTINCT gympokemon.pokemon_uid, pokemon_id, iv_attack, iv_defense, iv_stamina, MAX(cp) AS cp, gymmember.gym_id
344
					FROM gympokemon INNER JOIN gymmember ON gympokemon.pokemon_uid=gymmember.pokemon_uid
345
					GROUP BY gympokemon.pokemon_uid, pokemon_id, iv_attack, iv_defense, iv_stamina, gym_id
346
					HAVING gymmember.gym_id='".$gym_id."'
347
					ORDER BY cp DESC";
348
		$result = $this->mysqli->query($req);
349
		$defenders = array();
350
		while ($data = $result->fetch_object()) {
351
			$defenders[] = $data;
352
		}
353
		return $defenders;
354
	}
355
356
357
	///////////
358
	// Raids
359
	///////////
360
361
	public function getAllRaids($page) {
362
		$limit = " LIMIT ".($page * 10).",10";
363
		$req = "SELECT raid.gym_id, raid.level, raid.pokemon_id, raid.cp, raid.move_1, raid.move_2, CONVERT_TZ(raid.spawn, '+00:00', '".self::$time_offset."') AS spawn, CONVERT_TZ(raid.start, '+00:00', '".self::$time_offset."') AS start, CONVERT_TZ(raid.end, '+00:00', '".self::$time_offset."') AS end, CONVERT_TZ(raid.last_scanned, '+00:00', '".self::$time_offset."') AS last_scanned, gymdetails.name, gym.latitude, gym.longitude FROM raid
364
					JOIN gymdetails ON gymdetails.gym_id = raid.gym_id
365
					JOIN gym ON gym.gym_id = raid.gym_id
366
					WHERE raid.end > UTC_TIMESTAMP()
367
					ORDER BY raid.level DESC, raid.start".$limit;
368
		$result = $this->mysqli->query($req);
369
		$raids = array();
370
		while ($data = $result->fetch_object()) {
371
			$raids[] = $data;
372
		}
373
		return $raids;
374
	}
375
376
377
	//////////////
378
	// Trainers
379
	//////////////
380
381
	public function getTrainers($trainer_name, $team, $page, $ranking) {
382
		$trainers = $this->getTrainerData($trainer_name, $team, $page, $ranking);
383
		foreach ($trainers as $trainer) {
0 ignored issues
show
Coding Style introduced by
Blank line found at start of control structure
Loading history...
384
385
			$trainer->rank = $this->getTrainerLevelRating($trainer->level)->rank;
386
387
			$active_gyms = 0;
388
			$pkmCount = 0;
389
390
			$trainer->pokemons = array();
391
			$active_pokemon = $this->getTrainerActivePokemon($trainer->name);
392
			foreach ($active_pokemon as $pokemon) {
393
				$active_gyms++;
394
				$trainer->pokemons[$pkmCount++] = $pokemon;
395
			}
396
397
			$inactive_pokemon = $this->getTrainerInactivePokemon($trainer->name);
398
			foreach ($inactive_pokemon as $pokemon) {
399
				$trainer->pokemons[$pkmCount++] = $pokemon;
400
			}
401
			$trainer->gyms = "".$active_gyms;
402
		}
403
		return $trainers;
404
	}
405
406
	public function getTrainerLevelCount($team_id) {
407
		$req = "SELECT level, count(level) AS count FROM trainer WHERE team = '".$team_id."'";
408
		if (!empty(self::$config->system->trainer_blacklist)) {
409
			$req .= " AND name NOT IN ('".implode("','", self::$config->system->trainer_blacklist)."')";
410
		}
411
		$req .= " GROUP BY level";
412
		$result = $this->mysqli->query($req);
413
		$levelData = array();
414
		while ($data = $result->fetch_object()) {
415
			$levelData[$data['level']] = $data['count'];
416
		}
417
		for ($i = 5; $i <= 40; $i++) {
418
			if (!isset($levelData[$i])) {
419
				$levelData[$i] = 0;
420
			}
421
		}
422
		# sort array again
423
		ksort($levelData);
424
		return $levelData;
425
	}
426
427
	private function getTrainerData($trainer_name, $team, $page, $ranking) {
428
		$where = "";
429
430
		if (!empty(self::$config->system->trainer_blacklist)) {
431
			$where .= ($where == "" ? " HAVING" : " AND")." name NOT IN ('".implode("','", self::$config->system->trainer_blacklist)."')";
432
		}
433
		if ($trainer_name != "") {
434
			$where = " HAVING name LIKE '%".$trainer_name."%'";
435
		}
436
		if ($team != 0) {
437
			$where .= ($where == "" ? " HAVING" : " AND")." team = ".$team;
438
		}
439
		switch ($ranking) {
440
			case 1:
441
				$order = " ORDER BY active DESC, level DESC";
442
				break;
443
			case 2:
444
				$order = " ORDER BY maxCp DESC, level DESC";
445
				break;
446
			default:
447
				$order = " ORDER BY level DESC, active DESC";
448
		}
449
		$order .= ", last_seen DESC, name ";
450
		$limit = " LIMIT ".($page * 10).",10 ";
451
		$req = "SELECT trainer.*, COUNT(actives_pokemons.trainer_name) AS active, max(actives_pokemons.cp) AS maxCp
452
				FROM trainer
453
				LEFT JOIN (SELECT DISTINCT gympokemon.pokemon_id, gympokemon.pokemon_uid, gympokemon.trainer_name, gympokemon.cp, DATEDIFF(UTC_TIMESTAMP(), gympokemon.last_seen) AS last_scanned
454
				FROM gympokemon
455
				INNER JOIN (SELECT gymmember.pokemon_uid, gymmember.gym_id FROM gymmember GROUP BY gymmember.pokemon_uid, gymmember.gym_id HAVING gymmember.gym_id <> '') AS filtered_gymmember
456
				ON gympokemon.pokemon_uid = filtered_gymmember.pokemon_uid) AS actives_pokemons ON actives_pokemons.trainer_name = trainer.name
457
				GROUP BY trainer.name " . $where . $order . $limit;
458
459
		$result = $this->mysqli->query($req);
460
		$trainers = array();
461
		while ($data = $result->fetch_object()) {
462
			$data->last_seen = date("Y-m-d", strtotime($data->last_seen));
463
			$trainers[$data->name] = $data;
464
		}
465
		return $trainers;
466
	}
467
468
	private function getTrainerLevelRating($level) {
469
		$req = "SELECT COUNT(1) AS rank FROM trainer WHERE level = ".$level;
470
		if (!empty(self::$config->system->trainer_blacklist)) {
471
			$req .= " AND name NOT IN ('".implode("','", self::$config->system->trainer_blacklist)."')";
472
		}
473
		$result = $this->mysqli->query($req);
474
		$data = $result->fetch_object();
475
		return $data;
476
	}
477
478 View Code Duplication
	private function getTrainerActivePokemon($trainer_name){
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
479
		$req = "(SELECT DISTINCT gympokemon.pokemon_id, gympokemon.pokemon_uid, gympokemon.cp, DATEDIFF(UTC_TIMESTAMP(), gympokemon.last_seen) AS last_scanned, gympokemon.trainer_name, gympokemon.iv_defense, gympokemon.iv_stamina, gympokemon.iv_attack, filtered_gymmember.gym_id, CONVERT_TZ(filtered_gymmember.deployment_time, '+00:00', '".self::$time_offset."') as deployment_time, '1' AS active
480
					FROM gympokemon INNER JOIN
481
					(SELECT gymmember.pokemon_uid, gymmember.gym_id, gymmember.deployment_time FROM gymmember GROUP BY gymmember.pokemon_uid, gymmember.deployment_time, gymmember.gym_id HAVING gymmember.gym_id <> '') AS filtered_gymmember
482
					ON gympokemon.pokemon_uid = filtered_gymmember.pokemon_uid
483
					WHERE gympokemon.trainer_name='".$trainer_name."'
484
					ORDER BY gympokemon.cp DESC)";
485
		$result = $this->mysqli->query($req);
486
		$pokemons = array();
487
		while ($data = $result->fetch_object()) {
488
			$pokemons[] = $data;
489
		}
490
		return $pokemons;
491
	}
492
493 View Code Duplication
	private function getTrainerInactivePokemon($trainer_name){
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
494
		$req = "(SELECT DISTINCT gympokemon.pokemon_id, gympokemon.pokemon_uid, gympokemon.cp, DATEDIFF(UTC_TIMESTAMP(), gympokemon.last_seen) AS last_scanned, gympokemon.trainer_name, gympokemon.iv_defense, gympokemon.iv_stamina, gympokemon.iv_attack, null AS gym_id, CONVERT_TZ(filtered_gymmember.deployment_time, '+00:00', '".self::$time_offset."') as deployment_time, '0' AS active
495
					FROM gympokemon LEFT JOIN
496
					(SELECT * FROM gymmember HAVING gymmember.gym_id <> '') AS filtered_gymmember
497
					ON gympokemon.pokemon_uid = filtered_gymmember.pokemon_uid
498
					WHERE filtered_gymmember.pokemon_uid IS NULL AND gympokemon.trainer_name='".$trainer_name."'
499
					ORDER BY gympokemon.cp DESC)";
500
		$result = $this->mysqli->query($req);
501
		$pokemons = array();
502
		while ($data = $result->fetch_object()) {
503
			$pokemons[] = $data;
504
		}
505
		return $pokemons;
506
	}
507
508
509
	/////////
510
	// Cron
511
	/////////
512
513
	public function getPokemonCountsActive() {
514
		$req = "SELECT pokemon_id, COUNT(*) as total FROM pokemon WHERE disappear_time >= UTC_TIMESTAMP() GROUP BY pokemon_id";
515
		$result = $this->mysqli->query($req);
516
		$counts = array();
517
		while ($data = $result->fetch_object()) {
518
			$counts[$data->pokemon_id] = $data->total;
519
		}
520
		return $counts;
521
	}
522
523
	public function getPoekmonCountsLastDay() {
524
		$req = "SELECT pokemon_id, COUNT(*) AS spawns_last_day
525
					FROM pokemon
526
					WHERE disappear_time >= (SELECT MAX(disappear_time) FROM pokemon) - INTERVAL 1 DAY
527
					GROUP BY pokemon_id
528
				  	ORDER BY pokemon_id ASC";
529
		$result = $this->mysqli->query($req);
530
		$counts = array();
531
		while ($data = $result->fetch_object()) {
532
			$counts[$data->pokemon_id] = $data->spawns_last_day;
533
		}
534
		return $counts;
535
	}
536
537 View Code Duplication
	public function getPokemonSinceLastUpdate($pokemon_id, $last_update) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
538
		$where = "WHERE p.pokemon_id = '".$pokemon_id."' AND (UNIX_TIMESTAMP(p.disappear_time) - (LENGTH(s.kind) - LENGTH( REPLACE ( kind, \"s\", \"\") )) * 900) > '".$last_update."'";
539
		$req = "SELECT count, (UNIX_TIMESTAMP(p.disappear_time) - (LENGTH(s.kind) - LENGTH( REPLACE ( kind, \"s\", \"\") )) * 900) as last_timestamp, (CONVERT_TZ(p.disappear_time, '+00:00', '".self::$time_offset."')) AS disappear_time_real, p.latitude, p.longitude 
540
				FROM pokemon p
541
				JOIN spawnpoint s ON p.spawnpoint_id = s.id
542
				JOIN (SELECT count(*) as count
543
                    FROM pokemon p
544
                    JOIN spawnpoint s ON p.spawnpoint_id = s.id
545
                    " . $where."
546
                ) x
547
				" . $where . "
548
				ORDER BY last_timestamp DESC
549
                LIMIT 0,1";
550
		$result = $this->mysqli->query($req);
551
		$data = $result->fetch_object();
552
		return $data;
553
	}
554
555 View Code Duplication
	public function getRaidsSinceLastUpdate($pokemon_id, $last_update) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
556
		$where = "WHERE pokemon_id = '".$pokemon_id."' AND UNIX_TIMESTAMP(start) > '".$last_update."'";
557
		$req = "SELECT UNIX_TIMESTAMP(start) as start_timestamp, end, (CONVERT_TZ(end, '+00:00', '".self::$time_offset."')) AS end_time_real, latitude, longitude, count
558
                FROM raid r
559
                JOIN gym g
560
                JOIN (SELECT count(*) as count
561
                    FROM raid
562
                    " . $where."
563
                ) x
564
                ON r.gym_id = g.gym_id
565
                " . $where."
566
                ORDER BY start DESC
567
                LIMIT 0,1";
568
		$result = $this->mysqli->query($req);
569
		$data = $result->fetch_object();
570
		return $data;
571
	}
572
573
	public function getCaptchaCount() {
574
		$req = "SELECT SUM(accounts_captcha) AS total FROM mainworker";
575
		$result = $this->mysqli->query($req);
576
		$data = $result->fetch_object();
577
		return $data;
578
	}
579
580 View Code Duplication
	public function getNestData() {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
581
		$pokemon_exclude_sql = "";
582
		if (!empty(self::$config->system->nest_exclude_pokemon)) {
583
			$pokemon_exclude_sql = "AND p.pokemon_id NOT IN (".implode(",", self::$config->system->nest_exclude_pokemon).")";
584
		}
585
		$req = "SELECT p.pokemon_id, max(p.latitude) AS latitude, max(p.longitude) AS longitude, count(p.pokemon_id) AS total_pokemon, s.latest_seen, (LENGTH(s.kind) - LENGTH( REPLACE ( kind, \"s\", \"\") )) * 900 AS duration
586
			          FROM pokemon p 
587
			          INNER JOIN spawnpoint s ON (p.spawnpoint_id = s.id) 
588
			          WHERE p.disappear_time > UTC_TIMESTAMP() - INTERVAL 24 HOUR 
589
			          " . $pokemon_exclude_sql . " 
590
			          GROUP BY p.spawnpoint_id, p.pokemon_id 
591
			          HAVING COUNT(p.pokemon_id) >= 6 
592
			          ORDER BY p.pokemon_id";
593
		$result = $this->mysqli->query($req);
594
		$nests = array();
595
		while ($data = $result->fetch_object()) {
596
			$nests[] = $data;
597
		}
598
		return $nests;
599
	}
600
601
}