root/dev/common/class.parser.php @ 158

Revision 158, 15.1 KB (checked in by exi, 14 years ago)

Fix for ticket:34, wrong campaign duration calculation.
Contracts now end at 23:59:59 on the entered day, edit existing contracts for this change to take into account.
Converted the 3 different thumbnail creations into one thumbnail class, please leave a note on problems.
Added 40 more item classes to the autoupgrade code.
Changed http class to supress errors.
Fixed parser to properly check the victim against granted posting permissions.

Line 
1<?php
2require_once("class.alliance.php");
3require_once("class.corp.php");
4require_once("class.pilot.php");
5require_once("class.kill.php");
6require_once("class.item.php");
7
8class Parser
9{
10    function Parser($killmail)
11    {
12        $this->error_ = array();
13        $this->killmail_ = trim(str_replace("\r", '', $killmail));
14
15        if (strpos($this->killmail_, 'Beteiligte Parteien:'))
16        {
17            $this->preparse('german');
18        }
19
20        if (strpos($this->killmail_, '**** Truncated - mail is too large ****') > 0)
21        {
22            $this->killmail_ = str_replace('**** Truncated - mail is too large ****', '', $this->killmail_);
23        }
24
25        // Parser fix, since some killmails don't have a final blow, they would break the KB
26        if (strpos($this->killmail_, 'laid the final blow') < 1)
27        {
28            $this->needs_final_blow_ = 1;
29        }
30    }
31
32    function parse($checkauth = true)
33    {
34        global $config;
35        // header
36        $involvedpos = strpos($this->killmail_, "Involved parties:");
37
38        $header = substr($this->killmail_, 0, $involvedpos);
39        $timestamp = substr($header, 0, 16);
40
41        if (preg_match("/Victim: (.*?)Alliance: (.*)/", $header))
42        {
43            $this->error('Found no linefeeds.');
44            return 0;
45        }
46
47        if (preg_match("/Victim: (.*)/", $header, $matches))
48        {
49            $victimname = trim($matches[1]);
50        }
51        else
52        {
53            $this->error('No victim found.');
54        }
55        if (preg_match("/Alliance: (.*)/", $header, $matches))
56        {
57            $alliancename = trim($matches[1]);
58        }
59        else
60        {
61            $this->error('No alliance found.');
62        }
63        if (preg_match("/Corp: (.*)/", $header, $matches))
64        {
65            $corpname = trim($matches[1]);
66        }
67        else
68        {
69            $this->error('No corp found.');
70        }
71        if (preg_match("/Destroyed: (.*)/", $header, $matches))
72        {
73            $shipname = trim($matches[1]);
74        }
75        else
76        {
77            $this->error('No destroyed ship found.');
78        }
79        if (preg_match("/System: (.*)/", $header, $matches))
80        {
81            $systemname = trim($matches[1]);
82        }
83        else
84        {
85            $this->error('No system found.');
86        }
87        if (preg_match("/Security: (.*)/", $header, $matches))
88        {
89            $systemsec = trim($matches[1]);
90        }
91        else
92        {
93            $this->error('No security found.');
94        }
95
96        if (!isset($timestamp) ||
97                !isset($alliancename) ||
98                !isset($corpname) ||
99                !isset($victimname) ||
100                !isset($shipname) ||
101                !isset($systemname) ||
102                !isset($systemsec))
103            return 0;
104
105        if ($checkauth)
106        {
107            $authorized = false;
108        }
109        else
110        {
111            $authorized = true;
112        }
113
114        // populate/update database
115        $alliance = new Alliance();
116        $alliance->add($alliancename);
117        $corp = new Corporation();
118        $corp->add($corpname, $alliance, $timestamp);
119        $victim = new Pilot();
120        $victim->add($victimname, $corp, $timestamp);
121        $system = new SolarSystem();
122        $system->lookup($systemname);
123        if (!$system->getID())
124        {
125            $this->error('System not found.', $systemname);
126        }
127        $ship = new Ship();
128        $ship->lookup($shipname);
129        if (!$ship->getID())
130        {
131            $this->error('Ship not found.', $shipname);
132        }
133        $kill = new Kill();
134        $kill->setTimeStamp($timestamp);
135        $kill->setVictimID($victim->getID());
136        $kill->setVictimCorpID($corp->getID());
137        $kill->setVictimAllianceID($alliance->getID());
138        $kill->setVictimShip($ship);
139        $kill->setSolarSystem($system);
140
141        if (ALLIANCE_ID != 0 && $alliance->getID() == ALLIANCE_ID)
142            $authorized = true;
143        elseif (CORP_ID != 0)
144        {
145            $corps = explode(",", CORP_ID);
146            foreach($corps as $checkcorp)
147            {
148                if ($corp->getID() == $checkcorp)
149                    $authorized = true;
150            }
151        }
152
153        // involved
154        $end = strpos($this->killmail_, "Destroyed items:");
155        if ($end == 0)
156        {
157            $end = strlen($this->killmail_);
158        }
159        $involved = explode("\n", trim(substr($this->killmail_, strpos($this->killmail_, "Involved parties:") + 17, $end - (strpos($this->killmail_, "Involved parties:") + 17))));
160
161        $i = 0;
162
163        $order = 0;
164        while ($i < count($involved))
165        {
166            if ($involved[$i] == "")
167            {
168                $i++;
169                continue;
170            }
171
172            preg_match("/Name: (.*)/", $involved[$i], $matches);
173            $ipname = $matches[1];
174
175            preg_match("/(.*) \\(laid the final blow\\)/", $ipname, $matches);
176            if ($matches[1])
177            {
178                $ipname = $matches[1];
179                $finalblow = 1;
180            }
181            else
182            {
183                $finalblow = 0;
184            }
185
186            /* This is part of the final blow fix, mentioned above */
187            if ($this->needs_final_blow_)
188            {
189                $finalblow = 1;
190                $this->needs_final_blow_ = 0;
191            }
192            /* END FIX */
193
194            preg_match("/Security: (.*)/", $involved[$i + 1], $matches);
195            $secstatus = $matches[1];
196
197            if ($secstatus == "") // NPC or POS
198            {
199                $secstatus = "0.0";
200                preg_match("/(.*) \/ (.*)/", $ipname, $pmatches);
201                $icname = $pmatches[2];
202                $isname = "Unknown";
203                $iwname = $pmatches[1];
204                if (!strlen($icname) && !strlen($iwname))
205                {
206                    // fucked up bclinic killmail, no person here, continue
207                    $i++;
208                    continue;
209                }
210
211                $tmpcorp = new Corporation();
212                $tmpcorp->lookup($icname);
213
214                if (!$tmpcorp->getID())
215                {
216                    // not a known corp, add it
217                    $ialliance = new Alliance();
218                    $ialliance->add('None');
219                    $icorp = new Corporation();
220                    $icorp->add($icname, $ialliance, $kill->getTimeStamp());
221                    $tmpcorp = $icorp;
222                }
223                                $iweapon = new Item();
224                                $iweapon->lookup($pmatches[1]);
225                                $ipname = '#'.$tmpcorp->getID().'#'.$iweapon->getID().'#'.$iwname;
226                $tmpall = $tmpcorp->getAlliance();
227                // name will be None if no alliance is set
228                $ianame = $tmpall->getName();
229
230                $ialliance = &$tmpall;
231                $icorp = &$tmpcorp;
232
233                $i++;
234            }
235            else
236            {
237                preg_match("/Alliance: (.*)/", $involved[$i + 2], $matches);
238                $ianame = $matches[1];
239
240                preg_match("/Corp: (.*)/", $involved[$i + 3], $matches);
241                $icname = $matches[1];
242
243                preg_match("/Ship: (.*)/", $involved[$i + 4], $matches);
244                $isname = $matches[1];
245
246                preg_match("/Weapon: (.*)/", $involved[$i + 5], $matches);
247                $iwname = $matches[1];
248                $i += 6;
249
250                $ialliance = new Alliance();
251                $ialliance->add($ianame);
252                $icorp = new Corporation();
253                $icorp->add($icname, $ialliance, $kill->getTimeStamp());
254            }
255
256            $ipilot = new Pilot();
257            $ipilot->add($ipname, $icorp, $timestamp);
258
259            $iship = new Ship();
260            $iship->lookup($isname);
261            if (!$iship->getID())
262            {
263                $this->error('Ship not found.', $isname);
264            }
265            $iweapon = new Item();
266            $iweapon->lookup($iwname);
267            if (!$iweapon->getID())
268            {
269                $this->error('Weapon not found.', $iwname);
270            }
271
272            if (ALLIANCE_ID != 0 && $ialliance->getID() == ALLIANCE_ID)
273            {
274                $authorized = true;
275            }
276            elseif (CORP_ID != 0)
277            {
278                $corps = explode(",", CORP_ID);
279                foreach($corps as $corp)
280                {
281                    if ($icorp->getID() == $corp)
282                        $authorized = true;
283                }
284            }
285            if (!$authorized)
286            {
287                if ($string = $config->getConfig('post_permission'))
288                {
289                    if ($string == 'all')
290                    {
291                        $authorized = true;
292                    }
293                    else
294                    {
295                        $tmp = explode(',', $string);
296                        foreach ($tmp as $item)
297                        {
298                            if (!$item)
299                            {
300                                continue;
301                            }
302                            $typ = substr($item, 0, 1);
303                            $id = substr($item, 1);
304                            if ($typ == 'a')
305                            {
306                                if ($ialliance->getID() == $id || $kill->getVictimAllianceID() == $id)
307                                {
308                                    $authorized = true;
309                                    break;
310                                }
311                            }
312                            elseif ($typ == 'c')
313                            {
314                                if ($icorp->getID() == $id || $kill->getVictimCorpID() == $id)
315                                {
316                                    $authorized = true;
317                                    break;
318                                }
319                            }
320                            elseif ($typ == 'p')
321                            {
322                                if ($ipilot->getID() == $id || $kill->getVictimID() == $id)
323                                {
324                                    $authorized = true;
325                                    break;
326                                }
327                            }
328                        }
329                    }
330                }
331            }
332
333            $iparty = new InvolvedParty($ipilot->getID(), $icorp->getID(),
334                $ialliance->getID(), $secstatus, $iship, $iweapon);
335            $kill->addInvolvedParty($iparty);
336
337            if ($finalblow == 1)
338            {
339                $kill->setFBPilotID($ipilot->getID());
340                $kill->setFBCorpID($icorp->getID());
341                $kill->setFBAllianceID($ialliance->getID());
342            }
343        }
344
345        // destroyed items
346        $destroyedpos = strpos($this->killmail_, "Destroyed items:");
347
348        if ($destroyedpos > 0)
349        {
350            $destroyed = explode("\n", trim(substr($this->killmail_,
351                         strpos($this->killmail_, "Destroyed items:") + 16,
352                         strlen($this->killmail_) - (strpos($this->killmail_, "Destroyed items:") + 16))));
353
354            $i = 0;
355            while ($i < count($destroyed))
356            {
357                if ($destroyed[$i] == "")
358                {
359                    $i++;
360                    continue;
361                }
362
363                if ($destroyed[$i] == "Empty.")
364                {
365                    $container = false;
366                    $i++;
367                    continue;
368                }
369
370                $qtypos = 0;
371                $locpos = 0;
372                $itemname = "";
373                $quantity = "";
374                $location = "";
375
376                $qtypos = strpos($destroyed[$i], ", Qty: ");
377                $locpos = strpos($destroyed[$i], "(");
378
379                if ($container && $qtypos == false)
380                {
381                    $container = false;
382                }
383                if (strpos($destroyed[$i], "Container"))
384                {
385                    $container = true;
386                }
387                if ($qtypos <= 0 && !$locpos)
388                {
389                    $itemlen = strlen($destroyed[$i]);
390                    if ($container) $location = "Cargo";
391                }
392                if ($qtypos > 0 && !$locpos)
393                {
394                    $itemlen = $qtypos;
395                    $qtylen = strlen($destroyed[$i]) - $qtypos;
396                    if ($container) $location = "Cargo";
397                }
398                if ($locpos > 0 && $qtypos <= 0)
399                {
400                    $itemlen = $locpos - 1;
401                    $qtylen = 0;
402                    $loclen = strlen($destroyed[$i]) - $locpos - 2;
403                    if (!$locpos) $container = false;
404                }
405                if ($locpos > 0 && $qtypos > 0)
406                {
407                    $itemlen = $qtypos;
408                    $qtylen = $locpos - $qtypos - 7;
409                    $loclen = strlen($destroyed[$i]) - $locpos - 2;
410                    if (!$locpos) $container = false;
411                }
412
413                $itemname = substr($destroyed[$i], 0, $itemlen);
414                if ($qtypos) $quantity = substr($destroyed[$i], $qtypos + 6, $qtylen);
415                if ($locpos) $location = substr($destroyed[$i], $locpos + 1, $loclen);
416
417                if ($quantity == "")
418                {
419                    $quantity = 1;
420                }
421
422                $item = new Item();
423                $item->lookup(trim($itemname));
424                if (!$item->getID())
425                {
426                    $this->error('Item not found.', trim($itemname));
427                }
428                $ditem = new DestroyedItem($item, $quantity, $location);
429                $kill->addDestroyedItem($ditem);
430
431                $i++;
432            }
433        }
434
435        if (!$authorized)
436        {
437            return -2;
438        }
439        if ($this->getError())
440        {
441            return 0;
442        }
443
444        $id = $kill->add();
445        if ($id == -1)
446        {
447            $this->dupeid_ = $kill->dupeid_;
448        }
449
450        return $id;
451    }
452
453    function error($message, $debugtext = null)
454    {
455        $this->error_[] = array($message, $debugtext);
456    }
457
458    function getError()
459    {
460        if (count($this->error_))
461        {
462            return $this->error_;
463        }
464        return false;
465    }
466
467    function preparse($set)
468    {
469        if ($set == 'german')
470        {
471            $search = array('Ziel:','Allianz: nichts','Allianz:','Zerstört','Sicherheit:','Beteiligte Parteien:','Anz:');
472            $replace = array('Victim:','Alliance: None','Alliance:','Destroyed','Security:','Involved parties:', 'Qty:');
473            $this->killmail_ = str_replace($search, $replace, $this->killmail_);
474            return;
475        }
476    }
477}
478?>
Note: See TracBrowser for help on using the browser.