Changeset 37

Show
Ignore:
Timestamp:
10/26/06 14:09:45 (14 years ago)
Author:
exi
Message:

fixed a parser bug if you got a container in your cargo

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • dev/common/class.parser.php

    r3 r37  
    1 <? 
    2   require_once( "class.alliance.php" ); 
    3   require_once( "class.corp.php" ); 
    4   require_once( "class.pilot.php" ); 
    5   require_once( "class.kill.php" ); 
    6   require_once( "class.item.php" ); 
    7  
    8   class Parser 
    9   { 
    10  
    11     function Parser( $killmail ) 
     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) 
    1211    { 
    13       $this->killmail_ = trim( str_replace( "\r", "", $killmail ) ); 
    14  
    15       if ( strpos( $this->killmail_, "**** Truncated - mail is too large ****" ) > 0 ) { 
    16         $this->killmail_ = str_replace( "**** Truncated - mail is too large ****", "", $this->killmail_ ); 
    17       } 
    18  
    19 /* Parser fix, since some killmails don't have a final blow, they would break the KB */ 
    20 if ( strpos( $this->killmail_, "laid the final blow") < 1 ) { 
    21 $this->needs_final_blow_ = 1; 
     12        $this->killmail_ = trim(str_replace("\r", "", $killmail)); 
     13 
     14        if (strpos($this->killmail_, "**** Truncated - mail is too large ****") > 0) 
     15        { 
     16            $this->killmail_ = str_replace("**** Truncated - mail is too large ****", "", $this->killmail_); 
     17        } 
     18 
     19        /* Parser fix, since some killmails don't have a final blow, they would break the KB */ 
     20        if (strpos($this->killmail_, "laid the final blow") < 1) 
     21        { 
     22            $this->needs_final_blow_ = 1; 
     23        } 
     24        /* END FIX */ 
     25        // if ( strpos( $this->killmail_, "Empty." ) > 0 ) { 
     26        // $this->killmail_ = str_replace( "Empty.\n", "", $this->killmail_ ); 
     27        // } 
     28    } 
     29 
     30    function parse($checkauth = true) 
     31    { 
     32        // header 
     33        $involvedpos = strpos($this->killmail_, "Involved parties:"); 
     34 
     35        $header = substr($this->killmail_, 0, $involvedpos); 
     36        $timestamp = substr($header, 0, 16); 
     37        preg_match("/Victim: (.*)/", $header, $matches); 
     38        $victimname = trim($matches[1]); 
     39        preg_match("/Alliance: (.*)/", $header, $matches); 
     40        $alliancename = trim($matches[1]); 
     41        preg_match("/Corp: (.*)/", $header, $matches); 
     42        $corpname = trim($matches[1]); 
     43        preg_match("/Destroyed: (.*)/", $header, $matches); 
     44        $shipname = trim($matches[1]); 
     45        preg_match("/System: (.*)/", $header, $matches); 
     46        $systemname = trim($matches[1]); 
     47        preg_match("/Security: (.*)/", $header, $matches); 
     48        $systemsec = trim($matches[1]); 
     49 
     50        if (strlen($timestamp) < 1 || 
     51                strlen($alliancename) < 1 || 
     52                strlen($corpname) < 1 || 
     53                strlen($victimname) < 1 || 
     54                strlen($shipname) < 1 || 
     55                strlen($systemname) < 1 || 
     56                strlen($systemsec) < 1) 
     57            return 0; 
     58 
     59        if ($checkauth) 
     60            $authorized = false; 
     61        else 
     62            $authorized = true; 
     63        // populate/update database 
     64        $alliance = new Alliance(); 
     65        $alliance->add($alliancename); 
     66        $corp = new Corporation(); 
     67        $corp->add($corpname, $alliance, $timestamp); 
     68        $victim = new Pilot(); 
     69        $victim->add($victimname, $corp, $timestamp); 
     70        $system = new SolarSystem(); 
     71        $system->lookup($systemname); 
     72        $ship = new Ship(); 
     73        $ship->lookup($shipname); 
     74        $kill = new Kill(); 
     75        $kill->setTimeStamp($timestamp); 
     76        $kill->setVictimID($victim->getID()); 
     77        $kill->setVictimCorpID($corp->getID()); 
     78        $kill->setVictimAllianceID($alliance->getID()); 
     79        $kill->setVictimShip($ship); 
     80        $kill->setSolarSystem($system); 
     81 
     82        if (ALLIANCE_ID != 0 && $alliance->getID() == ALLIANCE_ID) 
     83            $authorized = true; 
     84        elseif (CORP_ID != 0) 
     85        { 
     86            $corps = explode(",", CORP_ID); 
     87            foreach($corps as $checkcorp) 
     88            { 
     89                if ($corp->getID() == $checkcorp) 
     90                    $authorized = true; 
     91            } 
     92        } 
     93        // involved 
     94        $end = strpos($this->killmail_, "Destroyed items:"); 
     95        if ($end == 0) $end = strlen($this->killmail_); 
     96        $involved = explode("\n", trim(substr($this->killmail_, strpos($this->killmail_, "Involved parties:") + 17, $end - (strpos($this->killmail_, "Involved parties:") + 17)))); 
     97 
     98        $i = 0; 
     99 
     100        $order = 0; 
     101        while ($i < count($involved)) 
     102        { 
     103            if ($involved[$i] == "") 
     104                $i++; 
     105 
     106            preg_match("/Name: (.*)/", $involved[$i], $matches); 
     107            $ipname = $matches[1]; 
     108            preg_match("/(.*) \(laid the final blow\)/", $ipname, $matches); 
     109            if ($matches[1]) 
     110            { 
     111                $ipname = $matches[1]; 
     112                $finalblow = 1; 
     113            } 
     114            else $finalblow = 0; 
     115 
     116            /* This is part of the final blow fix, mentioned above */ 
     117            if ($this->needs_final_blow_) 
     118            { 
     119                $finalblow = 1; 
     120                $this->needs_final_blow_ = 0; 
     121            } 
     122            /* END FIX */ 
     123 
     124            preg_match("/Security: (.*)/", $involved[$i + 1], $matches); 
     125            $secstatus = $matches[1]; 
     126 
     127            if ($secstatus == "") // NPC or POS 
     128                { 
     129                    $secstatus = "0.0"; 
     130                preg_match("/(.*) \/ (.*)/", $ipname, $pmatches); 
     131                $ipname = $pmatches[1]; 
     132                $icname = $pmatches[2]; 
     133                $isname = "Unknown"; 
     134                $iwname = $pmatches[1]; 
     135                $tmpcorp = new Corporation(); 
     136                $tmpcorp->lookup($icname); 
     137                $tmpall = $tmpcorp->getAlliance(); 
     138                if ($tmpcorp->getID()) 
     139                    $ianame = $tmpall->getName(); 
     140                else 
     141                    $ianame = "None"; 
     142 
     143                $i++; 
     144            } 
     145            else 
     146            { 
     147                preg_match("/Alliance: (.*)/", $involved[$i + 2], $matches); 
     148                $ianame = $matches[1]; 
     149 
     150                preg_match("/Corp: (.*)/", $involved[$i + 3], $matches); 
     151                $icname = $matches[1]; 
     152 
     153                preg_match("/Ship: (.*)/", $involved[$i + 4], $matches); 
     154                $isname = $matches[1]; 
     155 
     156                preg_match("/Weapon: (.*)/", $involved[$i + 5], $matches); 
     157                $iwname = $matches[1]; 
     158                $i += 6; 
     159            } 
     160 
     161            $ialliance = new Alliance(); 
     162            $ialliance->add($ianame); 
     163            $icorp = new Corporation(); 
     164            $icorp->add($icname, $ialliance, $kill->getTimeStamp()); 
     165 
     166            if (ALLIANCE_ID != 0 && $ialliance->getID() == ALLIANCE_ID) 
     167                $authorized = true; 
     168            elseif (CORP_ID != 0) 
     169            { 
     170                $corps = explode(",", CORP_ID); 
     171                foreach($corps as $corp) 
     172                { 
     173                    if ($icorp->getID() == $corp) 
     174                        $authorized = true; 
     175                } 
     176            } 
     177 
     178            $ipilot = new Pilot(); 
     179            $ipilot->add($ipname, $icorp, $timestamp); 
     180            $iship = new Ship(); 
     181            $iship->lookup($isname); 
     182            $iweapon = new Item(); 
     183            $iweapon->lookup($iwname); 
     184 
     185            $iparty = new InvolvedParty($ipilot->getID(), $icorp->getID(), 
     186                $ialliance->getID(), $secstatus, 
     187                $iship, $iweapon); 
     188            $kill->addInvolvedParty($iparty); 
     189 
     190            if ($finalblow == 1) 
     191            { 
     192                $kill->setFBPilotID($ipilot->getID()); 
     193                $kill->setFBCorpID($icorp->getID()); 
     194                $kill->setFBAllianceID($ialliance->getID()); 
     195            } 
     196        } 
     197        // destroyed items 
     198        $destroyedpos = strpos($this->killmail_, "Destroyed items:"); 
     199 
     200        if ($destroyedpos > 0) 
     201        { 
     202            $destroyed = explode("\n", trim(substr($this->killmail_, 
     203                        strpos($this->killmail_, "Destroyed items:") + 16, 
     204                        strlen($this->killmail_) - (strpos($this->killmail_, "Destroyed items:") + 16)))); 
     205 
     206            $i = 0; 
     207            while ($i < count($destroyed)) 
     208            { 
     209                if ($destroyed[$i] == "") 
     210                    $i++; 
     211 
     212                if ($destroyed[$i] == "Empty.") 
     213                { 
     214                    $container = false; 
     215                    $i++; 
     216                } 
     217 
     218                $qtypos = 0; 
     219                $locpos = 0; 
     220                $itemname = ""; 
     221                $quantity = ""; 
     222                $location = ""; 
     223                $container = false; 
     224 
     225                if (strpos($destroyed[$i], "Container") > 0 && 
     226                        strpos($destroyed[$i + 1], "(") <= 0 && 
     227                        strpos($destroyed[$i + 1], "Empty.") <= 0) 
     228                    $container = true; 
     229 
     230                $qtypos = strpos($destroyed[$i], ", Qty: "); 
     231                $locpos = strpos($destroyed[$i], "("); 
     232 
     233                if ($qtypos <= 0 && !$locpos) 
     234                { 
     235                    $itemlen = strlen($destroyed[$i]); 
     236                    if ($container) $location = "Cargo"; 
     237                } 
     238 
     239                if ($qtypos > 0 && !$locpos) 
     240                { 
     241                    $itemlen = $qtypos; 
     242                    $qtylen = strlen($destroyed[$i]) - $qtypos; 
     243                    if ($container) $location = "Cargo"; 
     244                } 
     245                if ($locpos > 0 && $qtypos <= 0) 
     246                { 
     247                    $itemlen = $locpos - 1; 
     248                    $qtylen = 0; 
     249                    $loclen = strlen($destroyed[$i]) - $locpos - 2; 
     250                    if (!$locpos) $container = false; 
     251                } 
     252                if ($locpos > 0 && $qtypos > 0) 
     253                { 
     254                    $itemlen = $qtypos; 
     255                    $qtylen = $locpos - $qtypos - 7; 
     256                    $loclen = strlen($destroyed[$i]) - $locpos - 2; 
     257                    if (!$locpos) $container = false; 
     258                } 
     259 
     260                $itemname = substr($destroyed[$i], 0, $itemlen); 
     261                if ($qtypos) $quantity = substr($destroyed[$i], $qtypos + 6, $qtylen); 
     262                if ($locpos) $location = substr($destroyed[$i], $locpos + 1, $loclen); 
     263 
     264                if ($quantity == "") 
     265                    $quantity = 1; 
     266                // echo $container." - ".$item." - ".$quantity." - ".$location."<br>"; 
     267                $item = new Item(); 
     268                $item->lookup(trim($itemname)); 
     269                $ditem = new DestroyedItem($item, $quantity, $location); 
     270                $kill->addDestroyedItem($ditem); 
     271 
     272                $i++; 
     273            } 
     274        } 
     275 
     276        if (!$authorized) 
     277            return -2; 
     278 
     279        $id = $kill->add(); 
     280        if ($id == -1) 
     281            $this->dupeid_ = $kill->dupeid_; 
     282 
     283        return $id; 
     284    } 
    22285} 
    23 /* END FIX */ 
    24  
    25 //      if ( strpos( $this->killmail_, "Empty." ) > 0 ) { 
    26 //        $this->killmail_ = str_replace( "Empty.\n", "", $this->killmail_ ); 
    27 //      } 
    28  
    29     } 
    30  
    31     function parse( $checkauth = true ) 
    32     { 
    33       // header 
    34       $involvedpos = strpos( $this->killmail_, "Involved parties:" ); 
    35  
    36       $header = substr( $this->killmail_, 0, $involvedpos ); 
    37       $timestamp = substr( $header, 0, 16 ); 
    38       preg_match( "/Victim: (.*)/", $header, $matches ); 
    39       $victimname = trim( $matches[1] ); 
    40       preg_match( "/Alliance: (.*)/", $header, $matches ); 
    41       $alliancename = trim( $matches[1] ); 
    42       preg_match( "/Corp: (.*)/", $header, $matches ); 
    43       $corpname = trim( $matches[1] ); 
    44       preg_match( "/Destroyed: (.*)/", $header, $matches ); 
    45       $shipname = trim( $matches[1] ); 
    46       preg_match( "/System: (.*)/", $header, $matches ); 
    47       $systemname = trim( $matches[1] ); 
    48       preg_match( "/Security: (.*)/", $header, $matches ); 
    49       $systemsec = trim( $matches[1] ); 
    50  
    51       if ( strlen( $timestamp ) < 1 ||  
    52            strlen( $alliancename ) < 1 ||  
    53            strlen( $corpname ) < 1 ||  
    54            strlen( $victimname ) < 1 ||  
    55            strlen( $shipname ) < 1 ||  
    56            strlen( $systemname ) < 1 ||  
    57            strlen( $systemsec ) < 1 ) 
    58         return 0; 
    59  
    60       if ( $checkauth ) 
    61         $authorized = false; 
    62       else 
    63         $authorized = true; 
    64  
    65       // populate/update database 
    66       $alliance = new Alliance(); 
    67       $alliance->add( $alliancename ); 
    68       $corp = new Corporation(); 
    69       $corp->add( $corpname, $alliance, $timestamp ); 
    70       $victim = new Pilot(); 
    71       $victim->add( $victimname, $corp, $timestamp ); 
    72       $system = new SolarSystem(); 
    73       $system->lookup( $systemname ); 
    74       $ship = new Ship(); 
    75       $ship->lookup( $shipname ); 
    76       $kill = new Kill(); 
    77       $kill->setTimeStamp( $timestamp ); 
    78       $kill->setVictimID( $victim->getID() ); 
    79       $kill->setVictimCorpID( $corp->getID() ); 
    80       $kill->setVictimAllianceID( $alliance->getID() ); 
    81       $kill->setVictimShip( $ship ); 
    82       $kill->setSolarSystem( $system ); 
    83  
    84       if ( ALLIANCE_ID != 0 && $alliance->getID() == ALLIANCE_ID ) 
    85         $authorized = true; 
    86       elseif ( CORP_ID != 0 ) { 
    87         $corps = explode( ",", CORP_ID ); 
    88         foreach( $corps as $checkcorp ) { 
    89           if ( $corp->getID() == $checkcorp ) 
    90             $authorized = true; 
    91         } 
    92       } 
    93  
    94       // involved 
    95       $end = strpos( $this->killmail_, "Destroyed items:" ); 
    96       if ( $end == 0 ) $end = strlen( $this->killmail_ ); 
    97       $involved = explode( "\n", trim( substr( $this->killmail_, strpos( $this->killmail_, "Involved parties:" ) + 17, $end  - ( strpos( $this->killmail_, "Involved parties:" ) + 17 ) )  ) ); 
    98  
    99       $i = 0; 
    100  
    101       $order = 0; 
    102       while ( $i < count( $involved ) ) { 
    103         if ( $involved[$i] == "" ) 
    104           $i++; 
    105  
    106         preg_match( "/Name: (.*)/", $involved[$i], $matches ); 
    107         $ipname = $matches[1]; 
    108         preg_match( "/(.*) \(laid the final blow\)/", $ipname, $matches ); 
    109         if ( $matches[1] ) { 
    110           $ipname = $matches[1]; 
    111           $finalblow = 1; 
    112         } else $finalblow = 0; 
    113  
    114 /* This is part of the final blow fix, mentioned above */ 
    115 if ( $this->needs_final_blow_ ) { 
    116 $finalblow = 1; 
    117 $this->needs_final_blow_ = 0; 
    118 } 
    119 /* END FIX */ 
    120  
    121         preg_match( "/Security: (.*)/", $involved[$i+1], $matches ); 
    122         $secstatus = $matches[1]; 
    123  
    124         if ( $secstatus == "" ) { // NPC or POS 
    125           $secstatus = "0.0"; 
    126           preg_match( "/(.*) \/ (.*)/", $ipname, $pmatches ); 
    127           $ipname = $pmatches[1]; 
    128           $icname = $pmatches[2]; 
    129           $isname = "Unknown"; 
    130           $iwname = $pmatches[1]; 
    131           $tmpcorp = new Corporation(); 
    132           $tmpcorp->lookup( $icname ); 
    133           $tmpall = $tmpcorp->getAlliance(); 
    134           if ( $tmpcorp->getID() ) 
    135             $ianame = $tmpall->getName(); 
    136           else 
    137             $ianame = "None"; 
    138  
    139           $i++; 
    140         } 
    141         else { 
    142           preg_match( "/Alliance: (.*)/", $involved[$i+2], $matches ); 
    143           $ianame = $matches[1]; 
    144  
    145           preg_match( "/Corp: (.*)/", $involved[$i+3], $matches ); 
    146           $icname = $matches[1]; 
    147  
    148           preg_match( "/Ship: (.*)/", $involved[$i+4], $matches ); 
    149           $isname = $matches[1]; 
    150  
    151           preg_match( "/Weapon: (.*)/", $involved[$i+5], $matches ); 
    152           $iwname = $matches[1]; 
    153           $i += 6; 
    154         } 
    155  
    156         $ialliance = new Alliance(); 
    157         $ialliance->add( $ianame ); 
    158         $icorp = new Corporation(); 
    159         $icorp->add( $icname, $ialliance, $kill->getTimeStamp() ); 
    160  
    161         if ( ALLIANCE_ID != 0 && $ialliance->getID() == ALLIANCE_ID ) 
    162           $authorized = true; 
    163         elseif ( CORP_ID != 0 ) { 
    164           $corps = explode( ",", CORP_ID ); 
    165           foreach( $corps as $corp ) { 
    166             if ( $icorp->getID() == $corp ) 
    167               $authorized = true; 
    168           } 
    169         } 
    170  
    171         $ipilot = new Pilot(); 
    172         $ipilot->add( $ipname, $icorp, $timestamp ); 
    173         $iship = new Ship(); 
    174         $iship->lookup( $isname ); 
    175         $iweapon = new Item(); 
    176         $iweapon->lookup( $iwname ); 
    177  
    178         $iparty = new InvolvedParty( $ipilot->getID(), $icorp->getID(), 
    179                                      $ialliance->getID(), $secstatus, 
    180                                      $iship, $iweapon ); 
    181         $kill->addInvolvedParty( $iparty ); 
    182          
    183         if ( $finalblow == 1 ) { 
    184           $kill->setFBPilotID( $ipilot->getID() ); 
    185           $kill->setFBCorpID( $icorp->getID() ); 
    186           $kill->setFBAllianceID( $ialliance->getID() ); 
    187         } 
    188       } 
    189  
    190       // destroyed items 
    191       $destroyedpos = strpos( $this->killmail_, "Destroyed items:" ); 
    192  
    193       if ( $destroyedpos > 0 ) { 
    194         $destroyed = explode( "\n", trim( substr( $this->killmail_,  
    195                               strpos( $this->killmail_, "Destroyed items:" ) + 16, 
    196                             strlen( $this->killmail_ )  - ( strpos( $this->killmail_, "Destroyed items:" ) + 16 ) )  ) ); 
    197  
    198         $i=0; 
    199         while ( $i < count( $destroyed ) ) { 
    200           if ( $destroyed[$i] == "" ) 
    201             $i++; 
    202  
    203           if ( $destroyed[$i] == "Empty." ) { 
    204             $container = false; 
    205             $i++; 
    206           } 
    207  
    208           $qtypos = 0; 
    209           $locpos = 0; 
    210           $itemname = ""; 
    211           $quantity = ""; 
    212           $location = ""; 
    213  
    214           if ( strpos( $destroyed[$i], "Container" ) > 0 && 
    215                strpos( $destroyed[$i+1], "(" ) <= 0 && 
    216                strpos( $destroyed[$i+1], "Empty." ) <= 0 ) 
    217             $container = true; 
    218  
    219           $qtypos = strpos( $destroyed[$i], ", Qty: " ); 
    220           $locpos = strpos( $destroyed[$i], "(" ); 
    221  
    222           if ( $qtypos <= 0 && !$locpos ) { 
    223             $itemlen = strlen( $destroyed[$i] ); 
    224             if ( $container ) $location = "Cargo"; 
    225           } 
    226  
    227           if ( $qtypos > 0 && !$locpos ) { 
    228             $itemlen = $qtypos; 
    229             $qtylen = strlen( $destroyed[$i] ) - $qtypos; 
    230             if ( $container ) $location = "Cargo"; 
    231           } 
    232           if ( $locpos > 0 && $qtypos <= 0 ) { 
    233             $itemlen = $locpos - 1; 
    234             $qtylen = 0; 
    235             $loclen = strlen( $destroyed[$i] ) - $locpos - 2; 
    236             if ( !$locpos ) $container = false; 
    237           } 
    238           if ( $locpos > 0 && $qtypos > 0 ) { 
    239             $itemlen = $qtypos; 
    240             $qtylen = $locpos - $qtypos - 7; 
    241             $loclen = strlen( $destroyed[$i] ) - $locpos - 2; 
    242             if ( !$locpos ) $container = false; 
    243           } 
    244  
    245           $itemname = substr( $destroyed[$i], 0, $itemlen ); 
    246           if ( $qtypos ) $quantity = substr( $destroyed[$i], $qtypos + 6, $qtylen ); 
    247           if ( $locpos ) $location = substr( $destroyed[$i], $locpos + 1, $loclen ); 
    248            
    249           if ( $quantity == "" ) 
    250             $quantity = 1; 
    251  
    252           //echo $container." - ".$item." - ".$quantity." - ".$location."<br>"; 
    253  
    254           $item = new Item(); 
    255           $item->lookup( trim( $itemname ) ); 
    256           $ditem = new DestroyedItem( $item, $quantity, $location ); 
    257           $kill->addDestroyedItem( $ditem ); 
    258  
    259           $i++; 
    260         } 
    261       }  
    262  
    263       if ( !$authorized ) 
    264         return -2; 
    265  
    266       $id = $kill->add(); 
    267       if ( $id == -1 ) 
    268         $this->dupeid_ = $kill->dupeid_; 
    269  
    270       return $id; 
    271     } 
    272   } 
    273286?>