root/dev/common/includes/class.eveapi.php @ 487

Revision 487, 154.9 KB (checked in by kovell, 11 years ago)

Fixes: date, alliance = None for killlist tables. Added: CCPDB update code from EDK3

RevLine 
[338]1<?php
2// Report all PHP errors (bitwise 63 may be used in PHP 3)
3@error_reporting(E_ALL ^ E_NOTICE);
[370]4define ("APIVERSION", "V3.3");
[338]5
6//
7// Eve-Dev API Killmail parser by Captain Thunk! (ISK donations are all gratefully received)
8//
[370]9
[338]10require_once( "common/includes/class.kill.php" );
11require_once( "common/includes/class.parser.php" );
12require_once('common/includes/class.pilot.php');
13require_once('common/includes/class.corp.php');
14require_once('common/includes/class.alliance.php');
15require_once( "common/includes/db.php" );
[370]16
17// Checks for configuration of files and folders
[431]18if (!file_exists("cache/api"))
[370]19{
20    if (!mkdir("cache/api", 0777))
21        {
22                // creating folder failed - spam something about that
23                echo "Failed to create folder 'cache/api' you should create the folder yourself and set chmod 777";
24        }
[431]25}
[370]26
[365]27// **********************************************************************************************************************************************
[370]28// ****************                                    API KillLog - /corp/Killlog.xml.aspx                                      ****************
[365]29// **********************************************************************************************************************************************
[338]30
[431]31class API_KillLog
[370]32{
[431]33    function Import($keystring, $typestring, $keyindex)
[370]34        {
[338]35                $this->mailcount_ = 0;
36                $this->ignoredmails_ = 0;
[370]37                $this->malformedmails_ = 0;
38                $this->verified_ = 0;
[365]39                $this->totalmails_ = 0;
[370]40                $this->errorcode_ = 0;
41                $this->Output_ = "";
42                $this->isContainer = false;
43                $this->hasdownloaded_ = false;
44                $this->errortext_ = "";
45                $this->CachedUntil_ = "";
[431]46
[338]47        // reduces strain on DB
[370]48                if(function_exists("set_time_limit"))
49                set_time_limit(0);
50
[338]51        $this->API_IgnoreFriendPos_ = config::get('API_IgnoreFriendPos');
52        $this->API_IgnoreEnemyPos_ = config::get('API_IgnoreEnemyPos');
53        $this->API_IgnoreNPC_ = config::get('API_IgnoreNPC');
54        $this->API_IgnoreCorpFF_ = config::get('API_IgnoreCorpFF');
55        $this->API_IgnoreAllianceFF_ = config::get('API_IgnoreAllianceFF');
56        $this->API_NoSpam_ = config::get('API_NoSpam');
[370]57                $this->API_CacheTime_ = ApiCache::get('API_CachedUntil_' . $keyindex);
[365]58                $this->API_UseCaching_ = config::get('API_UseCache');
[338]59        $this->keyindex_ = $keyindex;
[378]60
61
[370]62                // Initialise for error correcting and missing itemID resolution
63                $this->myIDName = new API_IDtoName();
64                $this->myNameID = new API_NametoID();
[431]65
[338]66        $lastdatakillid = 1;
67        $currentdatakillid = 0;
68
[365]69                // API Caching system, If we're still under cachetime reuse the last XML, if not download the new one. Helps with Bug hunting and just better all round.
70                if ($this->API_CacheTime_ == "")
71        {
72                $this->API_CacheTime = "2005-01-01 00:00:00"; // fake date to ensure that it runs first time.
73        }
[431]74
[370]75                if (is_file(getcwd().'/cache/api/'.config::get('API_Name_'.$keyindex).'_KillLog.xml'))
[365]76                        $cacheexists = true;
77                else
78                        $cacheexists = false;
[431]79
[370]80                // if API_UseCache = 1 (off) then don't use cache
81        if ((strtotime(gmdate("M d Y H:i:s")) - strtotime($this->API_CacheTime_) > 0) || ($this->API_UseCaching_ == 1)  || !$cacheexists )
[365]82        {
83            // Load new XML
[370]84                        $logsource = "New XML";
85                        $this->Output_ .= "<i>Downloading latest XML file for " . config::get('API_Name_'.$keyindex) . "</i><br><br>";
[365]86                        $data = '<myxml thunkage="1">';
87                do {
88                $data .= $this->loaddata($currentdatakillid, $keystring, $typestring);
89                $lastdatakillid = $currentdatakillid;
90                $currentdatakillid = $this->getlastkillid($data);
91                } while ( $lastdatakillid != $currentdatakillid );
[431]92                $data .= '</myxml>';
[338]93
[431]94                        if ( ( $this->API_UseCaching_ ) == 0 )//&& ( $this->iscronjob_ == false ) )
[365]95                        {
[370]96                                // save the file if no errors have occurred
97                                if ($this->errorcode_ == 0)
98                                {
99                                        $file = fopen(getcwd().'/cache/api/'.config::get('API_Name_'.$keyindex).'_KillLog.xml', 'w+');
100                                fwrite($file, $data);
101                                fclose($file);
102                                        //chmod the file so it can be altered by cronjobs in future
103                                        @chmod(getcwd().'/cache/api/'.config::get('API_Name_'.$keyindex).'_KillLog.xml',0666);
104                                }
[431]105                        }
106        } else {
[365]107            // re-use cached XML
[370]108                        $this->Output_ .= "<i>Using cached XML file for " . config::get('API_Name_'.$keyindex) . "</i><br><br>";
109                        $logsource = "Cache";
[431]110
[370]111                        if ($fp = @fopen(getcwd().'/cache/api/'.config::get('API_Name_'.$keyindex).'_KillLog.xml', 'r')) {
112                $data = fread($fp, filesize(getcwd().'/cache/api/'.config::get('API_Name_'.$keyindex).'_KillLog.xml'));
[365]113                        fclose($fp);
114                } else {
[431]115                                return "<i>error loading cached file ".config::get('API_Name_'.$keyindex)."_KillLog.xml</i><br><br>";
[365]116                }
117        }
[431]118
[338]119        $xml_parser = xml_parser_create();
120        xml_set_object ( $xml_parser, $this );
121        xml_set_element_handler($xml_parser, "startElement", "endElement");
122        xml_set_character_data_handler ( $xml_parser, 'characterData' );
123
124        if (!xml_parse($xml_parser, $data, true))
125            return $this->Output_ .= "<i>Error getting XML data from api.eve-online.com</i><br><br>";
126
[431]127        if ( strlen($data) == 28 )
[338]128            return $this->Output_ .= "<i>Error contacting api.eve-online.com</i><br><br>";
129
130        xml_parser_free($xml_parser);
131
[370]132        if ( ($this->hasdownloaded_ == false) && ($this->errortext_ != "") )
133                {
[365]134            $this->Output_ .= "<font color = \"#FF0000\">".$this->errortext_ . "</font><br>";
[370]135                        $logsource = "Error";
136                }
[338]137
138        if ($this->mailcount_)
[370]139            $this->Output_ .= "<div class=block-header2>".$this->mailcount_." kills, " . $this->malformedmails_ . " malformed, " . $this->ignoredmails_ . " ignored and " . $this->verified_ . " verified from feed: " . config::get('API_Name_'.$keyindex) . " which contained ".$this->totalmails_." mails.<br></div>";
[338]140        else
[370]141            $this->Output_ .= "<div class=block-header2>No kills added, ". $this->malformedmails_ . " malformed, " . $this->ignoredmails_." ignored and " . $this->verified_ . " verified from feed: " . config::get('API_Name_'.$keyindex) . " which contained ".$this->totalmails_." mails.<br></div>";
[431]142
[370]143                // Write to kb3_apilog
144                $qry = new DBQuery();
145                if ($this->iscronjob_)
146                        $logtype = "Cron Job";
147                else
148                        $logtype = "Manual";
[431]149
[370]150        $qry->execute( "insert into kb3_apilog  values( '" . KB_SITE . "', '"
151                                                                                                                . config::get('API_Name_'.$keyindex) . "',"
152                                                                                                                . $this->mailcount_ . ","
153                                                                                                                . $this->malformedmails_ . ","
154                                                                                                                . $this->ignoredmails_ . ","
155                                                                                                                . $this->verified_ . ","
156                                                                                                                . $this->totalmails_ . ",'"
157                                                                                                                . $logsource . "','"
158                                                                                                                . $logtype . "',now() )" );
[431]159
[338]160        return $this->Output_;
161
162    }
163
[431]164    function startElement($parser, $name, $attribs)
[338]165    {
166        if ($name == "ROWSET")
[431]167        {
[370]168                        //echo $this->rowsetCounter_ . " ";
169            if (($this->pname_ == "") && ($this->typeid_ != "0"))
[431]170            {
[370]171                                $this->isContainer = true;
172                                // this is to catch containers that spawn a new rowset so are missed off loot
[431]173                if ($this->qtydropped_ !=0)
[370]174                                {
[338]175                    // dropped items
176                    $this->droppeditems_['typeid'][] = $this->typeid_;
177                    $this->droppeditems_['qty'][] = $this->qtydropped_;
[370]178                    //if ($this->isContainer)
179                                        //{
180                                        //      $this->droppeditems_['flag'][] = -1;
181                                        //} else {
182                                                $this->droppeditems_['flag'][] = $this->itemFlag_;
183                                        //}
[431]184                }
185                if ($this->qtydestroyed_ != 0)
[370]186                                {
[338]187                    // destroyed items
188                    $this->destroyeditems_['typeid'][] =$this->typeid_;
189                    $this->destroyeditems_['qty'][] = $this->qtydestroyed_;
[370]190                   // if ($this->isContainer)
191                                        //{
192                                        //      $this->destroyeditems_['flag'][] = -1;
193                                        //} else {
194                                                $this->destroyeditems_['flag'][] = $this->itemFlag_;
195                                        //}
[338]196                }
197                $this->typeid_ = 0;
198                $this->itemFlag_ = 0;
[431]199                $this->qtydropped_ = 0;
[338]200                $this->qtydestroyed_ = 0;
201            }
[370]202                        // goes after so container itself doesn't count as "(in countainer)
[431]203
[338]204        }
205
[431]206        if (count($attribs))
[338]207        {
[431]208            foreach ($attribs as $k => $v)
[338]209                        {
[431]210                switch ($k)
[338]211                                {
212                    case "CHARACTERID":
213                        $this->charid_ = $v;
214                        break;
[431]215                    case "CHARACTERNAME":
[370]216                                                $this->pname_ = $v;
[431]217
[338]218                        break;
[431]219                                        case "CORPORATIONID":
[370]220                        $this->corporationID_ = $v;
221                                                break;
[431]222                    case "CORPORATIONNAME":
[370]223                                                $this->corporation_ = $v;
[431]224
[338]225                        break;
226                    case "ALLIANCEID":
[370]227                        $this->allianceID_ = $v;
[338]228                        break;
[431]229                    case "ALLIANCENAME":
[370]230                                                $this->alliance_ = $v;
[431]231
[370]232                                                if (strlen($this->alliance_) == 0)
233                                                        $this->alliance_ = "NONE";
234                        break;
[431]235                    case "DAMAGETAKEN":
[338]236                        $this->damagetaken_ = $v;
237                        break;
[431]238                    case "DAMAGEDONE":
[338]239                        $this->damagedone_ = $v;
240                        break;
[431]241                    case "SHIPTYPEID":
242                        if ($v == 0)
[338]243                                                {
244                            $this->shipname_ = "Unknown";
245                                                } else {
[365]246                            $this->shipname_ = gettypeIDname($v);
[338]247                        }
248                        break;
[431]249                    case "FINALBLOW":
250                        $this->finalblow_ = $v;
[338]251                        break;
[431]252                    case "SECURITYSTATUS":
[365]253                        //$this->security_ = $v;
254                                                $this->security_ = round($v,2); // allows number to pass with strict settings (number is usually much longer than 5 chars as defined in DB)
[338]255                        break;
[431]256                    case "WEAPONTYPEID":
[365]257                        $this->weapon_ = gettypeIDname($v);
[338]258                        break;
259                    // for items
[431]260                    case "TYPEID":
[365]261                        $this->typeid_ = gettypeIDname($v);
[431]262
[370]263                                                // Missing Item correction
264                                                if ($this->typeid_ == "")
265                                                {
266                                                        $this->myIDName->clear();
[431]267                                                        $this->myIDName->setIDs($v);
[370]268                                                        $this->Output_ .= $this->myIDName->fetchXML();
269                                                        $myNames = $this->myIDName->getIDData();
270                                                        //$this->typeid_ = "Item missing from DB: " . $myNames[0]['name'];
271                                                        $this->typeid_ = $myNames[0]['name'];
272                                                }
[338]273                        break;
[431]274                    case "FLAG":
[338]275                        $this->itemFlag_ = $v;
276                        break;
[431]277                    case "QTYDROPPED":
[338]278                        $this->qtydropped_ = $v;
279                        break;
[431]280                    case "QTYDESTROYED":
[338]281                        $this->qtydestroyed_ = $v;
282                        break;
283
284                    // for system/kill mail details (start of mail)
[431]285                    case "KILLID":
[338]286                        // print mail here - this will miss the last mail but it can be caught on exit. This weird way of doing things prevents falling foul
287                        // of the CCP API cargo bug - using function, avoids the repetition
[431]288                        if ($this->beforekillid_ != 0)
[338]289                        {
290                            $this->parseendofmail();
291                        }
[431]292                        $this->beforekillid_ = $v;
[365]293                                                $this->killid_ = $v; // added v2.6 for help tracing erroneous mails
294                                                $this->totalmails_++; // Count total number of mails in XML feed
[370]295                                                if ($this->isKillIDVerified($v) != null)
296                                                {
297                                                        $this->killmailExists_ = true;
298                                                        return;
299                                                } else {
300                                                        $this->killmailExists_ = false;
301                                                }
[338]302                        break;
303                    case "SOLARSYSTEMID": // convert to system name and fetch system security - DONE
304                        $sql = 'select sys.sys_name, sys.sys_sec from kb3_systems sys where sys.sys_eve_id = '.$v;
305
306                        $qry = new DBQuery();
307                        $qry->execute($sql);
308                        $row = $qry->getRow();
309
310                        $this->systemname_ = $row['sys_name'];
311                        $mysec = $row['sys_sec'];
312                        if ($mysec <= 0)
313                            $this->systemsecurity_ = number_format(0.0, 1);
314                        else
315                            $this->systemsecurity_ = number_format(round($mysec, 1), 1);
316                        break;
[365]317                    case "MOONID": // only given with POS related stuff - unanchored mods however, do not have a moonid.
[338]318                                                $this->moonid_ = $v;
[431]319
320                                                $this->moonname_ = getMoonName($v);
[370]321                                                // Missing Moon DB correction
322                                                if (($this->moonname_ == "") && ($this->moonid_ != 0))
323                                                {
324                                                        $this->myIDName->clear();
[431]325                                                        $this->myIDName->setIDs($v);
[370]326                                                        $this->Output_ .= $this->myIDName->fetchXML();
327                                                        $myNames = $this->myIDName->getIDData();
328                                                        //$this->typeid_ = "Item missing from DB: " . $myNames[0]['name'];
329                                                        $this->moonname_ = $myNames[0]['name'];
[431]330                                                }
[338]331                        break;
332                    case "KILLTIME": // Time Kill took place
333                        $this->killtime_ = $v;
334                        break;
[365]335                                        case "FACTIONID": // Faction ID
336                        $this->factionid_ = $v;
337                        break;
338                                        case "FACTIONNAME": // Faction Name
339                                                if ( $v == "" ) {
340                                                        $this->factionname_ = "NONE";
341                        } else {
342                                                        $this->factionname_ = $v;
343                                                }
344                        break;
[370]345                                        case "CODE": // error code
346                                                $this->errorcode_ .= $v;
347                                                break;
[338]348                }
349            }
350        }
351    }
352
[431]353    function endElement($parser, $name)
[338]354    {
[431]355        switch ($name)
[338]356        {
[370]357                        case "ROWSET":
358                                $this->isContainer = false;
359                                break;
[338]360            case "VICTIM":
361                $this->hasdownloaded_ = true;
362                // if no name is given and moonid != 0 then replace name with corp name for parsing - would lookup the moonid but we don't have that in database - replace shipname as "Unknown" this allows parsing to complete
363                if ($this->moonid_ != 0 && $this->pname_ == "")
364                {
365                    $this->pname_ = $this->moonname_;
366                    //$this->shipname_ = "Unknown"; // this is done else mail will not parse
367                    $this->isposkill_ = true;
[487]368                } elseif (($this->moonid_ == 0) && ($this->pname_ == "") && ($this->charid_ == 0)) {
[365]369                                        // catches unanchored POS modules - as moon is unknown, we will use system name instead
370                                        $this->pname_ = $this->systemname_;
371                    $this->isposkill_ = true;
372                                } else {
[338]373                    $this->isposkill_ = false;
374                }
375                // print victim header
376                $this->killmail_ = substr(str_replace('-', '.' , $this->killtime_), 0, 16) . "\r\n\r\n";
[365]377                                if ($this->isposkill_ == false )
378                        $this->killmail_ .= "Victim: ".$this->pname_ . "\r\n"; // This line would not appear on a POS mail
379                                $this->killmail_ .= "Corp: ".$this->corporation_ . "\r\n";
[338]380                $this->killmail_ .= "Alliance: ".$this->alliance_ . "\r\n";
[365]381                                $this->killmail_ .= "Faction: ".$this->factionname_ . "\r\n";
[338]382                $this->killmail_ .= "Destroyed: ".$this->shipname_ . "\r\n";
[365]383                                if ($this->isposkill_ == true )
384                                        $this->killmail_ .= "Moon: ".$this->moonname_ . "\r\n"; // This line does appear on a POS mail
[338]385                $this->killmail_ .= "System: ".$this->systemname_ . "\r\n";
386                $this->killmail_ .= "Security: ".$this->systemsecurity_ . "\r\n";
387                $this->killmail_ .= "Damage Taken: ".$this->damagetaken_ . "\r\n\r\n";
388                $this->killmail_ .= "Involved parties:\r\n\r\n";
389
390                if ( config::get('API_Update') == 0 )
[431]391                {
[370]392                                        // update Victim portrait while we're here
[338]393                    $sql = 'select plts.plt_id, plts.plt_externalid from kb3_pilots plts where plts.plt_name = "' . $this->pname_ . '"';
394
[370]395                                        $qry = new DBQuery();
[338]396                    $qry->execute($sql);
397                    $row = $qry->getRow();
398                    if ($qry->recordCount() != 0)
399                    {
400                        $pilot_id = $row['plt_id'];
401                        $pilot_external_id = $row['plt_externalid'];
402
403                        if ( $pilot_external_id == 0 && $pilot_id != 0)
[431]404                        {
[370]405                                                        // update DB with ID
[338]406                            $qry->execute("update kb3_pilots set plt_externalid = " . intval($this->charid_) . "
407                                            where plt_id = " . $pilot_id);
[431]408                        }
[338]409                    }
410                }
[431]411
[370]412                                // update crp_external_id
413                                Update_CorpID($this->corporation_, $this->corporationID_);
414                                // update all_external_id
415                                if ($this->allianceID_ != 0)
416                                        Update_AllianceID($this->alliance_, $this->allianceID_);
[431]417
[338]418                // set victim corp and alliance for FF check
419                $this->valliance_ = $this->alliance_;
420                $this->vcorp_ = $this->corporation_;
421
422                // now clear these
423                //$this->killtime_ = "";
424                $this->pname_ = "";
425                $this->alliance_ = "";
[365]426                                $this->factionname_ = "";
[338]427                $this->corporation_ = "";
428                $this->destroyed_ = 0;
429                $this->systemname_ = "";
430                $this->systemsecurity_ = 0;
431                $this->damagetaken_ = 0;
432                $this->charid_ = 0;
[365]433                                $this->moonid_ = 0;
434                                $this->mooname_ = 0;
[370]435                                $this->corporationID_ = 0;
436                                $this->allianceID_ = 0;
[338]437                break;
438            case "ROW":
[370]439                if ( $this->typeid_ != "0" )
[431]440                {
[370]441                                        // it's cargo
[431]442                    if ($this->qtydropped_ !=0)
[338]443                    {
444                        // dropped items
445                        $this->droppeditems_['typeid'][] = $this->typeid_;
446                        $this->droppeditems_['qty'][] = $this->qtydropped_;
[370]447                                                if ($this->isContainer)
448                                                {
449                                                        $this->droppeditems_['flag'][] = -1;
450                                                } else {
451                                                        $this->droppeditems_['flag'][] = $this->itemFlag_;
452                                                }
[431]453                                        }
[338]454                    if ($this->qtydestroyed_ != 0)
455                    {
456                    // destroyed items
457                        $this->destroyeditems_['typeid'][] = $this->typeid_;
458                        $this->destroyeditems_['qty'][] = $this->qtydestroyed_;
[370]459                        if ($this->isContainer)
460                                                {
461                                                        $this->destroyeditems_['flag'][] = -1;
462                                                } else {
463                                                        $this->destroyeditems_['flag'][] = $this->itemFlag_;
464                                                }
[338]465                    }
466                    $this->typeid_ = 0;
467                    $this->itemFlag_ = 0;
[431]468                    $this->qtydropped_ = 0;
[338]469                    $this->qtydestroyed_ = 0;
[431]470                }
[370]471                                // using corporation_ not pname_ as NPCs don't have a name *** CHANGED to corporationID 16/03/2009 to catch 'sleeper' NPCs
[431]472                if ($this->corporationID_ != 0)
473                {
[370]474                                        // it's an attacker
[338]475                    $this->attackerslist_['name'][] = $this->pname_;
476                    $this->attackerslist_['finalblow'][] = $this->finalblow_;
477                    $this->attackerslist_['security'][] = $this->security_;
[365]478                                        $this->attackerslist_['corporation'][] = $this->corporation_;
[338]479                    $this->attackerslist_['alliance'][] = $this->alliance_;
[365]480                    $this->attackerslist_['faction'][] = $this->factionname_;
[431]481                    $this->attackerslist_['shiptypeid'][] = $this->shipname_;
482                    $this->attackerslist_['weapon'][] = $this->weapon_;
[338]483                    $this->attackerslist_['damagedone'][] = $this->damagedone_;
484
485                    if ( config::get('API_Update') == 0 )
[431]486                    {
[370]487                                                // update Attacker portrait while we're here
[338]488                        $sql = 'select plts.plt_id, plts.plt_externalid from kb3_pilots plts where plts.plt_name = "' . $this->pname_ . '"';
489
490                        $qry = new DBQuery();
491                        $qry->execute($sql);
492                        $row = $qry->getRow();
493                        if ($qry->recordCount() != 0)
[431]494                        {
[338]495                            $pilot_id = $row['plt_id'];
496                            $pilot_external_id = $row['plt_externalid'];
497
498                            if ( $pilot_external_id == 0 && $pilot_id != 0 )
[431]499                            {
[370]500                                                                // update DB with ID
[338]501                                $qry->execute("update kb3_pilots set plt_externalid = " . intval($this->charid_) . "
502                                                where plt_id = " . $pilot_id);
503                            }
504                        }
505                    }
[431]506
[370]507                                        // update crp_external_id
508                                        Update_CorpID($this->corporation_, $this->corporationID_);
509                                        // update all_external_id
510                                        if ($this->allianceID_ != 0)
511                                                Update_AllianceID($this->alliance_, $this->allianceID_);
[431]512
[338]513                    $this->pname_ = "";
514                    $this->finalblow_ = 0;
515                    $this->security_ = 0;
516                    $this->alliance_ = "";
[365]517                                        $this->factionname_ = "";
[338]518                    $this->corporation_ = "";
519                    $this->shipname_ = 0;
520                    $this->weapon_ = 0;
521                    $this->damagedone_ = 0;
522                    $this->charid_ = 0;
[370]523                                        $this->corporationID_ = 0;
524                                        $this->allianceID_ = 0;
[338]525                }
526                break;
527            case "RESULT":
528                // reset beforekillid to allow processing of more chunks of data I've placed into $data
529                $this->beforekillid_ = 0;
530
531                // does last killmail
[431]532                if ($this->hasdownloaded_)
533                                {
[370]534                                        // catch to prevent processing without any mails
[338]535                    $this->parseendofmail();
536                }
537                break;
538            case "MYXML":
539                // end of data xml, process cachedtime here
[370]540                //$ApiCache->set('API_CachedUntil_' . $this->keyindex_, $this->cachetext_);
[431]541                break;
[370]542                        case "ERROR": //  Error Message
543                                if ($this->errortext_ == "")
544                                {
545                                        $this->errortext_ .= $this->characterDataValue;
546                                }
547                                break;
548                        case "CURRENTTIME":
549                                $this->CurrentTime_ = $this->characterDataValue;
550                                break;
551                        case "CACHEDUNTIL":
552                                // kill log can be several xml sheets stuck together, we only want the first CachedUntil_
553                                if ($this->CachedUntil_ == "")
554                                {
555                                        // Do not save cache key if this is an error sheet
556                                        $this->CachedUntil_ = $this->characterDataValue;
557                                        ApiCache::set('API_CachedUntil_' . $this->keyindex_, $this->CachedUntil_);
558                                }
559                                break;
[338]560        }
561    }
562
[431]563    function characterData($parser, $data)
[338]564    {
[370]565                $this->characterDataValue = $data;
[338]566    }
567
568    function parseendofmail()
569    {
[431]570            // print attacks
[370]571                $attackercounter = count($this->attackerslist_['name']);
572        // sort array into descending damage
[431]573        if ($attackercounter != 0 )
[338]574        {
[370]575                array_multisort($this->attackerslist_['damagedone'], SORT_NUMERIC, SORT_DESC,
[338]576                $this->attackerslist_['name'], SORT_ASC, SORT_STRING,
577                $this->attackerslist_['finalblow'], SORT_NUMERIC, SORT_DESC,
578                $this->attackerslist_['security'], SORT_NUMERIC, SORT_DESC,
[365]579                                $this->attackerslist_['corporation'], SORT_ASC, SORT_STRING,
[338]580                $this->attackerslist_['alliance'], SORT_ASC, SORT_STRING,
[365]581                $this->attackerslist_['faction'], SORT_ASC, SORT_STRING,
[338]582                $this->attackerslist_['shiptypeid'], SORT_ASC, SORT_STRING,
583                $this->attackerslist_['weapon'], SORT_ASC, SORT_STRING );
584        }
585
[431]586        // Initialise some flags to use
[338]587        $hasplayersonmail = false;
588        $this->corpFF_ = true;
589        $this->allianceFF_ = true;
590        $poswasfriendly = false;
[431]591
[338]592        // catch for victim being in no alliance
[365]593        if ($this->valliance_ == "NONE")
[370]594                $this->allianceFF_ = false;
[338]595
[431]596        for ($attackerx = 0; $attackerx < $attackercounter; $attackerx++)
[338]597        {
[370]598                // if NPC (name will be "") then set pname_ as corporation_ for mail parsing
599                if  ($this->attackerslist_['name'][$attackerx] == "")
600                {
601                                // fix for Sleepers ("Unknown")
602                                if ($this->attackerslist_['corporation'][$attackerx] == "")
603                                {
604                                        $npccorpname = "Unknown";
605                                } else {
606                                        $npccorpname = $this->attackerslist_['corporation'][$attackerx];
607                                }
608                $this->killmail_ .= "Name: ".$this->attackerslist_['shiptypeid'][$attackerx] ." / ".$npccorpname."\r\n";
[338]609                $this->killmail_ .= "Damage Done: ".$this->attackerslist_['damagedone'][$attackerx]."\r\n";
610                $this->corpFF_ = false;
611                $this->allianceFF_ = false;
612            } else {
[431]613                $hasplayersonmail = true;
[338]614                $this->killmail_ .= "Name: ".$this->attackerslist_['name'][$attackerx];
615                if ($this->attackerslist_['finalblow'][$attackerx] == 1)
616                {
617                    $this->killmail_ .= " (laid the final blow)";
618                }
619                $this->killmail_ .= "\r\n";
620
621                $this->killmail_ .= "Security: ".$this->attackerslist_['security'][$attackerx]."\r\n";
[365]622                                $this->killmail_ .= "Corp: ".$this->attackerslist_['corporation'][$attackerx]."\r\n";
[338]623                $this->killmail_ .= "Alliance: ".$this->attackerslist_['alliance'][$attackerx]."\r\n";
[365]624                $this->killmail_ .= "Faction: ".$this->attackerslist_['faction'][$attackerx]."\r\n";
[431]625                $this->killmail_ .= "Ship: ".$this->attackerslist_['shiptypeid'][$attackerx]."\r\n";
626                $this->killmail_ .= "Weapon: ".$this->attackerslist_['weapon'][$attackerx]."\r\n";
[338]627                $this->killmail_ .= "Damage Done: ".$this->attackerslist_['damagedone'][$attackerx]."\r\n";
628
629                // set Friendly Fire matches
630                if ($this->attackerslist_['alliance'][$attackerx] != $this->valliance_)
[370]631                        $this->allianceFF_ = false;
[338]632                if ($this->attackerslist_['corporation'][$attackerx] != $this->vcorp_)
[431]633                        $this->corpFF_ = false;
[338]634            }
635            $this->killmail_ .= "\r\n";
636        } //end for next loop
[431]637
[338]638        // clear attackerslist
639        $this->attackerslist_ = array();
640
[431]641        if (count($this->destroyeditems_['qty']) != 0)
[338]642        {
643            $this->killmail_ .= "\r\nDestroyed items:\r\n\r\n";
644
645            $counter = count($this->destroyeditems_['qty']);
[431]646            for ($x = 0; $x < $counter; $x++)
[338]647            {
648                if ($this->destroyeditems_['qty'][$x] > 1)
[431]649                {
[370]650                                        // show quantity
651                        $this->killmail_ .= $this->destroyeditems_['typeid'][$x].", Qty: ".$this->destroyeditems_['qty'][$x];
[431]652                } else {
[370]653                                        // just the one
654                        $this->killmail_ .= $this->destroyeditems_['typeid'][$x];
[338]655                }
[431]656
[370]657                if ($this->destroyeditems_['flag'][$x] == 5) {
658                        $this->killmail_ .= " (Cargo)";
659                } elseif ($this->destroyeditems_['flag'][$x] == 87) {
660                        $this->killmail_ .= " (Drone Bay)";
[431]661                }  elseif ($this->destroyeditems_['flag'][$x] == -1)
[370]662                                {
663                                        $this->killmail_ .= " (In Container)";
664                                }
[338]665                $this->killmail_ .= "\r\n";
666            }
[431]667        }
[338]668
[431]669        if (count($this->droppeditems_['qty']) != 0)
[338]670        {
671            $this->killmail_ .= "\r\nDropped items:\r\n\r\n";
672
673            $counter = count($this->droppeditems_['qty']);
[431]674            for ($x = 0; $x < $counter; $x++)
[338]675            {
[370]676                if ($this->droppeditems_['qty'][$x] > 1)
[431]677                {
[370]678                                        // show quantity
679                    $this->killmail_ .= $this->droppeditems_['typeid'][$x].", Qty: ".$this->droppeditems_['qty'][$x];
[431]680                } else {
[370]681                                        // just the one
682                    $this->killmail_ .= $this->droppeditems_['typeid'][$x];
683                }
[338]684
[431]685                if ($this->droppeditems_['flag'][$x] == 5)
[370]686                {
687                        $this->killmail_ .= " (Cargo)";
[431]688                } elseif ($this->droppeditems_['flag'][$x] == 87)
[338]689                {
[370]690                        $this->killmail_ .= " (Drone Bay)";
[431]691                } elseif ($this->droppeditems_['flag'][$x] == -1)
[370]692                                {
693                                        $this->killmail_ .= " (In Container)";
694                                }
[338]695                $this->killmail_ .= "\r\n";
696            }
697        }
698
699        // If ignoring friendly POS Structures
700        if ($this->isposkill_) {
701        // is board an alliance board?
[370]702                if ( ALLIANCE_ID == 0)
[431]703            {
[370]704                                // no it's set as a corp
[338]705                $thiscorp = new Corporation(CORP_ID);
706                if ( $this->vcorp_ == $thiscorp->getName() )
[370]707                        $poswasfriendly = true;
[431]708            } else {
[370]709                                // yes it's an Alliance board
710                $thisalliance = new Alliance(ALLIANCE_ID);
[338]711                if ( $this->valliance_ == $thisalliance->getName() )
712                    $poswasfriendly = true;
713            }
714        }
715
[431]716        if ( ( $this->API_IgnoreFriendPos_ == 0 ) &&  ( $poswasfriendly ) &&  ( $this->isposkill_ ) )
[338]717        {
[431]718                if ( ( $this->API_NoSpam_ == 0 ) && ( $this->iscronjob_ ) )
[370]719                {
720                // do not write to $this->Output_
[338]721            } else {
[370]722                $this->Output_ .= "Killmail ID:".$this->killid_." containing friendly POS structure has been ignored.<br>";
[338]723            }
724            $this->ignoredmails_++;
[431]725        } elseif ( ( $this->API_IgnoreEnemyPos_ == 0 ) &&  ( !$poswasfriendly ) &&  ( $this->isposkill_ ) )
[338]726        {
[431]727                if ( ( $this->API_NoSpam_ == 0 ) && ( $this->iscronjob_ ) )
[338]728            {
729                // do not write to $this->Output_
730            } else {
[365]731                $this->Output_ .= "Killmail ID:".$this->killid_." containing enemy POS structure been ignored.<br>";
[338]732            }
733            $this->ignoredmails_++;
[431]734        } elseif ( ( $this->API_IgnoreNPC_ == 0 ) && ($hasplayersonmail == false) )
[338]735        {
736            if ( ( $this->API_NoSpam_ == 0 ) && ( $this->iscronjob_ ) )
737            {
738                // do not write to $this->Output_
739            } else {
[365]740                $this->Output_ .= "Killmail ID:".$this->killid_." containing only NPCs has been ignored.<br>";
[338]741            }
742            $this->ignoredmails_++;
[431]743        } elseif ( ( $this->API_IgnoreCorpFF_ == 0 ) && ($this->corpFF_ == true ) )
[338]744        {
[431]745            if ( ( $this->API_NoSpam_ == 0 ) && ( $this->iscronjob_ ) )
[338]746            {
[370]747                // do not write to $this->Output_
748                } else {
749                $this->Output_ .= "Killmail ID:".$this->killid_." containing corporation friendly fire has been ignored.<br>";
[338]750            }
751            $this->ignoredmails_++;
[431]752        } elseif ( ( $this->API_IgnoreAllianceFF_ == 0 ) && ($this->allianceFF_ == true ) )
[338]753        {
[431]754            if ( ( $this->API_NoSpam_ == 0 ) && ( $this->iscronjob_) )
[338]755            {
[370]756                 // do not write to $this->Output_
[338]757            } else {
[365]758                $this->Output_ .= "Killmail ID:".$this->killid_." containing alliance friendly fire has been ignored.<br>";
[338]759            }
760            $this->ignoredmails_++;
761        } else {
762            $this->postimportmail();
[431]763        }
[338]764
765        // clear destroyed/dropped arrays
766        unset($this->destroyeditems_ );
767        unset($this->droppeditems_);
768    }
769
770    function postimportmail()
771    {
[431]772        if ( ( isset( $this->killmail_ ) ) && ( !$this->killmailExists_ ) )
[338]773        {
774            $parser = new Parser( $this->killmail_ );
[370]775            //$killid = $parser->parse( true );
[431]776
[370]777                        if (config::get('filter_apply'))
778                {
779                $filterdate = config::get('filter_date');
780                $year = substr($this->killmail_, 0, 4);
781                $month = substr($this->killmail_, 5, 2);
782                $day = substr($this->killmail_, 8, 2);
783                        $killstamp = mktime(0, 0, 0, $month, $day, $year);
784                if ($killstamp < $filterdate)
785                {
786                        $killid = -3;
787                }
788                else
789                {
790                        $killid = $parser->parse(true);
791                }
792                } else {
793                $killid = $parser->parse(true);
794                }
[338]795
[431]796            if ( $killid == 0 || $killid == -1 || $killid == -2 || $killid == -3 )
[338]797            {
798                if ( $killid == 0 )
799                {
[365]800                    $this->Output_ .= "Killmail ID:".$this->killid_." is malformed.<br>";
[370]801                                        $this->malformedmails_++;
[431]802
[338]803                    if ($errors = $parser->getError())
804                    {
805                        foreach ($errors as $error)
806                        {
807                            $this->Output_ .= 'Error: '.$error[0];
808                            if ($error[1])
809                            {
[370]810                                $this->Output_ .= ' The text lead to this error was: "'.$error[1].'"<br>';
[338]811                            }
812                        }
[431]813
[370]814                                                //if ( $this->iscronjob_ )
815                                                //{
816                                                //      $this->Output_ .= $this->killmail_; // experimental - output the killmail as the API Parser understood it
817                                                //} else {
818                                                //      $this->Output_ .= str_replace("\r\n", "<br>", $this->killmail_);
819                                                //}
820                                                $this->Output_ .= '<br/>';
[338]821                    }
822                }
[370]823                                if ($killid == -3)
824                {
825                        $filterdate = kbdate("j F Y", config::get("filter_date"));
826                        //$html = "Killmail older than $filterdate ignored.";
827                                        $this->Output_ .= "Killmail ID:".$this->killid_. " has been ignored as mails before $filterdate are restricted.<br>";
828                                        $this->ignoredmails_++;
829                }
[431]830
[338]831                if ( $killid == -2 )
[370]832                                {
[365]833                    $this->Output_ .= "Killmail ID:".$this->killid_. " is not related to ".KB_TITLE.".<br>";
[370]834                                        $this->ignoredmails_++;
835                }
836                                // Killmail exists - as we're here and the mail was posted, it is not a verified mail, so verify it now.
[338]837                if ( $killid == -1 )
838                {
[431]839                    if ( ( $this->API_NoSpam_ == 0 ) && ( $this->iscronjob_ ) )
[338]840                    {
841                    // do not write to $this->Output_
842                    } else {
[431]843                        // $this->Output_ .= "Killmail already exists <a href=\"?a=kill_detail&kll_id=".$parser->dupeid_."\">here</a>.<br>";
[370]844                                                // write API KillID to kb3_kills killID column row $parser->dupeid_
845                                                $this->VerifyKill($this->killid_, $parser->dupeid_);
846                                                $this->verified_++;
[338]847                    }
[431]848                }
[338]849            } else {
850                $qry = new DBQuery();
[370]851                $qry->execute( "insert into kb3_log     values( ".$killid.", '".KB_SITE."','API ".APIVERSION."',now() )" );
[431]852                $this->Output_ .= "API Killmail ID:".$this->killid_. " successfully imported <a href=\"?a=kill_detail&kll_id=".$killid."\">here</a> as KB ID:". $killid ."<br>";
853
[370]854                                // Now place killID (API) into killboard row $killid
855                                $this->VerifyKill($this->killid_, $killid);
[431]856
[370]857                                // mail forward
858                                event::call('killmail_imported', $this);
[338]859
[370]860                                // For testing purposes
861                                //$this->Output_ .= str_replace("\r\n", "<br>", $this->killmail_);
[431]862
863                                if ( file_exists("common/includes/class.comments.php") )
[370]864                                        require_once( "common/includes/class.comments.php" );
[338]865                if (class_exists('Comments') && config::get('API_Comment')) { // for the Eve-Dev Comment Class
866                    $comments = new Comments($killid);
[370]867                    $comments->addComment("Captain Thunks API " . APIVERSION, config::get('API_Comment'));
[338]868                }
869                $this->mailcount_++;
870            }
871        }
872    }
873
874    function loaddata($refid, $keystring, $typestring)
875    {
876        $url = "http://api.eve-online.com/" . $typestring . "/KillLog.xml.aspx";
877
878        if ($refid != 0)
879            $keystring .= '&beforeKillID=' . $refid;
880
881        $path = '/' . $typestring . '/Killlog.xml.aspx';
882        $fp = fsockopen("api.eve-online.com", 80);
883
884        if (!$fp)
885        {
886            $this->Output_ .= "Could not connect to API URL";
887        } else {
888            // request the xml
889            fputs ($fp, "POST " . $path . " HTTP/1.0\r\n");
890            fputs ($fp, "Host: api.eve-online.com\r\n");
891            fputs ($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
892            fputs ($fp, "User-Agent: PHPApi\r\n");
893            fputs ($fp, "Content-Length: " . strlen($keystring) . "\r\n");
894            fputs ($fp, "Connection: close\r\n\r\n");
895            fputs ($fp, $keystring."\r\n");
896
897            // retrieve contents
898            $contents = "";
899            while (!feof($fp))
900            {
901                $contents .= fgets($fp);
902            }
903
904            // close connection
905            fclose($fp);
906
907            $start = strpos($contents, "?>");
908            if ($start !== FALSE)
909            {
910                $contents = substr($contents, $start + strlen("\r\n\r\n"));
911            }
[431]912        }
[338]913        return $contents;
914    }
915
[431]916    function mystrripos($haystack, $needle, $offset=0)
[338]917    {
918        if($offset<0)
919        {
920            $temp_cut = strrev(  substr( $haystack, 0, abs($offset) )  );
921        } else {
922            $temp_cut = strrev(  substr( $haystack, $offset )  );
923        }
924        $pos = strlen($haystack) - (strpos($temp_cut, strrev($needle)) + $offset + strlen($needle));
925        if ($pos == strlen($haystack)) { $pos = 0; }
926
927        if(strpos($temp_cut, strrev($needle))===false)
928        {
929            return false;
930        } else return $pos;
931    }
932
933    function getlastkillid($data)
934    {
935        $mylastkillid = 0;
936        $startpoint = intval;
937        $endpoint = intval;
938
939        $startpoint = $this->mystrripos($data, 'row killID="');
940        if ( $startpoint != "0" )
941        {
942            $startpoint = $startpoint + 12;
943            $endpoint = strpos($data, '"', $startpoint);
944            $mylength = $endpoint-$startpoint;
945            $mylastkillid = substr($data, $startpoint, $mylength);
946        }
947        return $mylastkillid;
948    }
949
950    function getAllianceName($v)
951    {
952        $alliancenamereturn = "";
953
954        $counter = count($this->alliancearray_['Name']);
[431]955        for ($x = 0; $x < $counter; $x++)
[338]956        {
957            if ($this->alliancearray_['allianceID'][$x] == $v)
958                $alliancenamereturn = $this->alliancearray_['Name'][$x];
959        }
960
961        return $alliancenamereturn;
962    }
[431]963
[370]964        function VerifyKill($killid, $mailid)
965        {
966                $qry = new DBQuery();
967        $qry->execute( "UPDATE `kb3_kills` SET `kll_external_id` = '" . $killid . "' WHERE `kb3_kills`.`kll_id` =" . $mailid . " LIMIT 1" );
968        }
[431]969
[370]970        function isKillIDVerified($killid)
971        {
972                $qry = new DBQuery();
973        $qry->execute( "SELECT * FROM `kb3_kills` WHERE `kll_external_id` =" . $killid );
974                $row = $qry->getRow();
975                return $row['kll_external_id'];
976        }
[338]977}
978
[365]979// **********************************************************************************************************************************************
980// ****************                                   API Char list - /account/Characters.xml.aspx                               ****************
981// **********************************************************************************************************************************************
982
[431]983class APIChar
[338]984{
[431]985    function fetchChars($apistring)
[338]986    {
987        $data = $this->loaddata($apistring);
988
989        $xml_parser = xml_parser_create();
990        xml_set_object ( $xml_parser, $this );
991        xml_set_element_handler($xml_parser, "startElement", "endElement");
992        xml_set_character_data_handler ( $xml_parser, 'characterData' );
993
994        if (!xml_parse($xml_parser, $data, true))
995            return "<i>Error getting XML data from api.eve-online.com/account/Characters.xml.aspx  </i><br><br>";
996
997        xml_parser_free($xml_parser);
[431]998
[338]999        // add any characters not already in the kb
1000        $numchars = count($this->chars_);
1001        for ( $x = 0; $x < $numchars; $x++ )
1002        {
1003            // check if chars eveid exists in kb
1004            $sql = 'select plts.plt_id, plts.plt_externalid from kb3_pilots plts where plts.plt_name = "' . $this->chars_[$x]['Name'] . '"';
1005
1006            $qry = new DBQuery();
1007            $qry->execute($sql);
1008            if ($qry->recordCount() != 0)
[431]1009            {
[370]1010                                // pilot is in kb db, check he has his char id
[338]1011                $row = $qry->getRow();
1012
1013                $pilot_id = $row['plt_id'];
1014                $pilot_external_id = $row['plt_externalid'];
1015
1016                if ( $pilot_external_id == 0 && $pilot_id != 0 )
[431]1017                {
[370]1018                                        // update DB with ID
[338]1019                    $qry->execute("update kb3_pilots set plt_externalid = " . intval($this->chars_[$x]['charID']) . "
1020                                     where plt_id = " . $pilot_id);
1021                }
1022            } else {
1023                // pilot is not in DB
1024
1025                // Set Corp
1026                                $pilotscorp = new Corporation();
1027                                $pilotscorp->lookup($this->chars_[$x]['corpName']);
1028                // Check Corp was set, if not, add the Corp
1029                if ( !$pilotscorp->getID() )
1030                {
1031                    $ialliance = new Alliance();
[365]1032                    $ialliance->add('NONE');
[338]1033                    $pilotscorp->add($this->chars_[$x]['corpName'], $ialliance, gmdate("Y-m-d H:i:s"));
1034                }
1035                $ipilot = new Pilot();
1036                $ipilot->add($this->chars_[$x]['Name'], $pilotscorp, gmdate("Y-m-d H:i:s"));
1037                                $ipilot->setCharacterID(intval($this->chars_[$x]['charID']));
1038            }
1039        }
1040
1041        return $this->chars_;
1042    }
1043
[431]1044    function startElement($parser, $name, $attribs)
[338]1045    {
1046                global $character;
[431]1047
1048        if ($name == "ROW")
1049        {
1050            if (count($attribs))
[338]1051            {
[431]1052                foreach ($attribs as $k => $v)
[338]1053                {
[431]1054                    switch ($k)
[338]1055                    {
1056                        case "NAME":
1057                            $character['Name'] = $v;
1058                            break;
[431]1059                        case "CORPORATIONNAME":
[338]1060                            $character['corpName'] = $v;
1061                            break;
[431]1062                        case "CHARACTERID":
[338]1063                            $character['charID'] = $v;
1064                            break;
[431]1065                        case "CORPORATIONID":
[338]1066                            $character['corpID'] = $v;
1067                            break;
1068                    }
1069                }
1070            }
1071        }
1072    }
1073
[431]1074    function endElement($parser, $name)
[338]1075    {
1076                global $character;
[431]1077
[338]1078        if ($name == "ROW")
1079                {
1080                        $this->chars_[] = $character;
1081                        $character = array();
1082                        unset($character);
1083                }
1084    }
1085
[431]1086    function characterData($parser, $data)
[338]1087    {
1088        // nothing
1089    }
1090
1091    function loaddata($apistring)
1092    {
1093        $path = '/account/Characters.xml.aspx';
1094        $fp = fsockopen("api.eve-online.com", 80);
1095
1096        if (!$fp)
1097        {
1098            echo "Error", "Could not connect to API URL<br>";
1099        } else {
1100            // request the xml
1101            fputs ($fp, "POST " . $path . " HTTP/1.0\r\n");
1102            fputs ($fp, "Host: api.eve-online.com\r\n");
1103            fputs ($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
1104            fputs ($fp, "User-Agent: PHPApi\r\n");
1105            fputs ($fp, "Content-Length: " . strlen($apistring) . "\r\n");
1106            fputs ($fp, "Connection: close\r\n\r\n");
1107            fputs ($fp, $apistring."\r\n");
1108
1109            // retrieve contents
1110            $contents = "";
1111            while (!feof($fp))
1112            {
1113                $contents .= fgets($fp);
1114            }
1115
1116            // close connection
1117            fclose($fp);
1118
1119            $start = strpos($contents, "?>");
1120            if ($start != false)
1121            {
1122                $contents = substr($contents, $start + strlen("\r\n\r\n"));
1123            }
[431]1124        }
[338]1125        return $contents;
1126    }
1127}
1128
[365]1129// **********************************************************************************************************************************************
1130// ****************                                 API Alliance list - /eve/AllianceList.xml.aspx                               ****************
1131// **********************************************************************************************************************************************
1132
[431]1133class AllianceAPI
[338]1134{
[365]1135        function getCachedUntil()
1136        {
1137                return $this->CachedUntil_;
1138        }
[431]1139
[365]1140        function getCurrentTime()
[338]1141        {
[365]1142                return $this->CurrentTime_;
1143        }
[431]1144
1145
[370]1146        function initXML()
[365]1147        {
[338]1148                global $myalliancelist;
[431]1149
[370]1150                $data = LoadGlobalData('/eve/AllianceList.xml.aspx');
[338]1151
1152        $xml_parser = xml_parser_create();
1153        xml_set_object ( $xml_parser, $this );
1154        xml_set_element_handler($xml_parser, "startElement", "endElement");
1155        xml_set_character_data_handler ( $xml_parser, 'characterData' );
1156
1157        if (!xml_parse($xml_parser, $data, true))
1158                return false;
[431]1159
[338]1160                xml_parser_free($xml_parser);
1161                return true;
1162        }
[431]1163
1164    function fetchalliances($overide=false)
[338]1165    {
1166        global $myalliancelist;
[431]1167
[338]1168                if (!isset($this->alliances_))
[365]1169                        $this->initXML($overide);
[431]1170
[338]1171        return $myalliancelist;
1172    }
1173
[431]1174    function startElement($parser, $name, $attribs)
[338]1175    {
[370]1176        global $myalliancelist, $alliancedetail, $membercorps, $membercorp, $iscorpsection;
[338]1177
[431]1178        if ($name == "ROW")
[338]1179        {
[431]1180            if (count($attribs))
[338]1181            {
[431]1182                foreach ($attribs as $k => $v)
[338]1183                {
[431]1184                    switch ($k)
[338]1185                    {
1186                        case "NAME":
1187                            $alliancedetail['allianceName'] = $v;
1188                            break;
1189                                                case "SHORTNAME":
1190                            $alliancedetail['shortName'] = $v;
1191                            break;
[431]1192                        case "ALLIANCEID":
[338]1193                            $alliancedetail['allianceID'] = $v;
1194                            break;
[431]1195                                                case "EXECUTORCORPID":
[338]1196                            $alliancedetail['executorCorpID'] = $v;
1197                            break;
[431]1198                                                case "MEMBERCOUNT":
[338]1199                            $alliancedetail['memberCount'] = $v;
1200                            break;
[431]1201                                                case "STARTDATE":
1202                                                        if (!$iscorpsection)
[338]1203                                                        {
1204                                $alliancedetail['startDate'] = $v;
1205                                                        } else {
[370]1206                                                                $membercorp['startDate'] = $v;
1207                                                                $membercorps[] = $membercorp;
[338]1208                                                        }
1209                            break;
[431]1210                                                case "CORPORATIONID":
[370]1211                            $membercorp['corporationID'] = $v;
[338]1212                                                        $iscorpsection = true;
1213                            break;
1214                    }
1215                }
1216            }
1217        }
1218    }
1219
[431]1220    function endElement($parser, $name)
[338]1221    {
[370]1222        global $myalliancelist, $alliancedetail, $membercorps, $membercorp, $iscorpsection;
[365]1223                global $tempvalue;
[431]1224
[365]1225                if ($name == "CURRENTTIME")
1226                        $this->CurrentTime_ = $tempvalue;
1227                if ($name == "CACHEDUNTIL")
1228                {
[370]1229                        if  (config::get('API_extendedtimer_alliancelist') == 0)
1230                        {
1231                                $this->CachedUntil_ = date("Y-m-d H:i:s", (strtotime($this->CurrentTime_)) + 85500);
1232                        } else {
1233                                $this->CachedUntil_ = $tempvalue;
1234                        }
1235                        ApiCache::set('API_eve_AllianceList' , $this->CachedUntil_);
[365]1236                }
[431]1237
1238        switch ($name)
[338]1239        {
1240            case "ROWSET":
[431]1241                if ($alliancedetail['allianceName'] != "" && $alliancedetail['allianceID'] != "0")
[338]1242                {
1243                    $myalliancelist['Name'][] = $alliancedetail['allianceName'];
1244                    $myalliancelist['allianceID'][] = $alliancedetail['allianceID'];
1245                }
1246                                $alliancedetail['memberCorps'] = $membercorps;
1247                                $this->alliances_[] = $alliancedetail;
[431]1248
[338]1249                                $alliancedetail['allianceName'] = "";
1250                                $alliancedetail['shortName'] = "";
1251                                $alliancedetail['allianceID'] = "";
1252                                $alliancedetail['executorCorpID'] = "";
1253                                $alliancedetail['memberCount'] = "";
1254                                $alliancedetail['startDate'] = "";
1255                                $alliancedetail['memberCorps'] = array();
1256                                $membercorps = array();
[370]1257                                $membercorp = array();
[338]1258                                unset($alliancedetail['memberCorps']);
1259                                unset($membercorps);
[370]1260                                unset($membercorp);
[338]1261                                $iscorpsection = false;
1262                break;
1263        }
1264    }
1265
[431]1266    function characterData($parser, $data)
[338]1267    {
[365]1268                global $tempvalue;
[431]1269
[365]1270                $tempvalue = $data;
1271    }
[431]1272
[365]1273        function updatealliancetable()
1274    {
1275        if (!isset($this->alliances_))
1276            $this->initXML();
[431]1277
[365]1278        if (!isset($this->alliances_))
1279            return false;
[431]1280
[365]1281        $qry = new DBQuery();
1282        $qry->execute("DROP TABLE IF EXISTS `kb3_all_corp`;");
1283        $qry->execute("CREATE TABLE kb3_all_corp (
1284              all_id bigint(3) unsigned default '0',
1285              corp_id bigint(3) unsigned default '0',
1286              all_name varchar(200) default NULL
1287            ) ");
1288
1289        $alliances = $this->alliances_;
[431]1290
[365]1291        foreach ($alliances as $arraykey => $arrayvalue)
1292        {
1293            $tempally = $arrayvalue;
1294
1295            foreach ($tempally as $key => $value)
1296            {
1297                switch ($key)
1298                {
1299                    case "allianceName":
1300                        $allyname = $value;
1301                        break;
1302                    case "allianceID":
1303                        $allyid = $value;
1304                        break;
1305                    case "memberCorps":
1306                        $allycorps = $value;
1307                        $q='';
1308                        foreach ($allycorps as $corpkey => $corpvalue)
1309                        {
1310                            $tempcorp = $corpvalue;
1311                            foreach ($tempcorp as $tempkey => $tempvalue)
1312                            {
1313                                switch ($tempkey)
1314                                {
1315                                    case "corporationID":
1316                                        $q.="(".$allyid.",".$tempvalue.",'".slashfix($allyname)."'),";
1317                                        break;
1318                                }
1319                            }
1320                        }
1321                        if (strlen($q)>0)
1322                                $qry->execute("INSERT INTO kb3_all_corp values ".substr($q,0,strlen($q)-1));
1323                        break;
1324                }
[431]1325            }
[365]1326        }
1327        return true;
1328    }
[431]1329
[370]1330        function LocateAlliance($name)
1331        {
1332                if (!isset($this->alliances_))
1333            $this->initXML();
[431]1334
[370]1335        if (!isset($this->alliances_))
1336            return false;
[431]1337
[370]1338                $alliances = $this->alliances_;
[431]1339
[370]1340        foreach ($alliances as $arraykey => $arrayvalue)
1341        {
1342            $tempally = $arrayvalue;
1343
1344            foreach ($tempally as $key => $value)
1345            {
1346                switch ($key)
1347                {
1348                    case "allianceName":
1349                        //return $tempally;
1350                                                if ( $value == $name )
1351                                                {
1352                                                        return $tempally;
1353                                                }
1354                        break;
1355                }
[431]1356            }
[370]1357        }
1358                return false;
1359        }
[431]1360
[370]1361        function LocateAllianceID($id)
1362        {
1363                if (!isset($this->alliances_))
1364            $this->initXML();
[431]1365
[370]1366        if (!isset($this->alliances_))
1367            return false;
[431]1368
[370]1369                $alliances = $this->alliances_;
[431]1370
[370]1371        foreach ($alliances as $arraykey => $arrayvalue)
1372        {
1373            $tempally = $arrayvalue;
1374
1375            foreach ($tempally as $key => $value)
1376            {
1377                switch ($key)
1378                {
1379                    case "allianceID":
1380                        //return $tempally;
1381                                                if ( $value == $id )
1382                                                {
1383                                                        return $tempally;
1384                                                }
1385                        break;
1386                }
[431]1387            }
[370]1388        }
1389                return false;
1390        }
[431]1391
[370]1392        function UpdateAlliances($andCorps = false)
1393        {
1394                if (!isset($this->alliances_))
1395            $this->initXML();
[431]1396
[370]1397        if (!isset($this->alliances_))
1398            return false;
[431]1399
[370]1400                if ($andCorps)
1401                {
1402                        // Remove every single corp in the Killboard DB from their current Alliance
1403                        $db = new DBQuery(true);
1404                        $db->execute("UPDATE kb3_corps
1405                                                        SET crp_all_id = 14");
1406                }
[431]1407
[370]1408                $alliances = $this->alliances_;
1409                $alliance = new Alliance();
[431]1410                $tempMyCorp = new Corporation();
[370]1411                $myCorpAPI = new API_CorporationSheet();
[431]1412
[370]1413                $NumberOfAlliances = 0;
1414                $NumberOfCorps = 0;
1415                $NumberOfAlliancesAdded = 0; // we won't know this
1416                $NumberOfCorpsAdded = 0;
[431]1417
[370]1418                foreach ($alliances as $arraykey => $arrayvalue)
1419        {
1420            $tempally = $arrayvalue;
1421                        $NumberOfAlliances++;
[431]1422
[370]1423            foreach ($tempally as $key => $value)
1424            {
1425                switch ($key)
1426                {
1427                    case "allianceName":
1428                        $alliance->add($value);
1429                        break;
1430                                        case "memberCorps":
1431                                                // if $andCorps = true then add each and every single corp to the evekb db - resolving each name (expect this to be slow)
1432                                                // WARNING: Processing 5000+ corps this way is extremely slow and is almost guaranteed not to complete
1433                                                if ($andCorps)
1434                                                {
1435                                                        foreach ($value as $tempcorp)
1436                                                        {
1437                                                                $NumberOfCorps++;
[431]1438
[370]1439                                                                $myCorpAPI->setCorpID($tempcorp["corporationID"]);
1440                                                                $result .= $myCorpAPI->fetchXML();
[431]1441
[370]1442                                                                //$NumberOfCorpsAdded++;
1443                                                                $tempMyCorp->add($myCorpAPI->getCorporationName(), $alliance , gmdate("Y-m-d H:i:s"));
[431]1444
[370]1445                                                        }
[431]1446
[370]1447                                                }
1448                                                break;
1449                }
[431]1450            }
[370]1451        }
1452                $returnarray["NumAlliances"] = $NumberOfAlliances;
1453                $returnarray["NumCorps"] = $NumberOfCorps;
1454                $returnarray["NumAlliancesAdded"] = $NumberOfAlliancesAdded;
1455                $returnarray["NumCorpsAdded"] = $NumberOfCorpsAdded;
1456                return $returnarray;
[431]1457
[370]1458        }
[365]1459}
1460
1461// **********************************************************************************************************************************************
1462// ****************                 API Conquerable Station/Outpost list - /eve/ConquerableStationList.xml.aspx                  ****************
1463// **********************************************************************************************************************************************
1464
[431]1465class API_ConquerableStationList
[365]1466{
1467        function getCachedUntil()
1468        {
1469                return $this->CachedUntil_;
1470        }
[431]1471
[365]1472        function getCurrentTime()
1473        {
1474                return $this->CurrentTime_;
1475        }
[431]1476
[365]1477        function getStations()
1478        {
1479                return $this->Stations_;
1480        }
[431]1481
1482    function fetchXML()
[365]1483    {
1484        $data = LoadGlobalData('/eve/ConquerableStationList.xml.aspx');
1485
1486        $xml_parser = xml_parser_create();
1487        xml_set_object ( $xml_parser, $this );
1488        xml_set_element_handler($xml_parser, "startElement", "endElement");
1489        xml_set_character_data_handler ( $xml_parser, 'characterData' );
1490
1491        if (!xml_parse($xml_parser, $data, true))
1492            return "<i>Error getting XML data from api.eve-online.com/eve/ConquerableStationList.xml.aspx </i><br><br>";
1493
1494        xml_parser_free($xml_parser);
[431]1495
[365]1496        return $this->html;
1497    }
1498
[431]1499    function startElement($parser, $name, $attribs)
[365]1500    {
1501                global $Station;
[431]1502
1503        if ($name == "ROW")
1504        {
1505            if (count($attribs))
[365]1506            {
[431]1507                foreach ($attribs as $k => $v)
[365]1508                {
[431]1509                    switch ($k)
[365]1510                    {
1511                        case "STATIONID":
1512                            $Station['stationID'] = $v;
1513                            break;
[431]1514                        case "STATIONNAME":
[365]1515                            $Station['stationName'] = $v;
1516                            break;
[431]1517                        case "STATIONTYPEID":
[365]1518                            $Station['stationTypeID'] = $v;
1519                            break;
[431]1520                        case "SOLARSYSTEMID":
[365]1521                            $Station['solarSystemID'] = $v;
1522                            break;
[431]1523                                                case "CORPORATIONID":
[365]1524                            $Station['corporationID'] = $v;
1525                            break;
[431]1526                                                case "CORPORATIONNAME":
[365]1527                            $Station['corporationName'] = $v;
1528                            break;
1529                    }
1530                }
1531            }
1532        }
1533    }
1534
[431]1535    function endElement($parser, $name)
[365]1536    {
1537                global $Station;
1538                global $tempvalue;
[431]1539
[365]1540                if ($name == "CURRENTTIME")
1541                        $this->CurrentTime_ = $tempvalue;
1542                if ($name == "CACHEDUNTIL")
[338]1543                {
[370]1544                        if  (config::get('API_extendedtimer_conq') == 0)
1545                        {
1546                                $this->CachedUntil_ = date("Y-m-d H:i:s", (strtotime($this->CurrentTime_)) + 85500);
1547                        } else {
1548                                $this->CachedUntil_ = $tempvalue;
1549                        }
1550                        ApiCache::set('API_eve_ConquerableStationList' , $this->CachedUntil_);
[338]1551                }
[431]1552
[365]1553        if ($name == "ROW")
1554                {
1555                        $this->Stations_[] = $Station;
1556                        $Station = array();
1557                        unset($Station);
1558                }
[338]1559    }
1560
[431]1561    function characterData($parser, $data)
[338]1562    {
[365]1563        global $tempvalue;
[431]1564
[365]1565                $tempvalue = $data;
1566    }
1567}
1568
1569// **********************************************************************************************************************************************
1570// ****************                                   API Error list - /eve/ErrorList.xml.aspx                                   ****************
1571// **********************************************************************************************************************************************
1572
[431]1573class API_ErrorList
[365]1574{
1575        function getCachedUntil()
1576        {
1577                return $this->CachedUntil_;
1578        }
[431]1579
[365]1580        function getCurrentTime()
1581        {
1582                return $this->CurrentTime_;
1583        }
[431]1584
[365]1585        function getErrorList()
1586        {
1587                return $this->Error_;
1588        }
[431]1589
1590    function fetchXML()
[365]1591    {
1592        $data = LoadGlobalData('/eve/ErrorList.xml.aspx');
1593
1594        $xml_parser = xml_parser_create();
1595        xml_set_object ( $xml_parser, $this );
1596        xml_set_element_handler($xml_parser, "startElement", "endElement");
1597        xml_set_character_data_handler ( $xml_parser, 'characterData' );
1598
1599        if (!xml_parse($xml_parser, $data, true))
1600            return "<i>Error getting XML data from api.eve-online.com/eve/ErrorList.xml.aspx </i><br><br>";
1601
1602        xml_parser_free($xml_parser);
[431]1603
[365]1604        return $this->html;
1605    }
1606
[431]1607    function startElement($parser, $name, $attribs)
[365]1608    {
1609                global $ErrorData;
[431]1610
1611        if ($name == "ROW")
1612        {
1613            if (count($attribs))
[365]1614            {
[431]1615                foreach ($attribs as $k => $v)
[365]1616                {
[431]1617                    switch ($k)
[365]1618                    {
1619                        case "ERRORCODE":
1620                            $ErrorData['errorCode'] = $v;
1621                            break;
[431]1622                        case "ERRORTEXT":
[365]1623                            $ErrorData['errorText'] = $v;
1624                            break;
1625                    }
1626                }
1627            }
1628        }
1629    }
1630
[431]1631    function endElement($parser, $name)
[365]1632    {
1633                global $ErrorData;
1634                global $tempvalue;
[431]1635
[365]1636                if ($name == "CURRENTTIME")
1637                        $this->CurrentTime_ = $tempvalue;
1638                if ($name == "CACHEDUNTIL")
1639                {
1640                        $this->CachedUntil_ = $tempvalue;
[370]1641                        ApiCache::set('API_eve_ErrorList' , $tempvalue);
[365]1642                }
[431]1643
[365]1644        if ($name == "ROW")
1645                {
1646                        $this->Error_[] = $ErrorData;
1647                        $ErrorData = array();
1648                        unset($ErrorData);
1649                }
1650    }
1651
[431]1652    function characterData($parser, $data)
[365]1653    {
1654        global $tempvalue;
[431]1655
[365]1656                $tempvalue = $data;
1657    }
1658}
1659
1660// **********************************************************************************************************************************************
1661// ****************                                   API Jumps list - /map/Jumps.xml.aspx                                   ****************
1662// **********************************************************************************************************************************************
1663
[431]1664class API_Jumps
[365]1665{
1666        function getCachedUntil()
1667        {
1668                return $this->CachedUntil_;
1669        }
[431]1670
[365]1671        function getCurrentTime()
1672        {
1673                return $this->CurrentTime_;
1674        }
[431]1675
[365]1676        function getDataTime()
1677        {
1678                return $this->DataTime_;
1679        }
[431]1680
[365]1681        function getJumps()
1682        {
1683                return $this->Jumps_;
1684        }
[431]1685
1686    function fetchXML()
[365]1687    {
1688        $data = LoadGlobalData('/map/Jumps.xml.aspx');
1689
1690        $xml_parser = xml_parser_create();
1691        xml_set_object ( $xml_parser, $this );
1692        xml_set_element_handler($xml_parser, "startElement", "endElement");
1693        xml_set_character_data_handler ( $xml_parser, 'characterData' );
1694
1695        if (!xml_parse($xml_parser, $data, true))
1696            return "<i>Error getting XML data from api.eve-online.com/map/Jumps.xml.aspx </i><br><br>";
1697
1698        xml_parser_free($xml_parser);
[431]1699
[365]1700        return $this->html;
1701    }
1702
[431]1703    function startElement($parser, $name, $attribs)
[365]1704    {
1705                global $JumpData;
[431]1706
1707        if ($name == "ROW")
1708        {
1709            if (count($attribs))
[365]1710            {
[431]1711                foreach ($attribs as $k => $v)
[365]1712                {
[431]1713                    switch ($k)
[365]1714                    {
1715                        case "SOLARSYSTEMID":
1716                            $JumpData['solarSystemID'] = $v;
1717                            break;
[431]1718                        case "SHIPJUMPS":
[365]1719                            $JumpData['shipJumps'] = $v;
1720                            break;
1721                    }
1722                }
1723            }
1724        }
1725    }
1726
[431]1727    function endElement($parser, $name)
[365]1728    {
1729                global $JumpData;
1730                global $tempvalue;
[431]1731
[365]1732                if ($name == "CURRENTTIME")
1733                        $this->CurrentTime_ = $tempvalue;
1734                if ($name == "DATATIME")
1735                        $this->DataTime_ = $tempvalue;
1736                if ($name == "CACHEDUNTIL")
1737                {
1738                        $this->CachedUntil_ = $tempvalue;
[370]1739                        ApiCache::set('API_map_Jumps' , $tempvalue);
[365]1740                }
[431]1741
[365]1742        if ($name == "ROW")
1743                {
1744                        $this->Jumps_[] = $JumpData;
1745                        $JumpData = array();
1746                        unset($JumpData);
1747                }
1748    }
1749
[431]1750    function characterData($parser, $data)
[365]1751    {
1752        global $tempvalue;
[431]1753
[365]1754                $tempvalue = $data;
1755    }
1756}
1757
1758// **********************************************************************************************************************************************
1759// ****************                                   API Kills list - /map/Kills.xml.aspx                                   ****************
1760// **********************************************************************************************************************************************
1761
[431]1762class API_Kills
[365]1763{
1764        function getCachedUntil()
1765        {
1766                return $this->CachedUntil_;
1767        }
[431]1768
[365]1769        function getCurrentTime()
1770        {
1771                return $this->CurrentTime_;
1772        }
[431]1773
[365]1774        function getDataTime()
1775        {
1776                return $this->DataTime_;
1777        }
[431]1778
[365]1779        function getkills()
1780        {
1781                return $this->kills_;
1782        }
[431]1783
1784    function fetchXML()
[365]1785    {
1786        $data = LoadGlobalData('/map/Kills.xml.aspx');
1787
1788        $xml_parser = xml_parser_create();
1789        xml_set_object ( $xml_parser, $this );
1790        xml_set_element_handler($xml_parser, "startElement", "endElement");
1791        xml_set_character_data_handler ( $xml_parser, 'characterData' );
1792
1793        if (!xml_parse($xml_parser, $data, true))
1794            return "<i>Error getting XML data from api.eve-online.com/map/Kills.xml.aspx </i><br><br>";
1795
1796        xml_parser_free($xml_parser);
[431]1797
[365]1798        return $this->html;
1799    }
1800
[431]1801    function startElement($parser, $name, $attribs)
[365]1802    {
1803                global $KillsData;
[431]1804
1805        if ($name == "ROW")
1806        {
1807            if (count($attribs))
[365]1808            {
[431]1809                foreach ($attribs as $k => $v)
[365]1810                {
[431]1811                    switch ($k)
[365]1812                    {
1813                        case "SOLARSYSTEMID":
1814                            $KillsData['solarSystemID'] = $v;
1815                            break;
[431]1816                        case "SHIPKILLS":
[365]1817                            $KillsData['shipKills'] = $v;
1818                            break;
[431]1819                                                case "FACTIONKILLS":
[365]1820                            $KillsData['factionKills'] = $v;
1821                            break;
[431]1822                                                case "PODKILLS":
[365]1823                            $KillsData['podKills'] = $v;
1824                            break;
1825                    }
1826                }
1827            }
1828        }
1829    }
1830
[431]1831    function endElement($parser, $name)
[365]1832    {
1833                global $KillsData;
1834                global $tempvalue;
[431]1835
[365]1836                if ($name == "CURRENTTIME")
1837                        $this->CurrentTime_ = $tempvalue;
1838                if ($name == "DATATIME")
1839                        $this->DataTime_ = $tempvalue;
1840                if ($name == "CACHEDUNTIL")
1841                {
1842                        $this->CachedUntil_ = $tempvalue;
[370]1843                        ApiCache::set('API_map_Kills' , $tempvalue);
[365]1844                }
[431]1845
[365]1846        if ($name == "ROW")
1847                {
1848                        $this->kills_[] = $KillsData;
1849                        $KillsData = array();
1850                        unset($KillsData);
1851                }
1852    }
1853
[431]1854    function characterData($parser, $data)
[365]1855    {
1856        global $tempvalue;
[431]1857
[365]1858                $tempvalue = $data;
1859    }
1860}
1861
1862// **********************************************************************************************************************************************
1863// ****************                            API Alliance Sovereignty - /map/Sovereignty.xml.aspx                              ****************
1864// **********************************************************************************************************************************************
1865
1866class API_Sovereignty
1867{
1868        function getCachedUntil()
1869        {
1870                return $this->CachedUntil_;
1871        }
[431]1872
[365]1873        function getCurrentTime()
1874        {
1875                return $this->CurrentTime_;
1876        }
[431]1877
[365]1878        function getDataTime()
1879        {
1880                return $this->DataTime_;
1881        }
[431]1882
[365]1883        function getSovereignty()
1884        {
1885                return $this->Sovereignty_;
1886        }
1887
[431]1888    function fetchXML()
[365]1889    {
1890        $data = LoadGlobalData('/map/Sovereignty.xml.aspx');
1891
1892        $xml_parser = xml_parser_create();
1893        xml_set_object ( $xml_parser, $this );
1894        xml_set_element_handler($xml_parser, "startElement", "endElement");
1895        xml_set_character_data_handler ( $xml_parser, 'characterData' );
1896
1897        if (!xml_parse($xml_parser, $data, true))
1898            return "<i>Error getting XML data from api.eve-online.com/map/Sovereignty.xml.aspx  </i><br><br>";
1899
1900        xml_parser_free($xml_parser);
[431]1901
[365]1902        return $this->html;
1903    }
1904
[431]1905    function startElement($parser, $name, $attribs)
[365]1906    {
1907                global $SovereigntyData;
[431]1908
1909        if ($name == "ROW")
1910        {
1911            if (count($attribs))
[365]1912            {
[431]1913                foreach ($attribs as $k => $v)
[365]1914                {
[431]1915                    switch ($k)
[365]1916                    {
1917                        case "SOLARSYSTEMID":
1918                            $SovereigntyData['solarSystemID'] = $v;
1919                            break;
[431]1920                        case "ALLIANCEID":
[365]1921                            $SovereigntyData['allianceID'] = $v;
1922                            break;
[431]1923                                                case "CONSTELLATIONSOVEREIGNTY":
[365]1924                            $SovereigntyData['constellationSovereignty'] = $v;
1925                            break;
[431]1926                                                case "SOVEREIGNTYLEVEL":
[365]1927                            $SovereigntyData['sovereigntyLevel'] = $v;
1928                            break;
[431]1929                                                case "FACTIONID":
[365]1930                            $SovereigntyData['factionID'] = $v;
1931                            break;
[431]1932                                                case "SOLARSYSTEMNAME":
[365]1933                            $SovereigntyData['solarSystemName'] = $v;
1934                            break;
1935                    }
1936                }
1937            }
1938        }
1939    }
1940
[431]1941    function endElement($parser, $name)
[365]1942    {
1943                global $SovereigntyData;
1944                global $tempvalue;
[431]1945
[365]1946                if ($name == "CURRENTTIME")
1947                        $this->CurrentTime_ = $tempvalue;
1948                if ($name == "DATATIME")
1949                        $this->DataTime_ = $tempvalue;
1950                if ($name == "CACHEDUNTIL")
1951                {
[370]1952                        if  (config::get('API_extendedtimer_sovereignty') == 0)
1953                        {
1954                                $this->CachedUntil_ = date("Y-m-d H:i:s", (strtotime($this->CurrentTime_)) + 85500);
1955                        } else {
1956                                $this->CachedUntil_ = $tempvalue;
1957                        }
1958                        ApiCache::set('API_map_Sovereignty' , $this->CachedUntil_);
[365]1959                }
[431]1960
[365]1961        if ($name == "ROW")
1962                {
1963                        $this->Sovereignty_[] = $SovereigntyData;
1964                        $SovereigntyData = array();
1965                        unset($SovereigntyData);
1966                }
1967    }
1968
[431]1969    function characterData($parser, $data)
[365]1970    {
1971                global $tempvalue;
[431]1972
[365]1973                $tempvalue = $data;
1974    }
[431]1975
[370]1976        function getSystemDetails($sysname)
1977        {
1978                if (!isset($this->Sovereignty_))
1979            $this->fetchXML();
[431]1980
[370]1981        if (!isset($this->Sovereignty_))
1982            return false;
[431]1983
[370]1984                $Sov = $this->Sovereignty_;
[431]1985
[370]1986                foreach ($Sov as $myTempData)
1987                {
1988                        if ($myTempData['solarSystemName'] == $sysname)
1989                                return $myTempData;
1990                }
[431]1991
[370]1992                return;
1993        }
[431]1994
[370]1995        function getSystemIDDetails($sysID)
1996        {
1997                if (!isset($this->Sovereignty_))
1998            $this->fetchXML();
[431]1999
[370]2000        if (!isset($this->Sovereignty_))
2001            return false;
[431]2002
[370]2003                //echo var_dump($this->Sovereignty_);
[431]2004
[370]2005                $Sov = $this->Sovereignty_;
[431]2006
[370]2007                foreach ($Sov as $myTempData)
2008                {
2009                        if ($myTempData['solarSystemID'] == $sysID)
2010                                return $myTempData;
2011                }
[431]2012
[370]2013                return false;
2014        }
[365]2015}
2016
2017// **********************************************************************************************************************************************
2018// ****************                               API Reference Types - /eve/RefTypes.xml.aspx                                   ****************
2019// **********************************************************************************************************************************************
2020
2021class API_RefTypes
2022{
2023        function getCachedUntil()
2024        {
2025                return $this->CachedUntil_;
2026        }
[431]2027
[365]2028        function getCurrentTime()
2029        {
2030                return $this->CurrentTime_;
2031        }
[431]2032
[365]2033        function getRefTypes()
2034        {
2035                return $this->RefTypes_;
2036        }
[431]2037
2038    function fetchXML()
[365]2039    {
2040        $data = LoadGlobalData('/eve/RefTypes.xml.aspx');
2041
2042        $xml_parser = xml_parser_create();
2043        xml_set_object ( $xml_parser, $this );
2044        xml_set_element_handler($xml_parser, "startElement", "endElement");
2045        xml_set_character_data_handler ( $xml_parser, 'characterData' );
2046
2047        if (!xml_parse($xml_parser, $data, true))
2048            return "<i>Error getting XML data from api.eve-online.com/eve/RefTypes.xml.aspx  </i><br><br>";
2049
2050        xml_parser_free($xml_parser);
[431]2051
[365]2052        return $this->html;
2053    }
2054
[431]2055    function startElement($parser, $name, $attribs)
[365]2056    {
2057                global $RefTypeData;
[431]2058
2059        if ($name == "ROW")
2060        {
2061            if (count($attribs))
[365]2062            {
[431]2063                foreach ($attribs as $k => $v)
[365]2064                {
[431]2065                    switch ($k)
[365]2066                    {
2067                        case "REFTYPEID":
2068                            $RefTypeData['refTypeID'] = $v;
2069                            break;
[431]2070                        case "REFTYPENAME":
[365]2071                            $RefTypeData['refTypeName'] = $v;
2072                            break;
2073                    }
2074                }
2075            }
2076        }
2077    }
2078
[431]2079    function endElement($parser, $name)
[365]2080    {
2081                global $RefTypeData;
2082                global $tempvalue;
[431]2083
[365]2084                if ($name == "CURRENTTIME")
2085                        $this->CurrentTime_ = $tempvalue;
2086                if ($name == "CACHEDUNTIL")
2087                {
2088                        $this->CachedUntil_ = $tempvalue;
[370]2089                        ApiCache::set('API_eve_RefTypes' , $tempvalue);
[365]2090                }
[431]2091
[365]2092        if ($name == "ROW")
2093                {
2094                        $this->RefTypes_[] = $RefTypeData;
2095                        $RefTypeData = array();
2096                        unset($RefTypeData);
2097                }
2098    }
2099
[431]2100    function characterData($parser, $data)
[365]2101    {
2102        global $tempvalue;
[431]2103
[365]2104                $tempvalue = $data;
2105    }
2106}
2107
2108// **********************************************************************************************************************************************
2109// ****************                           API Faction War Systems - /map/FacWarSystems.xml.aspx                              ****************
2110// **********************************************************************************************************************************************
2111
2112class API_FacWarSystems
2113{
2114        function getCachedUntil()
2115        {
2116                return $this->CachedUntil_;
2117        }
[431]2118
[365]2119        function getCurrentTime()
2120        {
2121                return $this->CurrentTime_;
2122        }
[431]2123
[365]2124        function getFacWarSystems()
2125        {
2126                return $this->FacWarSystems_;
2127        }
[431]2128
2129    function fetchXML()
[365]2130    {
2131        $data = LoadGlobalData('/map/FacWarSystems.xml.aspx');
2132
2133        $xml_parser = xml_parser_create();
2134        xml_set_object ( $xml_parser, $this );
2135        xml_set_element_handler($xml_parser, "startElement", "endElement");
2136        xml_set_character_data_handler ( $xml_parser, 'characterData' );
2137
2138        if (!xml_parse($xml_parser, $data, true))
2139            return "<i>Error getting XML data from api.eve-online.com/map/FacWarSystems.xml.aspx  </i><br><br>";
2140
2141        xml_parser_free($xml_parser);
[431]2142
[365]2143        return $this->FacWarSystems_;
2144    }
2145
[431]2146    function startElement($parser, $name, $attribs)
[365]2147    {
2148                global $FacWarSystem;
[431]2149
2150        if ($name == "ROW")
2151        {
2152            if (count($attribs))
[365]2153            {
[431]2154                foreach ($attribs as $k => $v)
[365]2155                {
[431]2156                    switch ($k)
[365]2157                    {
2158                        case "SOLARSYSTEMID":
2159                            $FacWarSystem['solarSystemID'] = $v;
2160                            break;
[431]2161                        case "SOLARSYSTEMNAME":
[365]2162                            $FacWarSystem['solarSystemName'] = $v;
2163                            break;
2164                                                case "OCCUPYINGFACTIONID":
2165                            $FacWarSystem['occupyingFactionID'] = $v;
2166                            break;
2167                                                case "OCCUPYINGFACTIONNAME":
2168                            $FacWarSystem['occupyingFactionName'] = $v;
2169                            break;
2170                                                case "CONTESTED":
2171                            $FacWarSystem['contested'] = $v;
2172                            break;
2173                    }
2174                }
2175            }
2176        }
2177    }
2178
[431]2179    function endElement($parser, $name)
[365]2180    {
2181                global $FacWarSystem;
2182                global $tempvalue;
[431]2183
[365]2184                if ($name == "CURRENTTIME")
2185                        $this->CurrentTime_ = $tempvalue;
2186                if ($name == "CACHEDUNTIL")
2187                {
[370]2188                        if  (config::get('API_extendedtimer_facwarsystems') == 0)
2189                        {
2190                                $this->CachedUntil_ = date("Y-m-d H:i:s", (strtotime($this->CurrentTime_)) + 85500);
2191                        } else {
2192                                $this->CachedUntil_ = $tempvalue;
2193                        }
2194                        ApiCache::set('API_map_FacWarSystems' , $this->CachedUntil_);
[365]2195                }
[431]2196
[365]2197        if ($name == "ROW")
2198                {
2199                        $this->FacWarSystems_[] = $FacWarSystem;
2200                        $FacWarSystem = array();
2201                        unset($FacWarSystem);
2202                }
2203    }
2204
[431]2205    function characterData($parser, $data)
[365]2206    {
2207        global $tempvalue;
[431]2208
[365]2209                $tempvalue = $data;
2210    }
2211}
2212
2213// **********************************************************************************************************************************************
2214// ****************                                  API Standings - /corp & char/Standings.xml.aspx                             ****************
2215// **********************************************************************************************************************************************
2216class API_Standings
[431]2217{
[365]2218        function getCachedUntil()
2219        {
2220                return $this->CachedUntil_;
2221        }
[431]2222
[365]2223        function getCurrentTime()
2224        {
2225                return $this->CurrentTime_;
2226        }
[431]2227
[370]2228        // boolean value - sets between char/corp
[431]2229        function isUser($value)
[365]2230        {
2231                $this->isUser_ = $value;
2232        }
[431]2233
[365]2234        function setAPIKey($key)
2235        {
[370]2236                $this->API_apiKey_ = $key;
[365]2237        }
[431]2238
[365]2239        function setUserID($uid)
2240        {
2241                $this->API_userID_ = $uid;
2242        }
[431]2243
[365]2244        function setCharacterID($cid)
2245        {
2246                $this->API_characterID_ = $cid;
2247        }
[431]2248
[365]2249        function getCharacters()
2250        {
2251                return $this->Characters_;
2252        }
2253        function getCorporations()
2254        {
2255                return $this->Corporations_;
2256        }
2257        function getAlliances()
2258        {
2259                return $this->Alliances_;
2260        }
2261        function getAgents()
2262        {
2263                return $this->Agents_;
2264        }
2265        function getNPCCorporations()
2266        {
2267                return $this->NPCCorporations_;
2268        }
2269        function getFactions()
2270        {
2271                return $this->Factions_;
2272        }
2273        function getAllianceCorporations()
2274        {
2275                return $this->AllianceCorporations_;
2276        }
2277        function getAliianceAlliances()
2278        {
2279                return $this->AliianceAlliances_;
2280        }
[431]2281
[365]2282        function fetchXML()
2283        {
2284                $this->isAllianceStandings_ = false;
2285                $this->isCorporationStandings_ = false;
[431]2286
[365]2287                if ($this->isUser_)
[431]2288                {
[370]2289                        // is a player feed - take details from logged in user
[365]2290                        if (user::get('usr_pilot_id'))
2291                {
2292                                $myEveCharAPI = new API_CharacterSheet();
2293                                $this->html .= $myEveCharAPI->fetchXML();
[431]2294
[365]2295                                $skills = $myEveCharAPI->getSkills();
[431]2296
[365]2297                                $this->connections_ = 0;
2298                                $this->diplomacy_ = 0;
[431]2299
[365]2300                                foreach ((array)$skills as $myTempData)
2301                                {
2302                                        if ($myTempData['typeID'] == "3359")
2303                                                $this->connections_ = $myTempData['Level'];
2304                                        if ($myTempData['typeID'] == "3357")
2305                                                $this->diplomacy_ = $myTempData['Level'];
2306                                }
2307
2308                                $myKeyString = "userID=" . $this->API_userID_ . "&apiKey=" . $this->API_apiKey_ . "&characterID=" . $this->API_characterID_;
[431]2309
[365]2310                                $data = $this->loaddata($myKeyString, "char");
2311                        } else {
2312                                return "You are not logged in.";
2313                        }
[431]2314
2315                } else {
[370]2316                        // is a corp feed
2317                        $myKeyString = "userID=" . $this->API_userID_ . "&apiKey=" . $this->API_apiKey_ . "&characterID=" . $this->API_characterID_;
2318                        $data = $this->loaddata($myKeyString, "corp");
[365]2319                }
2320
2321        $xml_parser = xml_parser_create();
2322        xml_set_object ( $xml_parser, $this );
2323        xml_set_element_handler($xml_parser, "startElement", "endElement");
2324        xml_set_character_data_handler ( $xml_parser, 'characterData' );
2325
2326        if (!xml_parse($xml_parser, $data, true))
2327            return "<i>Error getting XML data from api.eve-online.com/Standings.xml.aspx  </i><br><br>";
2328
2329        xml_parser_free($xml_parser);
[431]2330
[365]2331                // sort the arrays (in descending order of standing)
2332                $this->Factions_ = $this->mysortarray($this->Factions_);
2333                $this->Characters_ = $this->mysortarray($this->Characters_);
2334                $this->Corporations_ = $this->mysortarray($this->Corporations_);
2335                $this->Alliances_ = $this->mysortarray($this->Alliances_);
2336                $this->Agents_ = $this->mysortarray($this->Agents_);
2337                $this->NPCCorporations_ = $this->mysortarray($this->NPCCorporations_);
2338                $this->AllianceCorporations_ = $this->mysortarray($this->AllianceCorporations_);
2339                $this->AllianceAlliances_ = $this->mysortarray($this->AliianceAlliances_);
[431]2340
[365]2341                return $this->html;
2342        }
[431]2343
[365]2344        function mysortarray($arraydata)
2345        {
[431]2346                if (count($arraydata) != 0 )
2347                {
[365]2348                        foreach ((array)$arraydata as $key => $row) {
2349                        $standing[$key]  = $row['Standing'];
2350                        $name[$key] = $row['Name'];
2351                                $id[$key] = $row['ID'];
2352                        }
[431]2353
[365]2354                        array_multisort($standing, SORT_DESC, $name, SORT_ASC, $id, SORT_ASC, $arraydata);
[431]2355
[365]2356                        $standing = array();
2357                        unset($standing);
2358                        $name = array();
2359                        unset($name);
2360                        $id = array();
2361                        unset($id);
[431]2362
[365]2363                        return $arraydata;
2364                }
2365        }
[431]2366
2367        function startElement($parser, $name, $attribs)
[365]2368    {
[431]2369
[365]2370                if ($name == "CORPORATIONSTANDINGS")
2371                {
2372                        $this->isAllianceStandings_ = false;
2373                        $this->isCorporationStandings_ = true;
2374                }
2375                if ($name == "STANDINGSTO")
2376                {
2377                        $this->StandingsTo_ = true; // used to determine if/when to apply diplomacy/connections bonus
2378                }
2379                if ($name == "STANDINGSFROM")
2380                {
2381                        $this->StandingsTo_ = false;
2382                }
2383                if ($name == "ALLIANCESTANDINGS")
2384                {
2385                        $this->isAllianceStandings_ = true;
2386                        $this->isCorporationStandings_ = false;
2387                }
[431]2388
[365]2389                if ($name == "ROWSET") // In this If statement we set booleans to ultimately determine where the data in the next If statement is stored
2390        {
[431]2391            if (count($attribs))
[365]2392            {
[431]2393                foreach ($attribs as $k => $v)
[365]2394                {
[431]2395                    switch ($k)
[365]2396                    {
2397                        case "NAME":
[431]2398                                                        switch ($v)
2399                                {
[370]2400                                                                // bitwise or numeric flag would be better and more concise - but fuck it!
[365]2401                                                                case "characters": // can only be personal/corp
2402                                                                        $this->isCharacters_ = true;
2403                                                                        $this->isCorporations_ = false;
2404                                                                        $this->isAlliances_ = false;
2405                                                                        $this->isAgents_ = false;
2406                                                                        $this->isNPCCorporations_ = false;
2407                                                                        $this->isFactions_ = false;
2408                                                                        $this->isAllianceCorporations_ = false;
2409                                                                        $this->isAllianceAlliances_ = false;
2410                                                                        break;
2411                                                                case "corporations": // can be either personal/corp or alliance
2412                                                                        $this->isCharacters_ = false;
2413                                                                        $this->isCorporations_ = false;
2414                                                                        $this->isAlliances_ = false;
2415                                                                        $this->isAgents_ = false;
2416                                                                        $this->isNPCCorporations_ = false;
2417                                                                        $this->isFactions_ = false;
2418                                                                        $this->isAllianceCorporations_ = false;
2419                                                                        $this->isAllianceAlliances_ = false;
[431]2420
[365]2421                                                                        if (!$this->isAllianceStandings_) // then it is personal/corp
2422                                                                        {
2423                                                                                $this->isCorporations_ = true;
2424                                                                        } else { // then it is alliance
2425                                                                                $this->isAllianceCorporations_ = true;
2426                                                                        }
2427                                                                        break;
2428                                                                case "alliances": // can be either personal/corp or alliance
2429                                                                        $this->isCharacters_ = false;
2430                                                                        $this->isCorporations_ = false;
2431                                                                        $this->isAlliances_ = false;
2432                                                                        $this->isAgents_ = false;
2433                                                                        $this->isNPCCorporations_ = false;
2434                                                                        $this->isFactions_ = false;
2435                                                                        $this->isAllianceCorporations_ = false;
2436                                                                        $this->isAllianceAlliances_ = false;
[431]2437
[365]2438                                                                        if (!$this->isAllianceStandings_) // then it is personal/corp
2439                                                                        {
2440                                                                                $this->isAlliances_ = true;
2441                                                                        } else { // then it is alliance
2442                                                                                $this->isAllianceAlliances_ = true;
[431]2443                                                                        }
[365]2444                                                                        break;
2445                                                                case "agents": // can only be personal/corp
2446                                                                        $this->isCharacters_ = false;
2447                                                                        $this->isCorporations_ = false;
2448                                                                        $this->isAlliances_ = false;
2449                                                                        $this->isAgents_ = true;
2450                                                                        $this->isNPCCorporations_ = false;
2451                                                                        $this->isFactions_ = false;
2452                                                                        $this->isAllianceCorporations_ = false;
2453                                                                        $this->isAllianceAlliances_ = false;
2454                                                                        break;
2455                                                                case "NPCCorporations": // can only be personal/corp
2456                                                                        $this->isCharacters_ = false;
2457                                                                        $this->isCorporations_ = false;
2458                                                                        $this->isAlliances_ = false;
2459                                                                        $this->isAgents_ = false;
2460                                                                        $this->isNPCCorporations_ = true;
2461                                                                        $this->isFactions_ = false;
2462                                                                        $this->isAllianceCorporations_ = false;
2463                                                                        $this->isAllianceAlliances_ = false;
2464                                                                        break;
2465                                                                case "factions": // can only be personal/corp
2466                                                                        $this->isCharacters_ = false;
2467                                                                        $this->isCorporations_ = false;
2468                                                                        $this->isAlliances_ = false;
2469                                                                        $this->isAgents_ = false;
2470                                                                        $this->isNPCCorporations_ = false;
2471                                                                        $this->isFactions_ = true;
2472                                                                        $this->isAllianceCorporations_ = false;
2473                                                                        $this->isAllianceAlliances_ = false;
[431]2474                                                                        break;
[365]2475                                                        }
2476                            break;
2477                                        }
2478                                }
2479                        }
2480                }
[431]2481
2482                if ($name == "ROW")
[365]2483        {
2484                        global $tempdata;
[431]2485
2486                        if (count($attribs))
[365]2487            {
[431]2488                foreach ($attribs as $k => $v)
[365]2489                {
[431]2490                    switch ($k)
[365]2491                    {
2492                                                case "TOID":
2493                                                        $tempdata['ID'] = $v;
[431]2494                            break;
[365]2495                                                case "FROMID":
2496                                                        $tempdata['ID'] = $v;
[431]2497                            break;
[365]2498                                                case "TONAME":
2499                                                        $tempdata['Name'] = $v;
[431]2500                            break;
[365]2501                                                case "FROMNAME":
2502                                                        $tempdata['Name'] = $v;
[431]2503                            break;
[365]2504                                                case "STANDING":
2505                                                        // use flags determined in previous If... to load the correct array[]
2506                                                        if ($this->isUser_ && !$this->StandingsTo_)
[431]2507                                                        {
[370]2508                                                                // set standings bonus where applicable
[365]2509                                                                // calculate bonus
2510                                                                if ($v >= 0) // Connections
2511                                                                        $tempdata['Standing'] = number_format($v + ((10 - $v) * (0.04 * $this->connections_)), 2, '.', '');
2512                                                                else  // Diplomacy
2513                                                                        $tempdata['Standing'] = number_format($v + ((10 - $v) * (0.04 * $this->diplomacy_)), 2, '.', '');
2514                                                        } else {
2515                                                                $tempdata['Standing'] = $v;
2516                                                        }
[431]2517
[365]2518                                                        // check that 'Name' isn't empty as this means the value was reset
2519                                                        if ($tempdata['Name'] != "")
[431]2520                                                        {
[365]2521                                                                if ($this->isCharacters_) {
2522                                                                        $this->Characters_[] = $tempdata;
2523                                                                } elseif ($this->isCorporations_) {
2524                                                                        $this->Corporations_[] = $tempdata;
2525                                                                } elseif ($this->isAlliances_ ) {
2526                                                                        $this->Alliances_[] = $tempdata;
2527                                                                } elseif ($this->isAgents_) {
2528                                                                        $this->Agents_[] = $tempdata;
2529                                                                } elseif ($this->isNPCCorporations_) {
2530                                                                        $this->NPCCorporations_[] = $tempdata;
2531                                                                } elseif ($this->isFactions_) {
2532                                                                        $this->Factions_[] = $tempdata;
2533                                                                } elseif ($this->isAllianceCorporations_) {
2534                                                                        $this->AllianceCorporations_[] = $tempdata;
2535                                                                } elseif ($this->isAllianceAlliances_) {
2536                                                                        $this->AllianceAlliances_[] = $tempdata;
2537                                                                }
2538                                                        }
[431]2539
[365]2540                                                        $tempdata = array();
2541                                                        unset($tempdata);
[431]2542                            break;
[365]2543                                        }
2544                                }
2545                        }
2546                }
[431]2547    }
[365]2548
[431]2549    function endElement($parser, $name)
[365]2550    {
[431]2551
[365]2552                if ($name == "CURRENTTIME")
2553                        $this->CurrentTime_ = $this->characterDataValue;
2554                if ($name == "CACHEDUNTIL")
2555                {
2556                        $this->CachedUntil_ = $this->characterDataValue;
[370]2557                        ApiCache::set( $this->API_characterID_ . '_Standings' , $this->characterDataValue);
[365]2558                }
2559    }
2560
[431]2561    function characterData($parser, $data)
[365]2562    {
2563                $this->characterDataValue = $data;
2564    }
[431]2565
[365]2566        function loaddata($keystring, $typestring)
2567    {
2568                $configvalue = $this->API_characterID_ . '_Standings';
[431]2569
[370]2570                $CachedTime = ApiCache::get($configvalue);
[365]2571                $UseCaching = config::get('API_UseCache');
[431]2572
[365]2573        $url = "http://api.eve-online.com/" . $typestring . "/Standings.xml.aspx" . $keystring;
[370]2574        $path = "/" . $typestring . "/Standings.xml.aspx";
[431]2575
[365]2576                // API Caching system, If we're still under cachetime reuse the last XML, if not download the new one. Helps with Bug hunting and just better all round.
2577                if ($CachedTime == "")
2578        {
2579                $CachedTime = "2005-01-01 00:00:00"; // fake date to ensure that it runs first time.
2580        }
[431]2581
[370]2582                if (is_file(getcwd().'/cache/api/'.$configvalue.'.xml'))
[365]2583                        $cacheexists = true;
2584                else
2585                        $cacheexists = false;
[431]2586
2587
[365]2588                if ((strtotime(gmdate("M d Y H:i:s")) - strtotime($CachedTime) > 0) || ($UseCaching == 1)  || !$cacheexists )// if API_UseCache = 1 (off) then don't use cache
2589        {
2590                $fp = fsockopen("api.eve-online.com", 80);
2591
2592                if (!$fp)
2593                {
2594                                $this->Output_ .= "Could not connect to API URL";
2595                } else {
2596                // request the xml
2597                fputs ($fp, "POST " . $path . " HTTP/1.0\r\n");
2598                fputs ($fp, "Host: api.eve-online.com\r\n");
2599                fputs ($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
2600                fputs ($fp, "User-Agent: PHPApi\r\n");
2601                fputs ($fp, "Content-Length: " . strlen($keystring) . "\r\n");
2602                fputs ($fp, "Connection: close\r\n\r\n");
2603                fputs ($fp, $keystring."\r\n");
2604
2605                // retrieve contents
2606                $contents = "";
2607                while (!feof($fp))
2608                {
2609                    $contents .= fgets($fp);
2610                }
2611
2612                // close connection
2613                fclose($fp);
2614
2615                $start = strpos($contents, "?>");
2616                if ($start !== FALSE)
2617                {
2618                        $contents = substr($contents, $start + strlen("\r\n\r\n"));
2619                        }
[431]2620
[365]2621                                if ($UseCaching == 0) // Save the file if we're caching (0 = true in Thunks world)
2622                                {
[370]2623                                        $file = fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'w+');
[365]2624                                fwrite($file, $contents);
2625                                fclose($file);
[370]2626                                        @chmod(getcwd().'/cache/api/'.$configvalue.'.xml',0666);
[431]2627                                }
2628                }
[365]2629                } else {
2630                        // re-use cached XML
[370]2631                        if ($fp = @fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'r')) {
2632                $contents = fread($fp, filesize(getcwd().'/cache/api/'.$configvalue.'.xml'));
[365]2633                        fclose($fp);
2634                } else {
[431]2635                                return "<i>error loading cached file ".$configvalue.".xml</i><br><br>";
[365]2636                }
2637                }
2638        return $contents;
2639    }
2640}
2641
2642// **********************************************************************************************************************************************
2643// ****************                                 API Character Sheet - char/CharacterSheet.xml.aspx                           ****************
2644// **********************************************************************************************************************************************
[370]2645// Incomplete - Does not read Certificates or Roles
[431]2646class API_CharacterSheet
2647{
[365]2648        function getCachedUntil()
2649        {
2650                return $this->CachedUntil_;
2651        }
[431]2652
[365]2653        function getCurrentTime()
2654        {
2655                return $this->CurrentTime_;
2656        }
[431]2657
[365]2658        function getSkills()
2659        {
2660                return $this->Skills_;
2661        }
[431]2662
[370]2663        // array 1-5 based on implant slot position. 6-10 don't seem to appear, presumably because Hardwirings do not affect skill training.
[431]2664        function getImplants()
[365]2665        {
2666                return $this->Implant_;
2667        }
[431]2668
[365]2669        function getIntelligence()
2670        {
2671                return $this->Intelligence_;
2672        }
[431]2673
[365]2674        function getMemory()
2675        {
2676                return $this->Memory_;
2677        }
[431]2678
[365]2679        function getCharisma()
2680        {
2681                return $this->Charisma_;
2682        }
[431]2683
[365]2684        function getPerception()
2685        {
2686                return $this->Perception_;
2687        }
[431]2688
[365]2689        function getWillpower()
2690        {
2691                return $this->Willpower_;
[431]2692        }
[365]2693        function getCharacterID()
2694        {
2695                return $this->CharacterID_;
2696        }
2697        function getName()
2698        {
2699                return $this->Name_;
2700        }
2701        function getRace()
2702        {
2703                return $this->Race_;
2704        }
2705        function getBloodLine()
2706        {
2707                return $this->BloodLine_;
2708        }
2709        function getGender()
2710        {
2711                return $this->Gender_;
2712        }
2713        function getCorporationName()
2714        {
2715                return $this->CorporationName_;
2716        }
2717        function getCorporationID()
2718        {
2719                return $this->CorporationID_;
2720        }
2721        function getCloneName()
2722        {
2723                return $this->CloneName_;
2724        }
2725        function getCloneSkillPoints()
2726        {
2727                return $this->CloneSkillPoints_;
2728        }
2729        function getBalance()
2730        {
2731                return $this->Balance_;
2732        }
2733        function fetchXML()
2734        {
2735                // is a player feed - take details from logged in user
2736                if (user::get('usr_pilot_id'))
2737        {
2738                        require_once('class.pilot.php');
2739                        $plt = new pilot(user::get('usr_pilot_id'));
2740                        $usersname = $plt->getName();
[431]2741
[365]2742                        $this->CharName_ = $usersname;  // $this->CharName_ is used later for config key value for caching
[431]2743
[365]2744                        $sql = 'select plts.plt_id, plts.plt_externalid from kb3_pilots plts where plts.plt_name = "' . $usersname . '"';
2745
2746                $qry = new DBQuery();
2747                        $qry->execute($sql);
2748                        $row = $qry->getRow();
2749
2750                $pilot_id = $row['plt_id'];
2751                $API_charID = $row['plt_externalid'];
2752
2753                if ( $pilot_id == 0 )
2754                        {
2755                        return "Something went wrong with finiding pilots external ID<br>";
2756                }
[431]2757
[365]2758                        $newsql = 'SELECT userID , apiKey FROM kb3_api_user WHERE charID = "' . $API_charID . '"';
2759                        $qry->execute($newsql);
2760                $userrow = $qry->getRow();
[431]2761
[365]2762                        $API_userID = $userrow['userID'];
2763                        $API_apiKey = $userrow['apiKey'];
[431]2764
[365]2765                        $myKeyString = "userID=" . $API_userID . "&apiKey=" . $API_apiKey . "&characterID=" . $API_charID;
[431]2766
[365]2767                        $data = $this->loaddata($myKeyString);
2768                } else {
2769                        return "You are not logged in.";
2770                }
2771
2772        $xml_parser = xml_parser_create();
2773        xml_set_object ( $xml_parser, $this );
2774        xml_set_element_handler($xml_parser, "startElement", "endElement");
2775        xml_set_character_data_handler ( $xml_parser, 'characterData' );
2776
2777        if (!xml_parse($xml_parser, $data, true))
[370]2778            return "<i>Error getting XML data from api.eve-online.com/CharacterSheet.xml.aspx  </i><br><br>";
[365]2779
2780        xml_parser_free($xml_parser);
[431]2781
[365]2782                return $this->html;
2783        }
[431]2784
2785        function startElement($parser, $name, $attribs)
[365]2786    {
[431]2787                if ($name == "ROW")
[365]2788        {
2789                        global $tempdata;
[431]2790
2791                        if (count($attribs))
[365]2792            {
[431]2793                foreach ($attribs as $k => $v)
[365]2794                {
[431]2795                    switch ($k)
[365]2796                    {
2797                                                case "TYPEID":
2798                                                        $tempdata['typeID'] = $v;
2799                                                        $tempdata['SkillName'] = gettypeIDname($v);
2800                                                        $tempdata['GroupID'] = getgroupID($v);
2801                                                        $tempdata['GroupName'] = getgroupIDname($tempdata['GroupID']);
2802                                                        $tempdata['Rank'] = gettypeIDrank($v);
[431]2803                            break;
[365]2804                                                case "SKILLPOINTS":
2805                                                        $tempdata['SkillPoints'] = $v;
[431]2806                            break;
[365]2807                                                case "LEVEL":
2808                                                        $tempdata['Level'] = $v;
[431]2809
[365]2810                                                        $this->Skills_[] = $tempdata;
[431]2811
[365]2812                                                        $tempdata = array();
2813                                                        unset($tempdata);
[431]2814                            break;
[365]2815                                                case "UNPUBLISHED": // unused skill eg. Black Market Trading
2816                                                        $tempdata = array();
2817                                                        unset($tempdata);
2818                            break;
2819                                        }
2820                                }
2821                        }
2822                }
[431]2823    }
[365]2824
[431]2825    function endElement($parser, $name)
[365]2826    {
2827                // Player Details
2828                if ($name == "CHARACTERID")
2829                        $this->CharacterID_ = $this->characterDataValue;
2830                if ($name == "NAME")
2831                        $this->Name_ = $this->characterDataValue;
2832                if ($name == "RACE")
2833                        $this->Race_ = $this->characterDataValue;
2834                if ($name == "BLOODLINE")
2835                        $this->BloodLine_ = $this->characterDataValue;
2836                if ($name == "GENDER")
2837                        $this->Gender_ = $this->characterDataValue;
2838                if ($name == "CORPORATIONNAME")
2839                        $this->CorporationName_ = $this->characterDataValue;
2840                if ($name == "CORPORATIONID")
2841                        $this->CorporationID_ = $this->characterDataValue;
2842                if ($name == "CLONENAME")
[431]2843                        $this->CloneName_ = $this->characterDataValue;
[365]2844                if ($name == "CLONESKILLPOINTS")
2845                        $this->CloneSkillPoints_ = $this->characterDataValue;
2846                if ($name == "BALANCE")
[431]2847                        $this->Balance_ = $this->characterDataValue;
2848
[365]2849                // Augmentations
2850                if ($name == "AUGMENTATORNAME")
2851                        $tempaug['Name'] = $this->characterDataValue;
2852                if ($name == "AUGMENTATORVALUE")
2853                        $tempaug['Value'] = $this->characterDataValue;
[431]2854
[365]2855                if ($name == "PERCEPTIONBONUS")
2856                {
2857                        $this->Implant_[1] = $tempaug;
[431]2858
[365]2859                        $tempaug = array();
2860                        unset($tempaug);
2861                }
2862                if ($name == "MEMORYBONUS")
2863                {
2864                        $this->Implant_[2] = $tempaug;
[431]2865
[365]2866                        $tempaug = array();
2867                        unset($tempaug);
2868                }
2869                if ($name == "WILLPOWERBONUS")
2870                {
2871                        $this->Implant_[3] = $tempaug;
[431]2872
[365]2873                        $tempaug = array();
2874                        unset($tempaug);
2875                }
2876                if ($name == "INTELLIGENCEBONUS")
2877                {
2878                        $this->Implant_[4] = $tempaug;
[431]2879
[365]2880                        $tempaug = array();
2881                        unset($tempaug);
2882                }
2883                if ($name == "CHARISMABONUS")
2884                {
2885                        $this->Implant_[5] = $tempaug;
[431]2886
[365]2887                        $tempaug = array();
2888                        unset($tempaug);
2889                }
[431]2890
[365]2891                // Attributes
2892                if ($name == "INTELLIGENCE")
2893                        $this->Intelligence_ = $this->characterDataValue;
2894                if ($name == "MEMORY")
2895                        $this->Memory_ = $this->characterDataValue;
2896                if ($name == "CHARISMA")
[431]2897                        $this->Charisma_ = $this->characterDataValue;
[365]2898                if ($name == "PERCEPTION")
2899                        $this->Perception_ = $this->characterDataValue;
2900                if ($name == "WILLPOWER")
2901                        $this->Willpower_ = $this->characterDataValue;
[431]2902
[365]2903                if ($name == "CURRENTTIME")
2904                        $this->CurrentTime_ = $this->characterDataValue;
2905                if ($name == "CACHEDUNTIL")
2906                {
2907                        $this->CachedUntil_ = $this->characterDataValue;
[370]2908                        //ApiCache::set('API_eve_RefTypes' , $this->characterDataValue);
2909                        ApiCache::set( $this->CharName_ . '_CharacterSheet' , $this->characterDataValue);
[365]2910                }
2911    }
2912
[431]2913    function characterData($parser, $data)
[365]2914    {
2915                $this->characterDataValue = $data;
2916    }
2917
2918        function loaddata($keystring)
2919    {
2920                $configvalue = $this->CharName_ . '_CharacterSheet';
[431]2921
[370]2922                $CachedTime = ApiCache::get($configvalue);
[365]2923                $UseCaching = config::get('API_UseCache');
[431]2924
[365]2925        $url = "http://api.eve-online.com/char/CharacterSheet.xml.aspx" . $keystring;
2926
2927        $path = '/char/CharacterSheet.xml.aspx';
[431]2928
[365]2929                // API Caching system, If we're still under cachetime reuse the last XML, if not download the new one. Helps with Bug hunting and just better all round.
2930                if ($CachedTime == "")
2931        {
2932                $CachedTime = "2005-01-01 00:00:00"; // fake date to ensure that it runs first time.
2933        }
[431]2934
[370]2935                if (is_file(getcwd().'/cache/api/'.$configvalue.'.xml'))
[365]2936                        $cacheexists = true;
2937                else
2938                        $cacheexists = false;
[431]2939
[370]2940                // if API_UseCache = 1 (off) then don't use cache
2941                if ((strtotime(gmdate("M d Y H:i:s")) - strtotime($CachedTime) > 0) || ($UseCaching == 1)  || !$cacheexists )
[365]2942        {
2943                $fp = fsockopen("api.eve-online.com", 80);
2944
2945                if (!$fp)
2946                {
2947