root/dev/common/includes/class.killlist.php @ 300

Revision 300, 17.7 KB (checked in by exi, 15 years ago)

fix for ticket:59
fixed update of item values

Line 
1<?php
2require_once('class.kill.php');
3require_once('class.pagesplitter.php');
4
5class KillList
6{
7    function KillList()
8    {
9        $this->qry_ = new DBQuery();
10        $this->killpointer_ = 0;
11        $this->kills_ = 0;
12        $this->losses_ = 0;
13        $this->killisk_ = 0;
14        $this->lossisk_ = 0;
15        $this->exclude_scl_ = array();
16        $this->vic_scl_id_ = array();
17        $this->regions_ = array();
18        $this->systems_ = array();
19        $this->groupby_ = array();
20        $this->offset_ = 0;
21        $this->killcounter_ = 0;
22        $this->realkillcounter_ = 0;
23        $this->ordered_ = false;
24        $this->walked = false;
25    }
26
27    function execQuery()
28    {
29        if (!$this->qry_->executed_)
30        {
31            if (!count($this->groupby_))
32                $this->sql_ = 'select distinct kll.kll_id, kll.kll_timestamp, plt.plt_name,
33                                crp.crp_name, crp.crp_id, ali.all_name, ali.all_id, kll.kll_ship_id,
34                                kll.kll_system_id, kll.kll_ship_id,
35                                kll.kll_victim_id, plt.plt_externalid,
36                                kll.kll_crp_id, kll.kll_points,
37                                        shp.shp_class, shp.shp_name,
38                                        shp.shp_externalid, shp.shp_id,
39                                                scl.scl_id, scl.scl_class, scl.scl_value,
40                                                sys.sys_name, sys.sys_sec,
41                                fbplt.plt_name as fbplt_name,
42                                fbplt.plt_externalid as fbplt_externalid,
43                                fbcrp.crp_name as fbcrp_name';
44
45            if (config::get('ship_values'))
46            {
47                $this->sql_ .= ', ksv.shp_value';
48            }
49            if (count($this->groupby_))
50            {
51                $this->sql_ .= "select count(*) as cnt, ".implode(",", $this->groupby_);
52            }
53
54            $this->sql_ .= "    from kb3_kills kll
55                           inner join kb3_ships shp
56                              on ( shp.shp_id = kll.kll_ship_id )
57                           inner join kb3_ship_classes scl
58                              on ( scl.scl_id = shp.shp_class )";
59            if (config::get('ship_values'))
60            {
61                $this->sql_ .= ' left join kb3_ships_values ksv on (shp.shp_id = ksv.shp_id) ';
62            }
63
64            $this->sql_ .= "inner join kb3_pilots plt
65                              on ( plt.plt_id = kll.kll_victim_id )
66                           inner join kb3_corps crp
67                              on ( crp.crp_id = kll.kll_crp_id )
68                           inner join kb3_alliances ali
69                              on ( ali.all_id = kll.kll_all_id )
70                           inner join kb3_pilots fbplt
71                              on ( fbplt.plt_id = kll.kll_fb_plt_id )
72                           inner join kb3_corps fbcrp
73                              on ( fbcrp.crp_id = kll.kll_fb_crp_id )
74                           inner join kb3_systems sys
75                              on ( sys.sys_id = kll.kll_system_id )";
76
77            // involved filter
78            if (! $this->mixedinvolved_)
79            {
80                if ($this->inv_plt_)
81                    $this->sql_ .= " inner join kb3_inv_plt inp
82                               on ( inp.inp_plt_id in ( ".join(',', $this->inv_plt_)." ) and kll.kll_id = inp.inp_kll_id ) ";
83                if ($this->inv_crp_)
84                    $this->sql_ .= " inner join kb3_inv_crp inc
85                              on ( inc.inc_crp_id in ( ".join(',', $this->inv_crp_)." ) and kll.kll_id = inc.inc_kll_id
86                               and inc.inc_crp_id != kll.kll_crp_id ) ";
87                if ($this->inv_all_)
88                    $this->sql_ .= " inner join kb3_inv_all ina
89                              on ( ina.ina_all_id in ( ".join(',', $this->inv_all_)." ) and kll.kll_id = ina.ina_kll_id
90                               and ina.ina_all_id != kll.kll_all_id ) ";
91            }
92            else
93            {
94                $this->sql_ .= " <ph> ";
95            }
96            // echo $this->sql_;
97            // regions
98            if (count($this->regions_))
99            {
100                $this->sql_ .= " inner join kb3_constellations con
101                              on ( con.con_id = sys.sys_con_id )
102                           inner join kb3_regions reg
103                              on ( reg.reg_id = con.con_reg_id
104                                   and reg.reg_id in ( ".implode($this->regions_, ",")." ) )";
105            }
106
107            if (count($this->systems_))
108            {
109                $this->sql_ .= "   and kll.kll_system_id in ( ".implode($this->systems_, ",").")";
110            }
111            // victim filter
112            if ($this->mixedvictims_)
113            {
114                $this->sql_ .= " and ( 1 = 0 ";
115                $op = "or";
116            }
117            else $op = "and";
118
119            if ($this->vic_plt_)
120                $this->sql_ .= " ".$op." kll.kll_victim_id in ( ".join(',', $this->vic_plt_)." )";
121            if ($this->vic_crp_)
122                $this->sql_ .= " ".$op." kll.kll_crp_id in ( ".join(',', $this->vic_crp_)." )";
123            if ($this->vic_all_)
124                $this->sql_ .= " ".$op." kll.kll_all_id in ( ".join(',', $this->vic_all_)." )";
125
126            if ($this->mixedvictims_)
127                $this->sql_ .= " ) ";
128            // echo $this->sql_;
129            // ship filter
130            if (count($this->exclude_scl_))
131            {
132                $this->sql_ .= " and scl.scl_id not in ( ".implode(",", $this->exclude_scl_)." )";
133            }
134            if (count($this->vic_scl_id_))
135            {
136                $this->sql_ .= " and scl.scl_id in ( ".implode(",", $this->vic_scl_id_)." )";
137            }
138            // related
139            if ($this->related_)
140            {
141                $rqry = new DBQuery();
142                $rsql = "select kll_timestamp, kll_system_id from kb3_kills where kll_id = ".$this->related_;
143
144                $rqry->execute($rsql);
145                $rrow = $rqry->getRow();
146
147                $this->sql_ .= " and kll.kll_system_id = ".$rrow['kll_system_id']."
148                           and kll.kll_timestamp <=
149                               date_add( '".$rrow['kll_timestamp']."', INTERVAL '60:0' MINUTE_SECOND )
150                           and kll.kll_timestamp >=
151                               date_sub( '".$rrow['kll_timestamp']."', INTERVAL '60:0' MINUTE_SECOND )";
152            }
153            // timeframe
154            if ($this->timeframe_)
155                $this->sql_ .= $this->timeframe_;
156
157            if (!strpos($this->sql_, " join ") && !$this->mixedinvolved_)
158                $this->sqlhead_ .= " where 1 = 1";
159
160            if ($this->mixedinvolved_)
161            {
162                if ($this->inv_plt_)
163                {
164                    $replace = " inner join kb3_inv_plt inp
165                            on ( inp.inp_plt_id in ( ".join(',', $this->inv_plt_)." ) and kll.kll_id = inp.inp_kll_id ) ";
166                    $psql = str_replace("<ph>", $replace, $this->sql_);
167                }
168                if ($this->inv_crp_)
169                {
170                    $replace = " inner join kb3_inv_crp inc
171                            on ( inc.inc_crp_id in ( ".join(',', $this->inv_crp_)." ) and kll.kll_id = inc.inc_kll_id ) ";
172                    $csql = str_replace("<ph>", $replace, $this->sql_);
173                }
174                if ($this->inv_all_)
175                {
176                    $replace = " inner join kb3_inv_all ina
177                            on ( ina.ina_all_id in ( ".join(',', $this->inv_all_)." ) and kll.kll_id = ina.ina_kll_id ) ";
178                    $asql = str_replace("<ph>", $replace, $this->sql_);
179                }
180
181                if ($psql)
182                    $nsql = $psql." union ";
183                if ($csql)
184                    $nsql .= $csql." union ";
185                if ($asql)
186                    $nsql .= $asql;
187
188                $this->sql_ = $nsql;
189            }
190            if ($this->minkllid_)
191            {
192                $this->sql_ .= ' WHERE kll.kll_id > \''.$this->minkllid_.'\' ';
193            }
194
195            // group by
196            if ($this->groupby_) $this->sql_ .= " group by ".implode(",", $this->groupby_);
197            // order/limit
198            if ($this->ordered_)
199            {
200                if (!$this->orderby_) $this->sql_ .= " order by kll_timestamp desc";
201                else $this->sql_ .= " order by ".$this->orderby_;
202            }
203            if ($this->limit_) $this->sql_ .= " limit ".$this->offset_.", ".$this->limit_;
204            // echo '<p>'.$this->sql_."</p>";
205            $this->qry_->execute($this->sql_);
206        }
207    }
208
209    function getRow()
210    {
211        $this->execQuery();
212        if ($this->plimit_ && $this->killcounter_ >= $this->plimit_)
213        {
214            // echo $this->plimit_." ".$this->killcounter_;
215            return null;
216        }
217
218        $skip = $this->poffset_ - $this->killpointer_;
219        if ($skip > 0)
220        {
221            for ($i = 0; $i < $skip; $i++)
222            {
223                $this->killpointer_++;
224                $row = $this->qry_->getRow();
225            }
226        }
227
228        $row = $this->qry_->getRow();
229
230        return $row;
231    }
232
233    function getKill()
234    {
235        $this->execQuery();
236        if ($this->plimit_ && $this->killcounter_ >= $this->plimit_)
237        {
238            // echo $this->plimit_." ".$this->killcounter_;
239            return null;
240        }
241
242        $skip = $this->poffset_ - $this->killpointer_;
243        if ($skip > 0)
244        {
245            for ($i = 0; $i < $skip; $i++)
246            {
247                $this->killpointer_++;
248                $row = $this->qry_->getRow();
249            }
250        }
251
252        $row = $this->qry_->getRow();
253        if ($row)
254        {
255            $this->killcounter_++;
256            if ($row['scl_class'] != 2 && $row['scl_class'] != 3 && $row['scl_class'] != 11)
257                $this->realkillcounter_++;
258
259           if (config::get('ship_values'))
260            {
261                if ($row['shp_value'])
262                {
263                    $row['scl_value'] = $row['shp_value'];
264                }
265            }
266
267            if ($this->walked == false)
268            {
269                $this->killisk_ += $row['scl_value'];
270                $this->killpoints_ += $row['kll_points'];
271            }
272
273            $kill = new Kill($row['kll_id']);
274            $kill->setTimeStamp($row['kll_timestamp']);
275            $kill->setSolarSystemName($row['sys_name']);
276            $kill->setSolarSystemSecurity($row['sys_sec']);
277            $kill->setVictimName($row['plt_name']);
278            $kill->setVictimCorpName($row['crp_name']);
279            $kill->setVictimCorpID($row['crp_id']);
280            $kill->setVictimAllianceName($row['all_name']);
281            $kill->setVictimAllianceID($row['all_id']);
282            $kill->setVictimShipName($row['shp_name']);
283            $kill->setVictimShipExternalID($row['shp_externalid']);
284            $kill->setVictimShipClassName($row['scl_class']);
285            $kill->setVictimShipValue($row['scl_value']);
286            $kill->setVictimID($row['kll_victim_id']);
287            $kill->setFBPilotName($row['fbplt_name']);
288            $kill->setFBCorpName($row['fbcrp_name']);
289            $kill->setKillPoints($row['kll_points']);
290            $kill->plt_ext_ = $row['plt_externalid'];
291            $kill->fbplt_ext_ = $row['fbplt_externalid'];
292            $kill->_sclid = $row['scl_id'];
293            $kill->_shpid = $row['shp_id'];
294            if ($this->_tag)
295            {
296                $kill->_tag = $this->_tag;
297            }
298            if (config::get('kill_classified'))
299            {
300                if ($kill->isClassified())
301                {
302                    $kill->setSolarSystemName('Classified');
303                    $kill->setSolarSystemSecurity('0.0');
304                }
305            }
306
307            return $kill;
308        }
309        else
310        {
311            $this->walked = true;
312            return null;
313        }
314    }
315
316    function getAllKills()
317    {
318        while ($this->getKill())
319        {
320        }
321        $this->rewind();
322    }
323
324    function addInvolvedPilot($pilot)
325    {
326        $this->inv_plt_[] = $pilot->getID();
327        if (count($this->inv_crp_) || count($this->inv_all_))
328            $this->mixedinvolved_ = true;
329    }
330
331    function addInvolvedCorp($corp)
332    {
333        $this->inv_crp_[] = $corp->getID();
334        if (count($this->inv_plt_) || count($this->inv_all_))
335            $this->mixedinvolved_ = true;
336    }
337
338    function addInvolvedAlliance($alliance)
339    {
340        $this->inv_all_[] = $alliance->getID();
341        if (count($this->inv_plt_) || count($this->inv_crp_))
342            $this->mixedinvolved_ = true;
343    }
344
345    function addVictimPilot($pilot)
346    {
347        $this->vic_plt_[] = $pilot->getID();
348        if (count($this->vic_crp_) || count($this->vic_all_))
349            $this->mixedvictims_ = true;
350    }
351
352    function addVictimCorp($corp)
353    {
354        $this->vic_crp_[] = $corp->getID();
355        if (count($this->vic_plt_) || count($this->vic_all_))
356            $this->mixedvictims_ = true;
357    }
358
359    function addVictimAlliance($alliance)
360    {
361        $this->vic_all_[] = $alliance->getID();
362        if (count($this->vic_plt_) || count($this->vic_crp_))
363            $this->mixedvictims_ = true;
364    }
365
366    function addVictimShipClass($shipclass)
367    {
368        array_push($this->vic_scl_id_, $shipclass->getID());
369    }
370
371    function addVictimShip($ship)
372    {
373    }
374
375    function addItemDestroyed($item)
376    {
377    }
378
379    function addRegion($region)
380    {
381        array_push($this->regions_, $region->getID());
382    }
383
384    function addSystem($system)
385    {
386        array_push($this->systems_, $system->getID());
387    }
388
389    function addGroupBy($groupby)
390    {
391        array_push($this->groupby_, $groupby);
392    }
393
394    function setPageSplitter($pagesplitter)
395    {
396        if (isset($_GET['page'])) $page = $_GET['page'];
397        else $page = 1;
398        $this->plimit_ = $pagesplitter->getSplit();
399        $this->poffset_ = ($page * $this->plimit_) - $this->plimit_;
400        // echo $this->offset_;
401        // echo $this->limit_;
402    }
403
404    function setWeek($weekno)
405    {
406        $this->timeframe_ .= " and date_format( kll.kll_timestamp, \"%u\" ) = ";
407        $this->timeframe_ .= $weekno;
408    }
409
410    function setYear($yearno)
411    {
412        $this->timeframe_ .= " and date_format( kll.kll_timestamp, \"%Y\" ) = ";
413        $this->timeframe_ .= $yearno;
414    }
415
416    function setStartWeek($weekno)
417    {
418        $this->timeframe_ .= " and date_format( kll.kll_timestamp, \"%u\" ) >= ";
419        $this->timeframe_ .= $weekno;
420    }
421
422    function setStartDate($timestamp)
423    {
424        $this->timeframe_ .= " and kll.kll_timestamp >= '".$timestamp."'";
425    }
426
427    function setEndDate($timestamp)
428    {
429        $this->timeframe_ .= " and kll.kll_timestamp <= '".$timestamp."'";
430    }
431
432    function setRelated($killid)
433    {
434        $this->related_ = $killid;
435    }
436
437    function setLimit($limit)
438    {
439        $this->limit_ = $limit;
440    }
441
442    function setOrderBy($orderby)
443    {
444        $this->orderby_ = $orderby;
445    }
446
447    function setMinKllID($id)
448    {
449        $this->timeframe_ = '';
450        $this->minkllid_ = $id;
451    }
452
453    function getCount()
454    {
455        $this->execQuery();
456        return $this->qry_->recordCount();
457    }
458
459    function getRealCount()
460    {
461        $this->execQuery();
462        return $this->qry_->recordCount();
463    }
464
465    function getISK()
466    {
467        $this->execQuery();
468        return $this->killisk_;
469    }
470
471    function getPoints()
472    {
473        return $this->killpoints_;
474    }
475
476    function rewind()
477    {
478        $this->qry_->rewind();
479        $this->killcounter_ = 0;
480    }
481
482    function setPodsNoobShips($flag)
483    {
484        if (!$flag)
485        {
486            array_push($this->exclude_scl_, 2);
487            array_push($this->exclude_scl_, 3);
488            array_push($this->exclude_scl_, 11);
489        }
490    }
491
492    function setOrdered($flag)
493    {
494        $this->ordered_ = $flag;
495    }
496
497    function tag($string)
498    {
499        if ($string == '')
500        {
501            $this->_tag = null;
502        }
503        else
504        {
505            $this->_tag = $string;
506        }
507    }
508}
509
510class CombinedKillList extends KillList
511{
512    function CombinedKillList()
513    {
514        // please only load killlists here
515        $this->lists = func_get_args();
516        if (!is_array($this->lists))
517        {
518            trigger_error('No killlists given to CombinedKillList', E_USER_ERROR);
519        }
520        $this->kills = false;
521    }
522
523    function buildKillArray()
524    {
525        $this->kills = array();
526        foreach ($this->lists as $killlist)
527        {
528            // reset the list
529            $killlist->rewind();
530
531            // load all kills and store them in an array
532            while ($kill = $killlist->getKill())
533            {
534                // take sure that if there are multiple kills all are stored
535                if (isset($this->kills[$kill->timestamp_]))
536                {
537                    $this->kills[$kill->timestamp_.rand()] = $kill;
538                }
539                else
540                {
541                    $this->kills[$kill->timestamp_] = $kill;
542                }
543            }
544        }
545
546        // sort the kills by time
547        krsort($this->kills);
548    }
549
550    function getKill()
551    {
552        // on the first request we load up our kills
553        if ($this->kills == false)
554        {
555            $this->buildKillArray();
556        }
557
558        // once all kills are out this will return null so we're fine
559        return array_shift($this->kills);
560    }
561
562    function rewind()
563    {
564        // intentionally left empty to overload the standard handle
565    }
566}
567?>
Note: See TracBrowser for help on using the browser.