QueryManagerMysqlRocketmap   F
last analyzed

Complexity

Total Complexity 120

Size/Duplication

Total Lines 850
Duplicated Lines 53.76 %

Coupling/Cohesion

Components 1
Dependencies 1

Importance

Changes 0
Metric Value
dl 457
loc 850
rs 1.75
c 0
b 0
f 0
wmc 120
lcom 1
cbo 1

49 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A __destruct() 0 4 1
A testTotalPokemon() 15 17 3
A testTotalGyms() 15 17 3
A testTotalPokestops() 15 17 3
A getTotalPokemon() 0 8 1
A getTotalLures() 0 8 1
A getTotalGyms() 0 8 1
A getTotalRaids() 0 8 1
A getGymsProtectedByPokemon() 6 8 1
A getPokemonLastSeen() 10 14 1
A getTop50Pokemon() 19 19 2
A getTop50Trainers() 21 22 3
A getPokemonHeatmap() 14 14 2
A getPokemonGraph() 16 18 3
B getPokemonLive() 33 33 11
A getPokemonSliderMinMax() 0 8 1
A getMapsCoords() 0 10 1
A getTotalGymsForTeam() 8 8 1
A getRecentAll() 18 18 3
A getRecentMythic() 0 19 3
A getPokemonCount() 10 10 1
A getPokemonCountAll() 13 13 2
A getRaidCount() 10 10 1
A getRaidCountAll() 13 13 2
A getTotalPokestops() 0 8 1
A getAllPokestops() 0 13 2
A getTeamGuardians() 15 15 2
A getOwnedAndPoints() 11 11 1
A getAllGyms() 0 14 2
A getGymData() 10 15 1
A getGymDefenders() 16 16 2
B getGymHistories() 13 35 9
A getGymHistoriesPokemon() 16 16 2
B getHistoryForGym() 5 38 7
A getHistoryForGymPokemon() 0 14 2
A getAllRaids() 0 22 2
A getTrainers() 0 22 4
A getTrainerLevelCount() 22 22 5
B getTrainerData() 13 40 9
A getTrainerLevelRating() 0 11 2
A getTrainerActivePokemon() 21 21 2
A getTrainerInactivePokemon() 21 21 2
A getPokemonCountsActive() 14 14 2
A getTotalPokemonIV() 0 10 1
A getPokemonCountsLastDay() 15 15 2
A getCaptchaCount() 0 8 1
A getNestData() 21 23 3
A getSpawnpointCount() 8 10 1

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complex Class

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like QueryManagerMysqlRocketmap often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use QueryManagerMysqlRocketmap, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
namespace Worldopole;
4
5
final class QueryManagerMysqlRocketmap extends QueryManagerMysql
6
{
7
    public function __construct()
8
    {
9
        parent::__construct();
10
    }
11
12
    public function __destruct()
13
    {
14
        parent::__destruct();
15
    }
16
17
    ///////////
18
    // Tester
19
    ///////////
20
21 View Code Duplication
    public function testTotalPokemon()
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...
22
    {
23
        $req = 'SELECT COUNT(*) as total FROM pokemon';
24
        $result = $this->mysqli->query($req);
25
        if (!is_object($result)) {
26
            return 1;
27
        } else {
28
            $data = $result->fetch_object();
29
            $total = $data->total;
30
31
            if (0 == $total) {
32
                return 2;
33
            }
34
        }
35
36
        return 0;
37
    }
38
39 View Code Duplication
    public function testTotalGyms()
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...
40
    {
41
        $req = 'SELECT COUNT(*) as total FROM gym';
42
        $result = $this->mysqli->query($req);
43
        if (!is_object($result)) {
44
            return 1;
45
        } else {
46
            $data = $result->fetch_object();
47
            $total = $data->total;
48
49
            if (0 == $total) {
50
                return 2;
51
            }
52
        }
53
54
        return 0;
55
    }
56
57 View Code Duplication
    public function testTotalPokestops()
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...
58
    {
59
        $req = 'SELECT COUNT(*) as total FROM pokestop';
60
        $result = $this->mysqli->query($req);
61
        if (!is_object($result)) {
62
            return 1;
63
        } else {
64
            $data = $result->fetch_object();
65
            $total = $data->total;
66
67
            if (0 == $total) {
68
                return 2;
69
            }
70
        }
71
72
        return 0;
73
    }
74
75
    /////////////
76
    // Homepage
77
    /////////////
78
79
    public function getTotalPokemon()
80
    {
81
        $req = 'SELECT COUNT(*) AS total FROM pokemon WHERE disappear_time >= UTC_TIMESTAMP()';
82
        $result = $this->mysqli->query($req);
83
        $data = $result->fetch_object();
84
85
        return $data;
86
    }
87
88
    public function getTotalLures()
89
    {
90
        $req = 'SELECT COUNT(*) AS total FROM pokestop WHERE lure_expiration >= UTC_TIMESTAMP()';
91
        $result = $this->mysqli->query($req);
92
        $data = $result->fetch_object();
93
94
        return $data;
95
    }
96
97
    public function getTotalGyms()
98
    {
99
        $req = 'SELECT COUNT(DISTINCT(gym_id)) AS total FROM gym';
100
        $result = $this->mysqli->query($req);
101
        $data = $result->fetch_object();
102
103
        return $data;
104
    }
105
106
    public function getTotalRaids()
107
    {
108
        $req = 'SELECT COUNT(*) AS total FROM raid WHERE start <= UTC_TIMESTAMP() AND end >= UTC_TIMESTAMP()';
109
        $result = $this->mysqli->query($req);
110
        $data = $result->fetch_object();
111
112
        return $data;
113
    }
114
115 View Code Duplication
    public function getTotalGymsForTeam($team_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...
116
    {
117
        $req = "SELECT COUNT(DISTINCT(gym_id)) AS total FROM gym WHERE team_id = '".$team_id."'";
118
        $result = $this->mysqli->query($req);
119
        $data = $result->fetch_object();
120
121
        return $data;
122
    }
123
124 View Code Duplication
    public function getRecentAll()
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...
125
    {
126
        $req = "SELECT DISTINCT pokemon_id, encounter_id, disappear_time, last_modified,
127
				CONVERT_TZ(disappear_time, '+00:00', '".self::$time_offset."') AS disappear_time_real,
128
				latitude, longitude, cp, individual_attack, individual_defense, individual_stamina
129
				FROM pokemon
130
				ORDER BY last_modified DESC
131
				LIMIT 0,12";
132
        $result = $this->mysqli->query($req);
133
        $data = array();
134
        if ($result->num_rows > 0) {
135
            while ($row = $result->fetch_object()) {
136
                $data[] = $row;
137
            }
138
        }
139
140
        return $data;
141
    }
142
143
    public function getRecentMythic($mythic_pokemons)
144
    {
145
        $req = "SELECT DISTINCT pokemon_id, encounter_id, disappear_time, last_modified,
146
				CONVERT_TZ(disappear_time, '+00:00', '".self::$time_offset."') AS disappear_time_real,
147
				latitude, longitude, cp, individual_attack, individual_defense, individual_stamina
148
				FROM pokemon
149
				WHERE pokemon_id IN (".implode(',', $mythic_pokemons).')
150
				ORDER BY last_modified DESC
151
				LIMIT 0,12';
152
        $result = $this->mysqli->query($req);
153
        $data = array();
154
        if ($result->num_rows > 0) {
155
            while ($row = $result->fetch_object()) {
156
                $data[] = $row;
157
            }
158
        }
159
160
        return $data;
161
    }
162
163
    ///////////////////
164
    // Single Pokemon
165
    ///////////////////
166
167 View Code Duplication
    public function getGymsProtectedByPokemon($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...
168
    {
169
        $req = "SELECT COUNT(DISTINCT(gym_id)) AS total FROM gym WHERE guard_pokemon_id = '".$pokemon_id."'";
170
        $result = $this->mysqli->query($req);
171
        $data = $result->fetch_object();
172
173
        return $data;
174
    }
175
176 View Code Duplication
    public function getPokemonLastSeen($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...
177
    {
178
        $req = "SELECT disappear_time,
179
				CONVERT_TZ(disappear_time, '+00:00', '".self::$time_offset."') AS disappear_time_real,
180
				latitude, longitude
181
				FROM pokemon
182
				WHERE pokemon_id = '".$pokemon_id."'
183
				ORDER BY disappear_time DESC
184
				LIMIT 0,1";
185
        $result = $this->mysqli->query($req);
186
        $data = $result->fetch_object();
187
188
        return $data;
189
    }
190
191 View Code Duplication
    public function getTop50Pokemon($pokemon_id, $top_order_by, $top_direction)
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...
192
    {
193
        $req = "SELECT CONVERT_TZ(disappear_time, '+00:00', '".self::$time_offset."') AS distime,
194
				pokemon_id, disappear_time, latitude, longitude,
195
				cp, individual_attack, individual_defense, individual_stamina,
196
				ROUND(100*(individual_attack+individual_defense+individual_stamina)/45,1) AS IV,
197
				move_1, move_2, form
198
				FROM pokemon
199
				WHERE pokemon_id = '".$pokemon_id."' AND move_1 IS NOT NULL AND move_1 <> '0'
200
				ORDER BY $top_order_by $top_direction, disappear_time DESC
201
				LIMIT 0,50";
202
        $result = $this->mysqli->query($req);
203
        $top = array();
204
        while ($data = $result->fetch_object()) {
205
            $top[] = $data;
206
        }
207
208
        return $top;
209
    }
210
211 View Code Duplication
    public function getTop50Trainers($pokemon_id, $best_order_by, $best_direction)
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...
212
    {
213
        $trainer_blacklist = '';
214
        if (!empty(self::$config->system->trainer_blacklist)) {
215
            $trainer_blacklist = " AND trainer_name NOT IN ('".implode("','", self::$config->system->trainer_blacklist)."')";
216
        }
217
        $req = "SELECT trainer_name,
218
				ROUND((100*(iv_attack+iv_defense+iv_stamina)/45),1) AS IV,
219
				move_1, move_2, cp,
220
				DATE_FORMAT(last_seen, '%Y-%m-%d') AS lasttime, last_seen
221
				FROM gympokemon
222
				WHERE pokemon_id = '".$pokemon_id."'".$trainer_blacklist."
223
				ORDER BY $best_order_by $best_direction, trainer_name ASC
224
				LIMIT 0,50";
225
        $result = $this->mysqli->query($req);
226
        $toptrainer = array();
227
        while ($data = $result->fetch_object()) {
228
            $toptrainer[] = $data;
229
        }
230
231
        return $toptrainer;
232
    }
233
234 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...
235
    {
236
		$req = "SELECT latitude, longitude
237
				FROM pokemon
238
				WHERE pokemon_id = ".$pokemon_id." AND disappear_time BETWEEN '".$start."' AND '".$end."'
239
				LIMIT 10000";
240
        $result = $this->mysqli->query($req);
241
        $points = array();
242
        while ($data = $result->fetch_object()) {
243
            $points[] = $data;
244
        }
245
246
        return $points;
247
    }
248
249 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...
250
    {
251
        $req = "SELECT COUNT(*) AS total,
252
				HOUR(CONVERT_TZ(disappear_time, '+00:00', '".self::$time_offset."')) AS disappear_hour
253
				FROM (SELECT disappear_time FROM pokemon WHERE pokemon_id = '".$pokemon_id."' LIMIT 100000) AS pokemonFiltered
254
				GROUP BY disappear_hour
255
				ORDER BY disappear_hour";
256
        $result = $this->mysqli->query($req);
257
        $array = array_fill(0, 24, 0);
258
        while ($result && $data = $result->fetch_object()) {
259
            $array[$data->disappear_hour] = $data->total;
260
        }
261
        // shift array because AM/PM starts at 1AM not 0:00
262
        $array[] = $array[0];
263
        array_shift($array);
264
265
        return $array;
266
    }
267
268 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...
269
    {
270
        $inmap_pkms_filter = '';
271
        $where = ' WHERE disappear_time >= UTC_TIMESTAMP() AND pokemon_id = '.$pokemon_id;
272
        $reqTestIv = 'SELECT MAX(individual_attack) AS iv FROM pokemon '.$where;
273
        $resultTestIv = $this->mysqli->query($reqTestIv);
274
        $testIv = $resultTestIv->fetch_object();
275
        if (!is_null($inmap_pokemons) && ('' != $inmap_pokemons)) {
276
            foreach ($inmap_pokemons as $inmap) {
277
                $inmap_pkms_filter .= "'".$inmap."',";
278
            }
279
            $inmap_pkms_filter = rtrim($inmap_pkms_filter, ',');
280
            $where .= ' AND encounter_id NOT IN ('.$inmap_pkms_filter.') ';
281
        }
282
        if (null != $testIv->iv && !is_null($ivMin) && ('' != $ivMin)) {
283
            $where .= ' AND ((100/45)*(individual_attack+individual_defense+individual_stamina)) >= ('.$ivMin.') ';
284
        }
285
        if (null != $testIv->iv && !is_null($ivMax) && ('' != $ivMax)) {
286
            $where .= ' AND ((100/45)*(individual_attack+individual_defense+individual_stamina)) <= ('.$ivMax.') ';
287
        }
288
        $req = "SELECT pokemon_id, encounter_id, latitude, longitude, disappear_time,
289
				CONVERT_TZ(disappear_time, '+00:00', '".self::$time_offset."') AS disappear_time_real,
290
				individual_attack, individual_defense, individual_stamina, move_1, move_2
291
				FROM pokemon ".$where.'
292
				LIMIT 5000';
293
        $result = $this->mysqli->query($req);
294
        $spawns = array();
295
        while ($data = $result->fetch_object()) {
296
            $spawns[] = $data;
297
        }
298
299
        return $spawns;
300
    }
301
302
    public function getPokemonSliderMinMax()
303
    {
304
        $req = 'SELECT MIN(disappear_time) AS min, MAX(disappear_time) AS max FROM pokemon';
305
        $result = $this->mysqli->query($req);
306
        $data = $result->fetch_object();
307
308
        return $data;
309
    }
310
311
    public function getMapsCoords()
312
    {
313
        $req = 'SELECT MAX(latitude) AS max_latitude, MIN(latitude) AS min_latitude,
314
				MAX(longitude) AS max_longitude, MIN(longitude) as min_longitude
315
				FROM spawnpoint';
316
        $result = $this->mysqli->query($req);
317
        $data = $result->fetch_object();
318
319
        return $data;
320
    }
321
322 View Code Duplication
    public function getPokemonCount($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...
323
    {
324
        $req = 'SELECT count, last_seen, latitude, longitude
325
				FROM pokemon_stats
326
				WHERE pid = '.$pokemon_id;
327
        $result = $this->mysqli->query($req);
328
        $data = $result->fetch_object();
329
330
        return $data;
331
    }
332
333 View Code Duplication
    public function getPokemonCountAll()
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...
334
    {
335
        $req = 'SELECT pid as pokemon_id, count, last_seen, latitude, longitude
336
				FROM pokemon_stats
337
				GROUP BY pid';
338
        $result = $this->mysqli->query($req);
339
        $array = array();
340
        while ($data = $result->fetch_object()) {
341
            $array[] = $data;
342
        }
343
344
        return $array;
345
    }
346
347 View Code Duplication
    public function getRaidCount($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...
348
    {
349
        $req = 'SELECT count, last_seen, latitude, longitude
350
				FROM raid_stats
351
				WHERE pid = '.$pokemon_id;
352
        $result = $this->mysqli->query($req);
353
        $data = $result->fetch_object();
354
355
        return $data;
356
    }
357
358 View Code Duplication
    public function getRaidCountAll()
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...
359
    {
360
        $req = 'SELECT pid as pokemon_id, count, last_seen, latitude, longitude
361
				FROM raid_stats
362
				GROUP BY pid';
363
        $result = $this->mysqli->query($req);
364
        $array = array();
365
        while ($data = $result->fetch_object()) {
366
            $array[] = $data;
367
        }
368
369
        return $array;
370
    }
371
372
    ///////////////
373
    // Pokestops
374
    //////////////
375
376
    public function getTotalPokestops()
377
    {
378
        $req = 'SELECT COUNT(*) as total FROM pokestop';
379
        $result = $this->mysqli->query($req);
380
        $data = $result->fetch_object();
381
382
        return $data;
383
    }
384
385
    public function getAllPokestops()
386
    {
387
        $req = "SELECT latitude, longitude, lure_expiration, UTC_TIMESTAMP() AS now,
388
				CONVERT_TZ(lure_expiration, '+00:00', '".self::$time_offset."') AS lure_expiration_real
389
				FROM pokestop";
390
        $result = $this->mysqli->query($req);
391
        $pokestops = array();
392
        while ($data = $result->fetch_object()) {
393
            $pokestops[] = $data;
394
        }
395
396
        return $pokestops;
397
    }
398
399
    /////////
400
    // Gyms
401
    /////////
402
403 View Code Duplication
    public function getTeamGuardians($team_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...
404
    {
405
        $req = "SELECT COUNT(*) AS total, guard_pokemon_id
406
				FROM gym WHERE team_id = '".$team_id."'
407
				GROUP BY guard_pokemon_id
408
				ORDER BY total DESC
409
				LIMIT 0,3";
410
        $result = $this->mysqli->query($req);
411
        $datas = array();
412
        while ($data = $result->fetch_object()) {
413
            $datas[] = $data;
414
        }
415
416
        return $datas;
417
    }
418
419 View Code Duplication
    public function getOwnedAndPoints($team_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...
420
    {
421
        $req = "SELECT COUNT(DISTINCT(gym_id)) AS total,
422
				ROUND(AVG(total_cp),0) AS average_points
423
				FROM gym
424
				WHERE team_id = '".$team_id."'";
425
        $result = $this->mysqli->query($req);
426
        $data = $result->fetch_object();
427
428
        return $data;
429
    }
430
431
    public function getAllGyms()
432
    {
433
        $req = "SELECT gym_id, team_id, latitude, longitude,
434
				CONVERT_TZ(last_scanned, '+00:00', '".self::$time_offset."') AS last_scanned,
435
				(6 - slots_available) AS level
436
				FROM gym";
437
        $result = $this->mysqli->query($req);
438
        $gyms = array();
439
        while ($data = $result->fetch_object()) {
440
            $gyms[] = $data;
441
        }
442
443
        return $gyms;
444
    }
445
446 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...
447
    {
448
        $req = "SELECT gymdetails.name AS name, gymdetails.description AS description, gymdetails.url AS url, gym.team_id AS team,
449
				CONVERT_TZ(gym.last_scanned, '+00:00', '".self::$time_offset."') AS last_scanned,
450
				gym.guard_pokemon_id AS guard_pokemon_id,
451
				gym.total_cp AS total_cp,
452
				(6 - gym.slots_available) AS level
453
				FROM gymdetails
454
				LEFT JOIN gym ON gym.gym_id = gymdetails.gym_id
455
				WHERE gym.gym_id='".$gym_id."'";
456
        $result = $this->mysqli->query($req);
457
        $data = $result->fetch_object();
458
459
        return $data;
460
    }
461
462 View Code Duplication
    public function getGymDefenders($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...
463
    {
464
        $req = "SELECT DISTINCT gympokemon.pokemon_uid, pokemon_id, iv_attack, iv_defense, iv_stamina, MAX(cp) AS cp, gymmember.gym_id
465
				FROM gympokemon
466
				INNER JOIN gymmember ON gympokemon.pokemon_uid=gymmember.pokemon_uid
467
				GROUP BY gympokemon.pokemon_uid, pokemon_id, iv_attack, iv_defense, iv_stamina, gym_id
468
				HAVING gymmember.gym_id='".$gym_id."'
469
				ORDER BY cp DESC";
470
        $result = $this->mysqli->query($req);
471
        $defenders = array();
472
        while ($data = $result->fetch_object()) {
473
            $defenders[] = $data;
474
        }
475
476
        return $defenders;
477
    }
478
479
    ////////////////
480
    // Gym History
481
    ////////////////
482
483
    public function getGymHistories($gym_name, $team, $page, $ranking)
484
    {
485
        $where = '';
486
        if (isset($gym_name) && '' != $gym_name) {
487
            $where = " WHERE name LIKE '%".$gym_name."%'";
488
        }
489 View Code Duplication
        if (isset($team) && '' != $team) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across 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...
490
            $where .= ('' == $where ? ' WHERE' : ' AND').' team_id = '.$team;
491
        }
492 View Code Duplication
        switch ($ranking) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across 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...
493
            case 1:
494
                $order = ' ORDER BY name, last_modified DESC';
495
                break;
496
            case 2:
497
                $order = ' ORDER BY total_cp DESC, last_modified DESC';
498
                break;
499
            default:
500
                $order = ' ORDER BY last_modified DESC, name';
501
        }
502
        $req = "SELECT gymdetails.gym_id, name, team_id, total_cp,
503
				(6 - slots_available) as pokemon_count,
504
				CONVERT_TZ(last_modified, '+00:00', '".self::$time_offset."') as last_modified
505
				FROM gymdetails
506
				LEFT JOIN gym
507
				ON gymdetails.gym_id = gym.gym_id
508
				".$where.$order."
509
				LIMIT ".($page * 10).",10";
510
        $result = $this->mysqli->query($req);
511
        $gym_history = array();
512
        while ($data = $result->fetch_object()) {
513
            $gym_history[] = $data;
514
        }
515
516
        return $gym_history;
517
    }
518
519 View Code Duplication
    public function getGymHistoriesPokemon($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...
520
    {
521
        $req = "SELECT DISTINCT gymmember.pokemon_uid, pokemon_id, cp, trainer_name
522
				FROM gymmember
523
				LEFT JOIN gympokemon
524
				ON gymmember.pokemon_uid = gympokemon.pokemon_uid
525
				WHERE gymmember.gym_id = '".$gym_id."'
526
				ORDER BY deployment_time";
527
        $result = $this->mysqli->query($req);
528
        $pokemons = array();
529
        while ($data = $result->fetch_object()) {
530
            $pokemons[] = $data;
531
        }
532
533
        return $pokemons;
534
    }
535
536
    public function getHistoryForGym($page, $gym_id)
537
    {
538 View Code Duplication
        if (isset(self::$config->system->gymhistory_hide_cp_changes) && true === self::$config->system->gymhistory_hide_cp_changes) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across 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...
539
            $pageSize = 25;
540
        } else {
541
            $pageSize = 10;
542
        }
543
        $req = "SELECT gym_id, team_id, total_cp, pokemon_uids, pokemon_count,
544
				CONVERT_TZ(last_modified, '+00:00', '".self::$time_offset."') as last_modified
545
				FROM gymhistory
546
				WHERE gym_id='".$gym_id."'
547
				ORDER BY last_modified DESC
548
				LIMIT ".($page * $pageSize).','.($pageSize + 1);
549
        $result = $this->mysqli->query($req);
550
        $history = array();
551
        $count = 0;
552
        while ($data = $result->fetch_object()) {
553
            ++$count;
554
            $pkm = array();
555
            if (0 == $data->total_cp) {
556
                $data->pokemon_uids = '';
557
                $data->pokemon_count = 0;
558
            }
559
            if ('' != $data->pokemon_uids) {
560
                $pkm_uids = explode(',', $data->pokemon_uids);
561
                $pkm = $this->getHistoryForGymPokemon($pkm_uids);
562
            }
563
            $data->pokemon = $pkm;
564
            $history[] = $data;
565
        }
566
        if ($count !== ($pageSize + 1)) {
567
            $last_page = true;
568
        } else {
569
            $last_page = false;
570
        }
571
572
        return array('last_page' => $last_page, 'data' => $history);
573
    }
574
575
    private function getHistoryForGymPokemon($pkm_uids)
576
    {
577
        $req = "SELECT DISTINCT pokemon_uid, pokemon_id, cp, trainer_name
578
				FROM gympokemon
579
				WHERE pokemon_uid IN ('".implode("','", $pkm_uids)."')
580
				ORDER BY FIND_IN_SET(pokemon_uid, '".implode(',', $pkm_uids)."')";
581
        $result = $this->mysqli->query($req);
582
        $pokemons = array();
583
        while ($data = $result->fetch_object()) {
584
            $pokemons[$data->pokemon_uid] = $data;
585
        }
586
587
        return $pokemons;
588
    }
589
590
    ///////////
591
    // Raids
592
    ///////////
593
594
    public function getAllRaids($page)
595
    {
596
        $req = "SELECT raid.gym_id, raid.level, raid.pokemon_id, raid.cp, raid.move_1, raid.move_2,
597
				CONVERT_TZ(raid.spawn, '+00:00', '".self::$time_offset."') AS spawn,
598
				CONVERT_TZ(raid.start, '+00:00', '".self::$time_offset."') AS start,
599
				CONVERT_TZ(raid.end, '+00:00', '".self::$time_offset."') AS end,
600
				CONVERT_TZ(raid.last_scanned, '+00:00', '".self::$time_offset."') AS last_scanned,
601
				gymdetails.name, gym.latitude, gym.longitude
602
				FROM raid
603
				JOIN gymdetails ON gymdetails.gym_id = raid.gym_id
604
				JOIN gym ON gym.gym_id = raid.gym_id
605
				WHERE raid.end > UTC_TIMESTAMP()
606
				ORDER BY raid.level DESC, raid.start
607
				LIMIT ".($page * 10).",10";
608
        $result = $this->mysqli->query($req);
609
        $raids = array();
610
        while ($data = $result->fetch_object()) {
611
            $raids[] = $data;
612
        }
613
614
        return $raids;
615
    }
616
617
    //////////////
618
    // Trainers
619
    //////////////
620
621
    public function getTrainers($trainer_name, $team, $page, $ranking)
622
    {
623
        $trainers = $this->getTrainerData($trainer_name, $team, $page, $ranking);
624
        foreach ($trainers as $trainer) {
625
            $trainer->rank = $this->getTrainerLevelRating($trainer->level)->rank;
626
            $active_gyms = 0;
627
            $pkmCount = 0;
628
            $trainer->pokemons = array();
629
            $active_pokemon = $this->getTrainerActivePokemon($trainer->name);
630
            foreach ($active_pokemon as $pokemon) {
631
                ++$active_gyms;
632
                $trainer->pokemons[$pkmCount++] = $pokemon;
633
            }
634
            $inactive_pokemon = $this->getTrainerInactivePokemon($trainer->name);
635
            foreach ($inactive_pokemon as $pokemon) {
636
                $trainer->pokemons[$pkmCount++] = $pokemon;
637
            }
638
            $trainer->gyms = ''.$active_gyms;
639
        }
640
641
        return $trainers;
642
    }
643
644 View Code Duplication
    public function getTrainerLevelCount($team_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...
645
    {
646
        $req = "SELECT level, count(level) AS count FROM trainer WHERE team = '".$team_id."'";
647
        if (!empty(self::$config->system->trainer_blacklist)) {
648
            $req .= " AND name NOT IN ('".implode("','", self::$config->system->trainer_blacklist)."')";
649
        }
650
        $req .= ' GROUP BY level';
651
        $result = $this->mysqli->query($req);
652
        $levelData = array();
653
        while ($data = $result->fetch_object()) {
654
            $levelData[$data->level] = $data->count;
655
        }
656
        for ($i = 5; $i <= 40; ++$i) {
657
            if (!isset($levelData[$i])) {
658
                $levelData[$i] = 0;
659
            }
660
        }
661
        // sort array again
662
        ksort($levelData);
663
664
        return $levelData;
665
    }
666
667
    private function getTrainerData($trainer_name, $team, $page, $ranking)
668
    {
669
        $where = '';
670
        if (!empty(self::$config->system->trainer_blacklist)) {
671
            $where .= ('' == $where ? ' HAVING' : ' AND')." name NOT IN ('".implode("','", self::$config->system->trainer_blacklist)."')";
672
        }
673
        if ('' != $trainer_name) {
674
            $where = " HAVING name LIKE '%".$trainer_name."%'";
675
        }
676 View Code Duplication
        if (0 != $team) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across 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...
677
            $where .= ('' == $where ? ' HAVING' : ' AND').' team = '.$team;
678
        }
679 View Code Duplication
        switch ($ranking) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across 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...
680
            case 1:
681
                $order = ' ORDER BY active DESC, level DESC';
682
                break;
683
            case 2:
684
                $order = ' ORDER BY maxCp DESC, level DESC';
685
                break;
686
            default:
687
                $order = ' ORDER BY level DESC, active DESC';
688
        }
689
        $order .= ', last_seen DESC, name ';
690
        $limit = ' LIMIT '.($page * 10).',10 ';
691
        $req = "SELECT trainer.*, COUNT(actives_pokemons.trainer_name) AS active, max(actives_pokemons.cp) AS maxCp
692
				FROM trainer
693
				LEFT JOIN (SELECT DISTINCT gympokemon.pokemon_id, gympokemon.pokemon_uid, gympokemon.trainer_name, gympokemon.cp, DATEDIFF(UTC_TIMESTAMP(), gympokemon.last_seen) AS last_scanned
694
				FROM gympokemon
695
				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
696
				ON gympokemon.pokemon_uid = filtered_gymmember.pokemon_uid) AS actives_pokemons ON actives_pokemons.trainer_name = trainer.name
697
				GROUP BY trainer.name ".$where.$order.$limit;
698
        $result = $this->mysqli->query($req);
699
        $trainers = array();
700
        while ($data = $result->fetch_object()) {
701
            $data->last_seen = date('Y-m-d', strtotime($data->last_seen));
702
            $trainers[$data->name] = $data;
703
        }
704
705
        return $trainers;
706
    }
707
708
    private function getTrainerLevelRating($level)
709
    {
710
        $req = 'SELECT COUNT(1) AS rank FROM trainer WHERE level = '.$level;
711
        if (!empty(self::$config->system->trainer_blacklist)) {
712
            $req .= " AND name NOT IN ('".implode("','", self::$config->system->trainer_blacklist)."')";
713
        }
714
        $result = $this->mysqli->query($req);
715
        $data = $result->fetch_object();
716
717
        return $data;
718
    }
719
720 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...
721
    {
722
        $req = "SELECT DISTINCT gympokemon.pokemon_id, gympokemon.pokemon_uid, gympokemon.cp,
723
				DATEDIFF(UTC_TIMESTAMP(), gympokemon.last_seen) AS last_scanned,
724
				gympokemon.trainer_name, gympokemon.iv_defense, gympokemon.iv_stamina, gympokemon.iv_attack,
725
				filtered_gymmember.gym_id,
726
				CONVERT_TZ(filtered_gymmember.deployment_time, '+00:00', '".self::$time_offset."') as deployment_time,
727
				'1' AS active
728
				FROM gympokemon INNER JOIN
729
				(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
730
				ON gympokemon.pokemon_uid = filtered_gymmember.pokemon_uid
731
				WHERE gympokemon.trainer_name='".$trainer_name."'
732
				ORDER BY gympokemon.cp DESC";
733
        $result = $this->mysqli->query($req);
734
        $pokemons = array();
735
        while ($data = $result->fetch_object()) {
736
            $pokemons[] = $data;
737
        }
738
739
        return $pokemons;
740
    }
741
742 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...
743
    {
744
        $req = "SELECT DISTINCT gympokemon.pokemon_id, gympokemon.pokemon_uid, gympokemon.cp,
745
				DATEDIFF(UTC_TIMESTAMP(), gympokemon.last_seen) AS last_scanned,
746
				gympokemon.trainer_name, gympokemon.iv_defense, gympokemon.iv_stamina, gympokemon.iv_attack,
747
				null AS gym_id,
748
				CONVERT_TZ(filtered_gymmember.deployment_time, '+00:00', '".self::$time_offset."') as deployment_time,
749
				'0' AS active
750
				FROM gympokemon LEFT JOIN
751
				(SELECT * FROM gymmember HAVING gymmember.gym_id <> '') AS filtered_gymmember
752
				ON gympokemon.pokemon_uid = filtered_gymmember.pokemon_uid
753
				WHERE filtered_gymmember.pokemon_uid IS NULL AND gympokemon.trainer_name='".$trainer_name."'
754
				ORDER BY gympokemon.cp DESC";
755
        $result = $this->mysqli->query($req);
756
        $pokemons = array();
757
        while ($data = $result->fetch_object()) {
758
            $pokemons[] = $data;
759
        }
760
761
        return $pokemons;
762
    }
763
764
    /////////
765
    // Cron
766
    /////////
767
768 View Code Duplication
    public function getPokemonCountsActive()
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...
769
    {
770
        $req = 'SELECT pokemon_id, COUNT(*) as total
771
				FROM pokemon
772
				WHERE disappear_time >= UTC_TIMESTAMP()
773
				GROUP BY pokemon_id';
774
        $result = $this->mysqli->query($req);
775
        $counts = array();
776
        while ($data = $result->fetch_object()) {
777
            $counts[$data->pokemon_id] = $data->total;
778
        }
779
780
        return $counts;
781
    }
782
783
784
    public function getTotalPokemonIV()
785
    {
786
        $req = 'SELECT COUNT(*) as total
787
				FROM pokemon
788
				WHERE disappear_time >= UTC_TIMESTAMP() AND cp IS NOT NULL';
789
        $result = $this->mysqli->query($req);
790
        $data = $result->fetch_object();
791
792
        return $data;
793
    }
794
795 View Code Duplication
    public function getPokemonCountsLastDay()
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...
796
    {
797
        $req = 'SELECT pokemon_id, COUNT(*) AS spawns_last_day
798
				FROM pokemon
799
				WHERE disappear_time >= (SELECT MAX(disappear_time) FROM pokemon) - INTERVAL 1 DAY
800
				GROUP BY pokemon_id
801
				ORDER BY pokemon_id ASC';
802
        $result = $this->mysqli->query($req);
803
        $counts = array();
804
        while ($data = $result->fetch_object()) {
805
            $counts[$data->pokemon_id] = $data->spawns_last_day;
806
        }
807
808
        return $counts;
809
    }
810
811
    public function getCaptchaCount()
812
    {
813
        $req = 'SELECT SUM(accounts_captcha) AS total FROM mainworker';
814
        $result = $this->mysqli->query($req);
815
        $data = $result->fetch_object();
816
817
        return $data;
818
    }
819
820 View Code Duplication
    public function getNestData($time, $minLatitude, $maxLatitude, $minLongitude, $maxLongitude)
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...
821
    {
822
        $pokemon_exclude_sql = '';
823
        if (!empty(self::$config->system->nest_exclude_pokemon)) {
824
            $pokemon_exclude_sql = 'AND pokemon_id NOT IN ('.implode(',', self::$config->system->nest_exclude_pokemon).')';
825
        }
826
        $req = 'SELECT spawnpoint_id, pokemon_id, MAX(latitude) AS latitude, MAX(longitude) AS longitude, count(pokemon_id) AS total_pokemon,
827
				MAX(UNIX_TIMESTAMP(disappear_time)) as latest_seen
828
				FROM pokemon
829
				WHERE disappear_time > (UTC_TIMESTAMP() - INTERVAL '.$time.' HOUR)
830
				AND latitude >= '.$minLatitude.' AND latitude < '.$maxLatitude.' AND longitude >= '.$minLongitude.' AND longitude < '.$maxLongitude.'
831
				'.$pokemon_exclude_sql.' 
832
				GROUP BY spawnpoint_id, pokemon_id 
833
				HAVING COUNT(pokemon_id) >= '.($time / 4).'
834
				ORDER BY pokemon_id';
835
        $result = $this->mysqli->query($req);
836
        $nests = array();
837
        while ($data = $result->fetch_object()) {
838
            $nests[] = $data;
839
        }
840
841
        return $nests;
842
    }
843
844 View Code Duplication
    public function getSpawnpointCount($minLatitude, $maxLatitude, $minLongitude, $maxLongitude)
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...
845
    {
846
        $req = 'SELECT COUNT(*) as total 
847
				FROM spawnpoint
848
				WHERE latitude >= '.$minLatitude.' AND latitude < '.$maxLatitude.' AND longitude >= '.$minLongitude.' AND longitude < '.$maxLongitude;
849
        $result = $this->mysqli->query($req);
850
        $data = $result->fetch_object();
851
852
        return $data;
853
    }
854
}
855