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

Revision 174, 17.9 KB (checked in by exi, 14 years ago)

Added a prermr killmail preparser to the parser.
Changed item class so it doesnt break the mail when there is no item type for the item in the database.
Fixed 2 alliance logos.
Fixed kill_detail.tpl, the slot icons didnt use the imageurl.

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