root/dev/common/includes/class.parser.php @ 232

Revision 232, 18.0 KB (checked in by ralle030583, 14 years ago)

-fix for Ticket #41
-added one missing ally logo (MolotovCoaliation?)
-dark red stlye added

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