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

Revision 3, 8.5 KB (checked in by andrewgunn, 15 years ago)

Added: Delete Killmail option in admin menu (common/admin_menu.php), and code to handle deletions of killmails (common/kill_delete.php).

Fixed: Added some code to fix a serious bug when the killboard tries to import a mail with a "final blow".

Note: All of these code sniplets were grabbed off the EVE-Online forums. So I take no credit for them, and no responsiblity if break something else.

Line 
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 )
12    {
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 */
20if ( strpos( $this->killmail_, "laid the final blow") < 1 ) {
21$this->needs_final_blow_ = 1;
22}
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 */
115if ( $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  }
273?>
Note: See TracBrowser for help on using the browser.