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() |
|
|
|
|
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() |
|
|
|
|
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() |
|
|
|
|
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) |
|
|
|
|
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() |
|
|
|
|
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) |
|
|
|
|
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) |
|
|
|
|
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) |
|
|
|
|
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) |
|
|
|
|
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) |
|
|
|
|
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) |
|
|
|
|
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) |
|
|
|
|
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) |
|
|
|
|
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() |
|
|
|
|
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) |
|
|
|
|
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() |
|
|
|
|
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) |
|
|
|
|
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) |
|
|
|
|
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) |
|
|
|
|
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) |
|
|
|
|
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) { |
|
|
|
|
490
|
|
|
$where .= ('' == $where ? ' WHERE' : ' AND').' team_id = '.$team; |
491
|
|
|
} |
492
|
|
View Code Duplication |
switch ($ranking) { |
|
|
|
|
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) |
|
|
|
|
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) { |
|
|
|
|
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) |
|
|
|
|
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) { |
|
|
|
|
677
|
|
|
$where .= ('' == $where ? ' HAVING' : ' AND').' team = '.$team; |
678
|
|
|
} |
679
|
|
View Code Duplication |
switch ($ranking) { |
|
|
|
|
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) |
|
|
|
|
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) |
|
|
|
|
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() |
|
|
|
|
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() |
|
|
|
|
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) |
|
|
|
|
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) |
|
|
|
|
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
|
|
|
|
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.