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

Revision 431, 156.5 KB (checked in by kovell, 13 years ago)

portraits are fetched from CCP using cURL and lower timeouts. mysqli-based boards use only one connection, eveapi reverted to standard 3.3

Line 
1<?php
2// Report all PHP errors (bitwise 63 may be used in PHP 3)
3@error_reporting(E_ALL ^ E_NOTICE);
4define ("APIVERSION", "V3.3");
5
6//
7// Eve-Dev API Killmail parser by Captain Thunk! (ISK donations are all gratefully received)
8//
9
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" );
16
17// Checks for configuration of files and folders
18if (!file_exists("cache/api"))
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        }
25}
26
27// **********************************************************************************************************************************************
28// ****************                                    API KillLog - /corp/Killlog.xml.aspx                                      ****************
29// **********************************************************************************************************************************************
30
31class API_KillLog
32{
33    function Import($keystring, $typestring, $keyindex)
34        {
35                $this->mailcount_ = 0;
36                $this->ignoredmails_ = 0;
37                $this->malformedmails_ = 0;
38                $this->verified_ = 0;
39                $this->totalmails_ = 0;
40                $this->errorcode_ = 0;
41                $this->Output_ = "";
42                $this->isContainer = false;
43                $this->hasdownloaded_ = false;
44                $this->errortext_ = "";
45                $this->CachedUntil_ = "";
46
47        // reduces strain on DB
48                if(function_exists("set_time_limit"))
49                set_time_limit(0);
50
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');
57                $this->API_CacheTime_ = ApiCache::get('API_CachedUntil_' . $keyindex);
58                $this->API_UseCaching_ = config::get('API_UseCache');
59                $this->API_CCPErrorCorrecting = config::get('API_CCPErrorCorrecting');
60        $this->keyindex_ = $keyindex;
61
62
63                // Initialise for error correcting and missing itemID resolution
64                $this->myIDName = new API_IDtoName();
65                $this->myNameID = new API_NametoID();
66
67        $lastdatakillid = 1;
68        $currentdatakillid = 0;
69
70                // 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.
71                if ($this->API_CacheTime_ == "")
72        {
73                $this->API_CacheTime = "2005-01-01 00:00:00"; // fake date to ensure that it runs first time.
74        }
75
76                if (is_file(getcwd().'/cache/api/'.config::get('API_Name_'.$keyindex).'_KillLog.xml'))
77                        $cacheexists = true;
78                else
79                        $cacheexists = false;
80
81                // if API_UseCache = 1 (off) then don't use cache
82        if ((strtotime(gmdate("M d Y H:i:s")) - strtotime($this->API_CacheTime_) > 0) || ($this->API_UseCaching_ == 1)  || !$cacheexists )
83        {
84            // Load new XML
85                        $logsource = "New XML";
86                        $this->Output_ .= "<i>Downloading latest XML file for " . config::get('API_Name_'.$keyindex) . "</i><br><br>";
87                        $data = '<myxml thunkage="1">';
88                do {
89                $data .= $this->loaddata($currentdatakillid, $keystring, $typestring);
90                $lastdatakillid = $currentdatakillid;
91                $currentdatakillid = $this->getlastkillid($data);
92                } while ( $lastdatakillid != $currentdatakillid );
93                $data .= '</myxml>';
94
95                        if ( ( $this->API_UseCaching_ ) == 0 )//&& ( $this->iscronjob_ == false ) )
96                        {
97                                // save the file if no errors have occurred
98                                if ($this->errorcode_ == 0)
99                                {
100                                        $file = fopen(getcwd().'/cache/api/'.config::get('API_Name_'.$keyindex).'_KillLog.xml', 'w+');
101                                fwrite($file, $data);
102                                fclose($file);
103                                        //chmod the file so it can be altered by cronjobs in future
104                                        @chmod(getcwd().'/cache/api/'.config::get('API_Name_'.$keyindex).'_KillLog.xml',0666);
105                                }
106                        }
107        } else {
108            // re-use cached XML
109                        $this->Output_ .= "<i>Using cached XML file for " . config::get('API_Name_'.$keyindex) . "</i><br><br>";
110                        $logsource = "Cache";
111
112                        if ($fp = @fopen(getcwd().'/cache/api/'.config::get('API_Name_'.$keyindex).'_KillLog.xml', 'r')) {
113                $data = fread($fp, filesize(getcwd().'/cache/api/'.config::get('API_Name_'.$keyindex).'_KillLog.xml'));
114                        fclose($fp);
115                } else {
116                                return "<i>error loading cached file ".config::get('API_Name_'.$keyindex)."_KillLog.xml</i><br><br>";
117                }
118        }
119
120        $xml_parser = xml_parser_create();
121        xml_set_object ( $xml_parser, $this );
122        xml_set_element_handler($xml_parser, "startElement", "endElement");
123        xml_set_character_data_handler ( $xml_parser, 'characterData' );
124
125        if (!xml_parse($xml_parser, $data, true))
126            return $this->Output_ .= "<i>Error getting XML data from api.eve-online.com</i><br><br>";
127
128        if ( strlen($data) == 28 )
129            return $this->Output_ .= "<i>Error contacting api.eve-online.com</i><br><br>";
130
131        xml_parser_free($xml_parser);
132
133        if ( ($this->hasdownloaded_ == false) && ($this->errortext_ != "") )
134                {
135            $this->Output_ .= "<font color = \"#FF0000\">".$this->errortext_ . "</font><br>";
136                        $logsource = "Error";
137                }
138
139        if ($this->mailcount_)
140            $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>";
141        else
142            $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>";
143
144                // Write to kb3_apilog
145                $qry = new DBQuery();
146                if ($this->iscronjob_)
147                        $logtype = "Cron Job";
148                else
149                        $logtype = "Manual";
150
151        $qry->execute( "insert into kb3_apilog  values( '" . KB_SITE . "', '"
152                                                                                                                . config::get('API_Name_'.$keyindex) . "',"
153                                                                                                                . $this->mailcount_ . ","
154                                                                                                                . $this->malformedmails_ . ","
155                                                                                                                . $this->ignoredmails_ . ","
156                                                                                                                . $this->verified_ . ","
157                                                                                                                . $this->totalmails_ . ",'"
158                                                                                                                . $logsource . "','"
159                                                                                                                . $logtype . "',now() )" );
160
161        return $this->Output_;
162
163    }
164
165    function startElement($parser, $name, $attribs)
166    {
167        if ($name == "ROWSET")
168        {
169                        //echo $this->rowsetCounter_ . " ";
170            if (($this->pname_ == "") && ($this->typeid_ != "0"))
171            {
172                                $this->isContainer = true;
173                                // this is to catch containers that spawn a new rowset so are missed off loot
174                if ($this->qtydropped_ !=0)
175                                {
176                    // dropped items
177                    $this->droppeditems_['typeid'][] = $this->typeid_;
178                    $this->droppeditems_['qty'][] = $this->qtydropped_;
179                    //if ($this->isContainer)
180                                        //{
181                                        //      $this->droppeditems_['flag'][] = -1;
182                                        //} else {
183                                                $this->droppeditems_['flag'][] = $this->itemFlag_;
184                                        //}
185                }
186                if ($this->qtydestroyed_ != 0)
187                                {
188                    // destroyed items
189                    $this->destroyeditems_['typeid'][] =$this->typeid_;
190                    $this->destroyeditems_['qty'][] = $this->qtydestroyed_;
191                   // if ($this->isContainer)
192                                        //{
193                                        //      $this->destroyeditems_['flag'][] = -1;
194                                        //} else {
195                                                $this->destroyeditems_['flag'][] = $this->itemFlag_;
196                                        //}
197                }
198                $this->typeid_ = 0;
199                $this->itemFlag_ = 0;
200                $this->qtydropped_ = 0;
201                $this->qtydestroyed_ = 0;
202            }
203                        // goes after so container itself doesn't count as "(in countainer)
204
205        }
206
207        if (count($attribs))
208        {
209            foreach ($attribs as $k => $v)
210                        {
211                switch ($k)
212                                {
213                    case "CHARACTERID":
214                        $this->charid_ = $v;
215                        break;
216                    case "CHARACTERNAME":
217                                                $this->pname_ = $v;
218
219                                                // Error Correction is on (0 = on, 1 = off(I know, just don't ask))
220                                                if ( $this->API_CCPErrorCorrecting == 0 )
221                                                {
222                                                        if ( ($this->charid_ != "0" ) && (strlen($this->pname_) == 0) )
223                                                        {
224                                                                // name is blank but ID is valid - convert ID into name
225                                                                $this->myIDName->clear();
226                                                                $this->myIDName->setIDs($this->charid_);
227                                                                $this->Output_ .= $this->myIDName->fetchXML();
228                                                                $myNames = $this->myIDName->getIDData();
229                                                                $this->pname_ = $myNames[0]['name'];
230                                                        }
231                                                }
232                        break;
233                                        case "CORPORATIONID":
234                        $this->corporationID_ = $v;
235                                                break;
236                    case "CORPORATIONNAME":
237                                                $this->corporation_ = $v;
238
239                                                // Error Correction is on (0 = on, 1 = off(I know, just don't ask))
240                                                if ( $this->API_CCPErrorCorrecting == 0 )
241                                                {
242                                                        if ( ($this->corporationID_ != "0" ) && (strlen($this->corporation_) == 0) )
243                                                        { // name is blank but ID is valid - convert ID into name
244                                                                $this->myIDName->clear();
245                                                                $this->myIDName->setIDs($this->corporationID_);
246                                                                $this->Output_ .= $this->myIDName->fetchXML();
247                                                                $myNames = $this->myIDName->getIDData();
248                                                                $this->corporation_ = $myNames[0]['name'];
249                                                        }
250                                                }
251                        break;
252                    case "ALLIANCEID":
253                        $this->allianceID_ = $v;
254                        break;
255                    case "ALLIANCENAME":
256                                                $this->alliance_ = $v;
257
258                                                // Error Correction is on (0 = on, 1 = off(I know, just don't ask))
259                                                //if ( $this->API_CCPErrorCorrecting == 0 )
260                                                // conditional branch removed - ALWAYS fix alliance name bugs
261                                                {
262                                                        if ( ($this->allianceID_ != "0" ) && (strlen($this->alliance_) == 0) )
263                                                        { // name is blank but ID is valid - convert ID into name
264                                                                $this->myIDName->clear();
265                                                                $this->myIDName->setIDs($this->allianceID_);
266                                                                $this->Output_ .= $this->myIDName->fetchXML();
267                                                                $myNames = $this->myIDName->getIDData();
268                                                                $this->alliance_ = $myNames[0]['name'];
269                                                        }
270                                                }
271
272                                                if (strlen($this->alliance_) == 0)
273                                                        $this->alliance_ = "NONE";
274                        break;
275                    case "DAMAGETAKEN":
276                        $this->damagetaken_ = $v;
277                        break;
278                    case "DAMAGEDONE":
279                        $this->damagedone_ = $v;
280                        break;
281                    case "SHIPTYPEID":
282                        if ($v == 0)
283                                                {
284                            $this->shipname_ = "Unknown";
285                                                } else {
286                            $this->shipname_ = gettypeIDname($v);
287                        }
288                        break;
289                    case "FINALBLOW":
290                        $this->finalblow_ = $v;
291                        break;
292                    case "SECURITYSTATUS":
293                        //$this->security_ = $v;
294                                                $this->security_ = round($v,2); // allows number to pass with strict settings (number is usually much longer than 5 chars as defined in DB)
295                        break;
296                    case "WEAPONTYPEID":
297                        $this->weapon_ = gettypeIDname($v);
298                        break;
299                    // for items
300                    case "TYPEID":
301                        $this->typeid_ = gettypeIDname($v);
302
303                                                // Missing Item correction
304                                                if ($this->typeid_ == "")
305                                                {
306                                                        $this->myIDName->clear();
307                                                        $this->myIDName->setIDs($v);
308                                                        $this->Output_ .= $this->myIDName->fetchXML();
309                                                        $myNames = $this->myIDName->getIDData();
310                                                        //$this->typeid_ = "Item missing from DB: " . $myNames[0]['name'];
311                                                        $this->typeid_ = $myNames[0]['name'];
312                                                }
313                        break;
314                    case "FLAG":
315                        $this->itemFlag_ = $v;
316                        break;
317                    case "QTYDROPPED":
318                        $this->qtydropped_ = $v;
319                        break;
320                    case "QTYDESTROYED":
321                        $this->qtydestroyed_ = $v;
322                        break;
323
324                    // for system/kill mail details (start of mail)
325                    case "KILLID":
326                        // 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
327                        // of the CCP API cargo bug - using function, avoids the repetition
328                        if ($this->beforekillid_ != 0)
329                        {
330                            $this->parseendofmail();
331                        }
332                        $this->beforekillid_ = $v;
333                                                $this->killid_ = $v; // added v2.6 for help tracing erroneous mails
334                                                $this->totalmails_++; // Count total number of mails in XML feed
335                                                if ($this->isKillIDVerified($v) != null)
336                                                {
337                                                        $this->killmailExists_ = true;
338                                                        return;
339                                                } else {
340                                                        $this->killmailExists_ = false;
341                                                }
342                        break;
343                    case "SOLARSYSTEMID": // convert to system name and fetch system security - DONE
344                        $sql = 'select sys.sys_name, sys.sys_sec from kb3_systems sys where sys.sys_eve_id = '.$v;
345
346                        $qry = new DBQuery();
347                        $qry->execute($sql);
348                        $row = $qry->getRow();
349
350                        $this->systemname_ = $row['sys_name'];
351                        $mysec = $row['sys_sec'];
352                        if ($mysec <= 0)
353                            $this->systemsecurity_ = number_format(0.0, 1);
354                        else
355                            $this->systemsecurity_ = number_format(round($mysec, 1), 1);
356                        break;
357                    case "MOONID": // only given with POS related stuff - unanchored mods however, do not have a moonid.
358                                                $this->moonid_ = $v;
359
360                                                $this->moonname_ = getMoonName($v);
361                                                // Missing Moon DB correction
362                                                if (($this->moonname_ == "") && ($this->moonid_ != 0))
363                                                {
364                                                        $this->myIDName->clear();
365                                                        $this->myIDName->setIDs($v);
366                                                        $this->Output_ .= $this->myIDName->fetchXML();
367                                                        $myNames = $this->myIDName->getIDData();
368                                                        //$this->typeid_ = "Item missing from DB: " . $myNames[0]['name'];
369                                                        $this->moonname_ = $myNames[0]['name'];
370                                                }
371                        break;
372                    case "KILLTIME": // Time Kill took place
373                        $this->killtime_ = $v;
374                        break;
375                                        case "FACTIONID": // Faction ID
376                        $this->factionid_ = $v;
377                        break;
378                                        case "FACTIONNAME": // Faction Name
379                                                if ( $v == "" ) {
380                                                        $this->factionname_ = "NONE";
381                        } else {
382                                                        $this->factionname_ = $v;
383                                                }
384                        break;
385                                        case "CODE": // error code
386                                                $this->errorcode_ .= $v;
387                                                break;
388                }
389            }
390        }
391    }
392
393    function endElement($parser, $name)
394    {
395        switch ($name)
396        {
397                        case "ROWSET":
398                                $this->isContainer = false;
399                                break;
400            case "VICTIM":
401                $this->hasdownloaded_ = true;
402                // 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
403                if ($this->moonid_ != 0 && $this->pname_ == "")
404                {
405                    $this->pname_ = $this->moonname_;
406                    //$this->shipname_ = "Unknown"; // this is done else mail will not parse
407                    $this->isposkill_ = true;
408                } elseif (($this->moonid_ == 0) && ($this->pname_ == "") && ($this->charid_ != 0)) {
409                                        // catches unanchored POS modules - as moon is unknown, we will use system name instead
410                                        $this->pname_ = $this->systemname_;
411                    $this->isposkill_ = true;
412                                } else {
413                    $this->isposkill_ = false;
414                }
415                // print victim header
416                $this->killmail_ = substr(str_replace('-', '.' , $this->killtime_), 0, 16) . "\r\n\r\n";
417                                if ($this->isposkill_ == false )
418                        $this->killmail_ .= "Victim: ".$this->pname_ . "\r\n"; // This line would not appear on a POS mail
419                                $this->killmail_ .= "Corp: ".$this->corporation_ . "\r\n";
420                $this->killmail_ .= "Alliance: ".$this->alliance_ . "\r\n";
421                                $this->killmail_ .= "Faction: ".$this->factionname_ . "\r\n";
422                $this->killmail_ .= "Destroyed: ".$this->shipname_ . "\r\n";
423                                if ($this->isposkill_ == true )
424                                        $this->killmail_ .= "Moon: ".$this->moonname_ . "\r\n"; // This line does appear on a POS mail
425                $this->killmail_ .= "System: ".$this->systemname_ . "\r\n";
426                $this->killmail_ .= "Security: ".$this->systemsecurity_ . "\r\n";
427                $this->killmail_ .= "Damage Taken: ".$this->damagetaken_ . "\r\n\r\n";
428                $this->killmail_ .= "Involved parties:\r\n\r\n";
429
430                if ( config::get('API_Update') == 0 )
431                {
432                                        // update Victim portrait while we're here
433                    $sql = 'select plts.plt_id, plts.plt_externalid from kb3_pilots plts where plts.plt_name = "' . $this->pname_ . '"';
434
435                                        $qry = new DBQuery();
436                    $qry->execute($sql);
437                    $row = $qry->getRow();
438                    if ($qry->recordCount() != 0)
439                    {
440                        $pilot_id = $row['plt_id'];
441                        $pilot_external_id = $row['plt_externalid'];
442
443                        if ( $pilot_external_id == 0 && $pilot_id != 0)
444                        {
445                                                        // update DB with ID
446                            $qry->execute("update kb3_pilots set plt_externalid = " . intval($this->charid_) . "
447                                            where plt_id = " . $pilot_id);
448                        }
449                    }
450                }
451
452                                // update crp_external_id
453                                Update_CorpID($this->corporation_, $this->corporationID_);
454                                // update all_external_id
455                                if ($this->allianceID_ != 0)
456                                        Update_AllianceID($this->alliance_, $this->allianceID_);
457
458                // set victim corp and alliance for FF check
459                $this->valliance_ = $this->alliance_;
460                $this->vcorp_ = $this->corporation_;
461
462                // now clear these
463                //$this->killtime_ = "";
464                $this->pname_ = "";
465                $this->alliance_ = "";
466                                $this->factionname_ = "";
467                $this->corporation_ = "";
468                $this->destroyed_ = 0;
469                $this->systemname_ = "";
470                $this->systemsecurity_ = 0;
471                $this->damagetaken_ = 0;
472                $this->charid_ = 0;
473                                $this->moonid_ = 0;
474                                $this->mooname_ = 0;
475                                $this->corporationID_ = 0;
476                                $this->allianceID_ = 0;
477                break;
478            case "ROW":
479                if ( $this->typeid_ != "0" )
480                {
481                                        // it's cargo
482                    if ($this->qtydropped_ !=0)
483                    {
484                        // dropped items
485                        $this->droppeditems_['typeid'][] = $this->typeid_;
486                        $this->droppeditems_['qty'][] = $this->qtydropped_;
487                                                if ($this->isContainer)
488                                                {
489                                                        $this->droppeditems_['flag'][] = -1;
490                                                } else {
491                                                        $this->droppeditems_['flag'][] = $this->itemFlag_;
492                                                }
493                                        }
494                    if ($this->qtydestroyed_ != 0)
495                    {
496                    // destroyed items
497                        $this->destroyeditems_['typeid'][] = $this->typeid_;
498                        $this->destroyeditems_['qty'][] = $this->qtydestroyed_;
499                        if ($this->isContainer)
500                                                {
501                                                        $this->destroyeditems_['flag'][] = -1;
502                                                } else {
503                                                        $this->destroyeditems_['flag'][] = $this->itemFlag_;
504                                                }
505                    }
506                    $this->typeid_ = 0;
507                    $this->itemFlag_ = 0;
508                    $this->qtydropped_ = 0;
509                    $this->qtydestroyed_ = 0;
510                }
511                                // using corporation_ not pname_ as NPCs don't have a name *** CHANGED to corporationID 16/03/2009 to catch 'sleeper' NPCs
512                if ($this->corporationID_ != 0)
513                {
514                                        // it's an attacker
515                    $this->attackerslist_['name'][] = $this->pname_;
516                    $this->attackerslist_['finalblow'][] = $this->finalblow_;
517                    $this->attackerslist_['security'][] = $this->security_;
518                                        $this->attackerslist_['corporation'][] = $this->corporation_;
519                    $this->attackerslist_['alliance'][] = $this->alliance_;
520                    $this->attackerslist_['faction'][] = $this->factionname_;
521                    $this->attackerslist_['shiptypeid'][] = $this->shipname_;
522                    $this->attackerslist_['weapon'][] = $this->weapon_;
523                    $this->attackerslist_['damagedone'][] = $this->damagedone_;
524
525                    if ( config::get('API_Update') == 0 )
526                    {
527                                                // update Attacker portrait while we're here
528                        $sql = 'select plts.plt_id, plts.plt_externalid from kb3_pilots plts where plts.plt_name = "' . $this->pname_ . '"';
529
530                        $qry = new DBQuery();
531                        $qry->execute($sql);
532                        $row = $qry->getRow();
533                        if ($qry->recordCount() != 0)
534                        {
535                            $pilot_id = $row['plt_id'];
536                            $pilot_external_id = $row['plt_externalid'];
537
538                            if ( $pilot_external_id == 0 && $pilot_id != 0 )
539                            {
540                                                                // update DB with ID
541                                $qry->execute("update kb3_pilots set plt_externalid = " . intval($this->charid_) . "
542                                                where plt_id = " . $pilot_id);
543                            }
544                        }
545                    }
546
547                                        // update crp_external_id
548                                        Update_CorpID($this->corporation_, $this->corporationID_);
549                                        // update all_external_id
550                                        if ($this->allianceID_ != 0)
551                                                Update_AllianceID($this->alliance_, $this->allianceID_);
552
553                    $this->pname_ = "";
554                    $this->finalblow_ = 0;
555                    $this->security_ = 0;
556                    $this->alliance_ = "";
557                                        $this->factionname_ = "";
558                    $this->corporation_ = "";
559                    $this->shipname_ = 0;
560                    $this->weapon_ = 0;
561                    $this->damagedone_ = 0;
562                    $this->charid_ = 0;
563                                        $this->corporationID_ = 0;
564                                        $this->allianceID_ = 0;
565                }
566                break;
567            case "RESULT":
568                // reset beforekillid to allow processing of more chunks of data I've placed into $data
569                $this->beforekillid_ = 0;
570
571                // does last killmail
572                if ($this->hasdownloaded_)
573                                {
574                                        // catch to prevent processing without any mails
575                    $this->parseendofmail();
576                }
577                break;
578            case "MYXML":
579                // end of data xml, process cachedtime here
580                //$ApiCache->set('API_CachedUntil_' . $this->keyindex_, $this->cachetext_);
581                break;
582                        case "ERROR": //  Error Message
583                                if ($this->errortext_ == "")
584                                {
585                                        $this->errortext_ .= $this->characterDataValue;
586                                }
587                                break;
588                        case "CURRENTTIME":
589                                $this->CurrentTime_ = $this->characterDataValue;
590                                break;
591                        case "CACHEDUNTIL":
592                                // kill log can be several xml sheets stuck together, we only want the first CachedUntil_
593                                if ($this->CachedUntil_ == "")
594                                {
595                                        // Do not save cache key if this is an error sheet
596                                        $this->CachedUntil_ = $this->characterDataValue;
597                                        ApiCache::set('API_CachedUntil_' . $this->keyindex_, $this->CachedUntil_);
598                                }
599                                break;
600        }
601    }
602
603    function characterData($parser, $data)
604    {
605                $this->characterDataValue = $data;
606    }
607
608    function parseendofmail()
609    {
610            // print attacks
611                $attackercounter = count($this->attackerslist_['name']);
612        // sort array into descending damage
613        if ($attackercounter != 0 )
614        {
615                array_multisort($this->attackerslist_['damagedone'], SORT_NUMERIC, SORT_DESC,
616                $this->attackerslist_['name'], SORT_ASC, SORT_STRING,
617                $this->attackerslist_['finalblow'], SORT_NUMERIC, SORT_DESC,
618                $this->attackerslist_['security'], SORT_NUMERIC, SORT_DESC,
619                                $this->attackerslist_['corporation'], SORT_ASC, SORT_STRING,
620                $this->attackerslist_['alliance'], SORT_ASC, SORT_STRING,
621                $this->attackerslist_['faction'], SORT_ASC, SORT_STRING,
622                $this->attackerslist_['shiptypeid'], SORT_ASC, SORT_STRING,
623                $this->attackerslist_['weapon'], SORT_ASC, SORT_STRING );
624        }
625
626        // Initialise some flags to use
627        $hasplayersonmail = false;
628        $this->corpFF_ = true;
629        $this->allianceFF_ = true;
630        $poswasfriendly = false;
631
632        // catch for victim being in no alliance
633        if ($this->valliance_ == "NONE")
634                $this->allianceFF_ = false;
635
636        for ($attackerx = 0; $attackerx < $attackercounter; $attackerx++)
637        {
638                // if NPC (name will be "") then set pname_ as corporation_ for mail parsing
639                if  ($this->attackerslist_['name'][$attackerx] == "")
640                {
641                                // fix for Sleepers ("Unknown")
642                                if ($this->attackerslist_['corporation'][$attackerx] == "")
643                                {
644                                        $npccorpname = "Unknown";
645                                } else {
646                                        $npccorpname = $this->attackerslist_['corporation'][$attackerx];
647                                }
648                $this->killmail_ .= "Name: ".$this->attackerslist_['shiptypeid'][$attackerx] ." / ".$npccorpname."\r\n";
649                $this->killmail_ .= "Damage Done: ".$this->attackerslist_['damagedone'][$attackerx]."\r\n";
650                $this->corpFF_ = false;
651                $this->allianceFF_ = false;
652            } else {
653                $hasplayersonmail = true;
654                $this->killmail_ .= "Name: ".$this->attackerslist_['name'][$attackerx];
655                if ($this->attackerslist_['finalblow'][$attackerx] == 1)
656                {
657                    $this->killmail_ .= " (laid the final blow)";
658                }
659                $this->killmail_ .= "\r\n";
660
661                $this->killmail_ .= "Security: ".$this->attackerslist_['security'][$attackerx]."\r\n";
662                                $this->killmail_ .= "Corp: ".$this->attackerslist_['corporation'][$attackerx]."\r\n";
663                $this->killmail_ .= "Alliance: ".$this->attackerslist_['alliance'][$attackerx]."\r\n";
664                $this->killmail_ .= "Faction: ".$this->attackerslist_['faction'][$attackerx]."\r\n";
665                $this->killmail_ .= "Ship: ".$this->attackerslist_['shiptypeid'][$attackerx]."\r\n";
666                $this->killmail_ .= "Weapon: ".$this->attackerslist_['weapon'][$attackerx]."\r\n";
667                $this->killmail_ .= "Damage Done: ".$this->attackerslist_['damagedone'][$attackerx]."\r\n";
668
669                // set Friendly Fire matches
670                if ($this->attackerslist_['alliance'][$attackerx] != $this->valliance_)
671                        $this->allianceFF_ = false;
672                if ($this->attackerslist_['corporation'][$attackerx] != $this->vcorp_)
673                        $this->corpFF_ = false;
674            }
675            $this->killmail_ .= "\r\n";
676        } //end for next loop
677
678        // clear attackerslist
679        $this->attackerslist_ = array();
680
681        if (count($this->destroyeditems_['qty']) != 0)
682        {
683            $this->killmail_ .= "\r\nDestroyed items:\r\n\r\n";
684
685            $counter = count($this->destroyeditems_['qty']);
686            for ($x = 0; $x < $counter; $x++)
687            {
688                if ($this->destroyeditems_['qty'][$x] > 1)
689                {
690                                        // show quantity
691                        $this->killmail_ .= $this->destroyeditems_['typeid'][$x].", Qty: ".$this->destroyeditems_['qty'][$x];
692                } else {
693                                        // just the one
694                        $this->killmail_ .= $this->destroyeditems_['typeid'][$x];
695                }
696
697                if ($this->destroyeditems_['flag'][$x] == 5) {
698                        $this->killmail_ .= " (Cargo)";
699                } elseif ($this->destroyeditems_['flag'][$x] == 87) {
700                        $this->killmail_ .= " (Drone Bay)";
701                }  elseif ($this->destroyeditems_['flag'][$x] == -1)
702                                {
703                                        $this->killmail_ .= " (In Container)";
704                                }
705                $this->killmail_ .= "\r\n";
706            }
707        }
708
709        if (count($this->droppeditems_['qty']) != 0)
710        {
711            $this->killmail_ .= "\r\nDropped items:\r\n\r\n";
712
713            $counter = count($this->droppeditems_['qty']);
714            for ($x = 0; $x < $counter; $x++)
715            {
716                if ($this->droppeditems_['qty'][$x] > 1)
717                {
718                                        // show quantity
719                    $this->killmail_ .= $this->droppeditems_['typeid'][$x].", Qty: ".$this->droppeditems_['qty'][$x];
720                } else {
721                                        // just the one
722                    $this->killmail_ .= $this->droppeditems_['typeid'][$x];
723                }
724
725                if ($this->droppeditems_['flag'][$x] == 5)
726                {
727                        $this->killmail_ .= " (Cargo)";
728                } elseif ($this->droppeditems_['flag'][$x] == 87)
729                {
730                        $this->killmail_ .= " (Drone Bay)";
731                } elseif ($this->droppeditems_['flag'][$x] == -1)
732                                {
733                                        $this->killmail_ .= " (In Container)";
734                                }
735                $this->killmail_ .= "\r\n";
736            }
737        }
738
739        // If ignoring friendly POS Structures
740        if ($this->isposkill_) {
741        // is board an alliance board?
742                if ( ALLIANCE_ID == 0)
743            {
744                                // no it's set as a corp
745                $thiscorp = new Corporation(CORP_ID);
746                if ( $this->vcorp_ == $thiscorp->getName() )
747                        $poswasfriendly = true;
748            } else {
749                                // yes it's an Alliance board
750                $thisalliance = new Alliance(ALLIANCE_ID);
751                if ( $this->valliance_ == $thisalliance->getName() )
752                    $poswasfriendly = true;
753            }
754        }
755
756        if ( ( $this->API_IgnoreFriendPos_ == 0 ) &&  ( $poswasfriendly ) &&  ( $this->isposkill_ ) )
757        {
758                if ( ( $this->API_NoSpam_ == 0 ) && ( $this->iscronjob_ ) )
759                {
760                // do not write to $this->Output_
761            } else {
762                $this->Output_ .= "Killmail ID:".$this->killid_." containing friendly POS structure has been ignored.<br>";
763            }
764            $this->ignoredmails_++;
765        } elseif ( ( $this->API_IgnoreEnemyPos_ == 0 ) &&  ( !$poswasfriendly ) &&  ( $this->isposkill_ ) )
766        {
767                if ( ( $this->API_NoSpam_ == 0 ) && ( $this->iscronjob_ ) )
768            {
769                // do not write to $this->Output_
770            } else {
771                $this->Output_ .= "Killmail ID:".$this->killid_." containing enemy POS structure been ignored.<br>";
772            }
773            $this->ignoredmails_++;
774        } elseif ( ( $this->API_IgnoreNPC_ == 0 ) && ($hasplayersonmail == false) )
775        {
776            if ( ( $this->API_NoSpam_ == 0 ) && ( $this->iscronjob_ ) )
777            {
778                // do not write to $this->Output_
779            } else {
780                $this->Output_ .= "Killmail ID:".$this->killid_." containing only NPCs has been ignored.<br>";
781            }
782            $this->ignoredmails_++;
783        } elseif ( ( $this->API_IgnoreCorpFF_ == 0 ) && ($this->corpFF_ == true ) )
784        {
785            if ( ( $this->API_NoSpam_ == 0 ) && ( $this->iscronjob_ ) )
786            {
787                // do not write to $this->Output_
788                } else {
789                $this->Output_ .= "Killmail ID:".$this->killid_." containing corporation friendly fire has been ignored.<br>";
790            }
791            $this->ignoredmails_++;
792        } elseif ( ( $this->API_IgnoreAllianceFF_ == 0 ) && ($this->allianceFF_ == true ) )
793        {
794            if ( ( $this->API_NoSpam_ == 0 ) && ( $this->iscronjob_) )
795            {
796                 // do not write to $this->Output_
797            } else {
798                $this->Output_ .= "Killmail ID:".$this->killid_." containing alliance friendly fire has been ignored.<br>";
799            }
800            $this->ignoredmails_++;
801        } else {
802            $this->postimportmail();
803        }
804
805        // clear destroyed/dropped arrays
806        unset($this->destroyeditems_ );
807        unset($this->droppeditems_);
808    }
809
810    function postimportmail()
811    {
812        if ( ( isset( $this->killmail_ ) ) && ( !$this->killmailExists_ ) )
813        {
814            $parser = new Parser( $this->killmail_ );
815            //$killid = $parser->parse( true );
816
817                        if (config::get('filter_apply'))
818                {
819                $filterdate = config::get('filter_date');
820                $year = substr($this->killmail_, 0, 4);
821                $month = substr($this->killmail_, 5, 2);
822                $day = substr($this->killmail_, 8, 2);
823                        $killstamp = mktime(0, 0, 0, $month, $day, $year);
824                if ($killstamp < $filterdate)
825                {
826                        $killid = -3;
827                }
828                else
829                {
830                        $killid = $parser->parse(true);
831                }
832                } else {
833                $killid = $parser->parse(true);
834                }
835
836            if ( $killid == 0 || $killid == -1 || $killid == -2 || $killid == -3 )
837            {
838                if ( $killid == 0 )
839                {
840                    $this->Output_ .= "Killmail ID:".$this->killid_." is malformed.<br>";
841                                        $this->malformedmails_++;
842
843                    if ($errors = $parser->getError())
844                    {
845                        foreach ($errors as $error)
846                        {
847                            $this->Output_ .= 'Error: '.$error[0];
848                            if ($error[1])
849                            {
850                                $this->Output_ .= ' The text lead to this error was: "'.$error[1].'"<br>';
851                            }
852                        }
853
854                                                //if ( $this->iscronjob_ )
855                                                //{
856                                                //      $this->Output_ .= $this->killmail_; // experimental - output the killmail as the API Parser understood it
857                                                //} else {
858                                                //      $this->Output_ .= str_replace("\r\n", "<br>", $this->killmail_);
859                                                //}
860                                                $this->Output_ .= '<br/>';
861                    }
862                }
863                                if ($killid == -3)
864                {
865                        $filterdate = kbdate("j F Y", config::get("filter_date"));
866                        //$html = "Killmail older than $filterdate ignored.";
867                                        $this->Output_ .= "Killmail ID:".$this->killid_. " has been ignored as mails before $filterdate are restricted.<br>";
868                                        $this->ignoredmails_++;
869                }
870
871                if ( $killid == -2 )
872                                {
873                    $this->Output_ .= "Killmail ID:".$this->killid_. " is not related to ".KB_TITLE.".<br>";
874                                        $this->ignoredmails_++;
875                }
876                                // Killmail exists - as we're here and the mail was posted, it is not a verified mail, so verify it now.
877                if ( $killid == -1 )
878                {
879                    if ( ( $this->API_NoSpam_ == 0 ) && ( $this->iscronjob_ ) )
880                    {
881                    // do not write to $this->Output_
882                    } else {
883                        // $this->Output_ .= "Killmail already exists <a href=\"?a=kill_detail&kll_id=".$parser->dupeid_."\">here</a>.<br>";
884                                                // write API KillID to kb3_kills killID column row $parser->dupeid_
885                                                $this->VerifyKill($this->killid_, $parser->dupeid_);
886                                                $this->verified_++;
887                    }
888                }
889            } else {
890                $qry = new DBQuery();
891                $qry->execute( "insert into kb3_log     values( ".$killid.", '".KB_SITE."','API ".APIVERSION."',now() )" );
892                $this->Output_ .= "API Killmail ID:".$this->killid_. " successfully imported <a href=\"?a=kill_detail&kll_id=".$killid."\">here</a> as KB ID:". $killid ."<br>";
893
894                                // Now place killID (API) into killboard row $killid
895                                $this->VerifyKill($this->killid_, $killid);
896
897                                // mail forward
898                                event::call('killmail_imported', $this);
899
900                                // For testing purposes
901                                //$this->Output_ .= str_replace("\r\n", "<br>", $this->killmail_);
902
903                                if ( file_exists("common/includes/class.comments.php") )
904                                        require_once( "common/includes/class.comments.php" );
905                if (class_exists('Comments') && config::get('API_Comment')) { // for the Eve-Dev Comment Class
906                    $comments = new Comments($killid);
907                    $comments->addComment("Captain Thunks API " . APIVERSION, config::get('API_Comment'));
908                }
909                $this->mailcount_++;
910            }
911        }
912    }
913
914    function loaddata($refid, $keystring, $typestring)
915    {
916        $url = "http://api.eve-online.com/" . $typestring . "/KillLog.xml.aspx";
917
918        if ($refid != 0)
919            $keystring .= '&beforeKillID=' . $refid;
920
921        $path = '/' . $typestring . '/Killlog.xml.aspx';
922        $fp = fsockopen("api.eve-online.com", 80);
923
924        if (!$fp)
925        {
926            $this->Output_ .= "Could not connect to API URL";
927        } else {
928            // request the xml
929            fputs ($fp, "POST " . $path . " HTTP/1.0\r\n");
930            fputs ($fp, "Host: api.eve-online.com\r\n");
931            fputs ($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
932            fputs ($fp, "User-Agent: PHPApi\r\n");
933            fputs ($fp, "Content-Length: " . strlen($keystring) . "\r\n");
934            fputs ($fp, "Connection: close\r\n\r\n");
935            fputs ($fp, $keystring."\r\n");
936
937            // retrieve contents
938            $contents = "";
939            while (!feof($fp))
940            {
941                $contents .= fgets($fp);
942            }
943
944            // close connection
945            fclose($fp);
946
947            $start = strpos($contents, "?>");
948            if ($start !== FALSE)
949            {
950                $contents = substr($contents, $start + strlen("\r\n\r\n"));
951            }
952        }
953        return $contents;
954    }
955
956    function mystrripos($haystack, $needle, $offset=0)
957    {
958        if($offset<0)
959        {
960            $temp_cut = strrev(  substr( $haystack, 0, abs($offset) )  );
961        } else {
962            $temp_cut = strrev(  substr( $haystack, $offset )  );
963        }
964        $pos = strlen($haystack) - (strpos($temp_cut, strrev($needle)) + $offset + strlen($needle));
965        if ($pos == strlen($haystack)) { $pos = 0; }
966
967        if(strpos($temp_cut, strrev($needle))===false)
968        {
969            return false;
970        } else return $pos;
971    }
972
973    function getlastkillid($data)
974    {
975        $mylastkillid = 0;
976        $startpoint = intval;
977        $endpoint = intval;
978
979        $startpoint = $this->mystrripos($data, 'row killID="');
980        if ( $startpoint != "0" )
981        {
982            $startpoint = $startpoint + 12;
983            $endpoint = strpos($data, '"', $startpoint);
984            $mylength = $endpoint-$startpoint;
985            $mylastkillid = substr($data, $startpoint, $mylength);
986        }
987        return $mylastkillid;
988    }
989
990    function getAllianceName($v)
991    {
992        $alliancenamereturn = "";
993
994        $counter = count($this->alliancearray_['Name']);
995        for ($x = 0; $x < $counter; $x++)
996        {
997            if ($this->alliancearray_['allianceID'][$x] == $v)
998                $alliancenamereturn = $this->alliancearray_['Name'][$x];
999        }
1000
1001        return $alliancenamereturn;
1002    }
1003
1004        function VerifyKill($killid, $mailid)
1005        {
1006                $qry = new DBQuery();
1007        $qry->execute( "UPDATE `kb3_kills` SET `kll_external_id` = '" . $killid . "' WHERE `kb3_kills`.`kll_id` =" . $mailid . " LIMIT 1" );
1008        }
1009
1010        function isKillIDVerified($killid)
1011        {
1012                $qry = new DBQuery();
1013        $qry->execute( "SELECT * FROM `kb3_kills` WHERE `kll_external_id` =" . $killid );
1014                $row = $qry->getRow();
1015                return $row['kll_external_id'];
1016        }
1017}
1018
1019// **********************************************************************************************************************************************
1020// ****************                                   API Char list - /account/Characters.xml.aspx                               ****************
1021// **********************************************************************************************************************************************
1022
1023class APIChar
1024{
1025    function fetchChars($apistring)
1026    {
1027        $data = $this->loaddata($apistring);
1028
1029        $xml_parser = xml_parser_create();
1030        xml_set_object ( $xml_parser, $this );
1031        xml_set_element_handler($xml_parser, "startElement", "endElement");
1032        xml_set_character_data_handler ( $xml_parser, 'characterData' );
1033
1034        if (!xml_parse($xml_parser, $data, true))
1035            return "<i>Error getting XML data from api.eve-online.com/account/Characters.xml.aspx  </i><br><br>";
1036
1037        xml_parser_free($xml_parser);
1038
1039        // add any characters not already in the kb
1040        $numchars = count($this->chars_);
1041        for ( $x = 0; $x < $numchars; $x++ )
1042        {
1043            // check if chars eveid exists in kb
1044            $sql = 'select plts.plt_id, plts.plt_externalid from kb3_pilots plts where plts.plt_name = "' . $this->chars_[$x]['Name'] . '"';
1045
1046            $qry = new DBQuery();
1047            $qry->execute($sql);
1048            if ($qry->recordCount() != 0)
1049            {
1050                                // pilot is in kb db, check he has his char id
1051                $row = $qry->getRow();
1052
1053                $pilot_id = $row['plt_id'];
1054                $pilot_external_id = $row['plt_externalid'];
1055
1056                if ( $pilot_external_id == 0 && $pilot_id != 0 )
1057                {
1058                                        // update DB with ID
1059                    $qry->execute("update kb3_pilots set plt_externalid = " . intval($this->chars_[$x]['charID']) . "
1060                                     where plt_id = " . $pilot_id);
1061                }
1062            } else {
1063                // pilot is not in DB
1064
1065                // Set Corp
1066                                $pilotscorp = new Corporation();
1067                                $pilotscorp->lookup($this->chars_[$x]['corpName']);
1068                // Check Corp was set, if not, add the Corp
1069                if ( !$pilotscorp->getID() )
1070                {
1071                    $ialliance = new Alliance();
1072                    $ialliance->add('NONE');
1073                    $pilotscorp->add($this->chars_[$x]['corpName'], $ialliance, gmdate("Y-m-d H:i:s"));
1074                }
1075                $ipilot = new Pilot();
1076                $ipilot->add($this->chars_[$x]['Name'], $pilotscorp, gmdate("Y-m-d H:i:s"));
1077                                $ipilot->setCharacterID(intval($this->chars_[$x]['charID']));
1078            }
1079        }
1080
1081        return $this->chars_;
1082    }
1083
1084    function startElement($parser, $name, $attribs)
1085    {
1086                global $character;
1087
1088        if ($name == "ROW")
1089        {
1090            if (count($attribs))
1091            {
1092                foreach ($attribs as $k => $v)
1093                {
1094                    switch ($k)
1095                    {
1096                        case "NAME":
1097                            $character['Name'] = $v;
1098                            break;
1099                        case "CORPORATIONNAME":
1100                            $character['corpName'] = $v;
1101                            break;
1102                        case "CHARACTERID":
1103                            $character['charID'] = $v;
1104                            break;
1105                        case "CORPORATIONID":
1106                            $character['corpID'] = $v;
1107                            break;
1108                    }
1109                }
1110            }
1111        }
1112    }
1113
1114    function endElement($parser, $name)
1115    {
1116                global $character;
1117
1118        if ($name == "ROW")
1119                {
1120                        $this->chars_[] = $character;
1121                        $character = array();
1122                        unset($character);
1123                }
1124    }
1125
1126    function characterData($parser, $data)
1127    {
1128        // nothing
1129    }
1130
1131    function loaddata($apistring)
1132    {
1133        $path = '/account/Characters.xml.aspx';
1134        $fp = fsockopen("api.eve-online.com", 80);
1135
1136        if (!$fp)
1137        {
1138            echo "Error", "Could not connect to API URL<br>";
1139        } else {
1140            // request the xml
1141            fputs ($fp, "POST " . $path . " HTTP/1.0\r\n");
1142            fputs ($fp, "Host: api.eve-online.com\r\n");
1143            fputs ($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
1144            fputs ($fp, "User-Agent: PHPApi\r\n");
1145            fputs ($fp, "Content-Length: " . strlen($apistring) . "\r\n");
1146            fputs ($fp, "Connection: close\r\n\r\n");
1147            fputs ($fp, $apistring."\r\n");
1148
1149            // retrieve contents
1150            $contents = "";
1151            while (!feof($fp))
1152            {
1153                $contents .= fgets($fp);
1154            }
1155
1156            // close connection
1157            fclose($fp);
1158
1159            $start = strpos($contents, "?>");
1160            if ($start != false)
1161            {
1162                $contents = substr($contents, $start + strlen("\r\n\r\n"));
1163            }
1164        }
1165        return $contents;
1166    }
1167}
1168
1169// **********************************************************************************************************************************************
1170// ****************                                 API Alliance list - /eve/AllianceList.xml.aspx                               ****************
1171// **********************************************************************************************************************************************
1172
1173class AllianceAPI
1174{
1175        function getCachedUntil()
1176        {
1177                return $this->CachedUntil_;
1178        }
1179
1180        function getCurrentTime()
1181        {
1182                return $this->CurrentTime_;
1183        }
1184
1185
1186        function initXML()
1187        {
1188                global $myalliancelist;
1189
1190                $data = LoadGlobalData('/eve/AllianceList.xml.aspx');
1191
1192        $xml_parser = xml_parser_create();
1193        xml_set_object ( $xml_parser, $this );
1194        xml_set_element_handler($xml_parser, "startElement", "endElement");
1195        xml_set_character_data_handler ( $xml_parser, 'characterData' );
1196
1197        if (!xml_parse($xml_parser, $data, true))
1198                return false;
1199
1200                xml_parser_free($xml_parser);
1201                return true;
1202        }
1203
1204    function fetchalliances($overide=false)
1205    {
1206        global $myalliancelist;
1207
1208                if (!isset($this->alliances_))
1209                        $this->initXML($overide);
1210
1211        return $myalliancelist;
1212    }
1213
1214    function startElement($parser, $name, $attribs)
1215    {
1216        global $myalliancelist, $alliancedetail, $membercorps, $membercorp, $iscorpsection;
1217
1218        if ($name == "ROW")
1219        {
1220            if (count($attribs))
1221            {
1222                foreach ($attribs as $k => $v)
1223                {
1224                    switch ($k)
1225                    {
1226                        case "NAME":
1227                            $alliancedetail['allianceName'] = $v;
1228                            break;
1229                                                case "SHORTNAME":
1230                            $alliancedetail['shortName'] = $v;
1231                            break;
1232                        case "ALLIANCEID":
1233                            $alliancedetail['allianceID'] = $v;
1234                            break;
1235                                                case "EXECUTORCORPID":
1236                            $alliancedetail['executorCorpID'] = $v;
1237                            break;
1238                                                case "MEMBERCOUNT":
1239                            $alliancedetail['memberCount'] = $v;
1240                            break;
1241                                                case "STARTDATE":
1242                                                        if (!$iscorpsection)
1243                                                        {
1244                                $alliancedetail['startDate'] = $v;
1245                                                        } else {
1246                                                                $membercorp['startDate'] = $v;
1247                                                                $membercorps[] = $membercorp;
1248                                                        }
1249                            break;
1250                                                case "CORPORATIONID":
1251                            $membercorp['corporationID'] = $v;
1252                                                        $iscorpsection = true;
1253                            break;
1254                    }
1255                }
1256            }
1257        }
1258    }
1259
1260    function endElement($parser, $name)
1261    {
1262        global $myalliancelist, $alliancedetail, $membercorps, $membercorp, $iscorpsection;
1263                global $tempvalue;
1264
1265                if ($name == "CURRENTTIME")
1266                        $this->CurrentTime_ = $tempvalue;
1267                if ($name == "CACHEDUNTIL")
1268                {
1269                        if  (config::get('API_extendedtimer_alliancelist') == 0)
1270                        {
1271                                $this->CachedUntil_ = date("Y-m-d H:i:s", (strtotime($this->CurrentTime_)) + 85500);
1272                        } else {
1273                                $this->CachedUntil_ = $tempvalue;
1274                        }
1275                        ApiCache::set('API_eve_AllianceList' , $this->CachedUntil_);
1276                }
1277
1278        switch ($name)
1279        {
1280            case "ROWSET":
1281                if ($alliancedetail['allianceName'] != "" && $alliancedetail['allianceID'] != "0")
1282                {
1283                    $myalliancelist['Name'][] = $alliancedetail['allianceName'];
1284                    $myalliancelist['allianceID'][] = $alliancedetail['allianceID'];
1285                }
1286                                $alliancedetail['memberCorps'] = $membercorps;
1287                                $this->alliances_[] = $alliancedetail;
1288
1289                                $alliancedetail['allianceName'] = "";
1290                                $alliancedetail['shortName'] = "";
1291                                $alliancedetail['allianceID'] = "";
1292                                $alliancedetail['executorCorpID'] = "";
1293                                $alliancedetail['memberCount'] = "";
1294                                $alliancedetail['startDate'] = "";
1295                                $alliancedetail['memberCorps'] = array();
1296                                $membercorps = array();
1297                                $membercorp = array();
1298                                unset($alliancedetail['memberCorps']);
1299                                unset($membercorps);
1300                                unset($membercorp);
1301                                $iscorpsection = false;
1302                break;
1303        }
1304    }
1305
1306    function characterData($parser, $data)
1307    {
1308                global $tempvalue;
1309
1310                $tempvalue = $data;
1311    }
1312
1313        function updatealliancetable()
1314    {
1315        if (!isset($this->alliances_))
1316            $this->initXML();
1317
1318        if (!isset($this->alliances_))
1319            return false;
1320
1321        $qry = new DBQuery();
1322        $qry->execute("DROP TABLE IF EXISTS `kb3_all_corp`;");
1323        $qry->execute("CREATE TABLE kb3_all_corp (
1324              all_id bigint(3) unsigned default '0',
1325              corp_id bigint(3) unsigned default '0',
1326              all_name varchar(200) default NULL
1327            ) ");
1328
1329        $alliances = $this->alliances_;
1330
1331        foreach ($alliances as $arraykey => $arrayvalue)
1332        {
1333            $tempally = $arrayvalue;
1334
1335            foreach ($tempally as $key => $value)
1336            {
1337                switch ($key)
1338                {
1339                    case "allianceName":
1340                        $allyname = $value;
1341                        break;
1342                    case "allianceID":
1343                        $allyid = $value;
1344                        break;
1345                    case "memberCorps":
1346                        $allycorps = $value;
1347                        $q='';
1348                        foreach ($allycorps as $corpkey => $corpvalue)
1349                        {
1350                            $tempcorp = $corpvalue;
1351                            foreach ($tempcorp as $tempkey => $tempvalue)
1352                            {
1353                                switch ($tempkey)
1354                                {
1355                                    case "corporationID":
1356                                        $q.="(".$allyid.",".$tempvalue.",'".slashfix($allyname)."'),";
1357                                        break;
1358                                }
1359                            }
1360                        }
1361                        if (strlen($q)>0)
1362                                $qry->execute("INSERT INTO kb3_all_corp values ".substr($q,0,strlen($q)-1));
1363                        break;
1364                }
1365            }
1366        }
1367        return true;
1368    }
1369
1370        function LocateAlliance($name)
1371        {
1372                if (!isset($this->alliances_))
1373            $this->initXML();
1374
1375        if (!isset($this->alliances_))
1376            return false;
1377
1378                $alliances = $this->alliances_;
1379
1380        foreach ($alliances as $arraykey => $arrayvalue)
1381        {
1382            $tempally = $arrayvalue;
1383
1384            foreach ($tempally as $key => $value)
1385            {
1386                switch ($key)
1387                {
1388                    case "allianceName":
1389                        //return $tempally;
1390                                                if ( $value == $name )
1391                                                {
1392                                                        return $tempally;
1393                                                }
1394                        break;
1395                }
1396            }
1397        }
1398                return false;
1399        }
1400
1401        function LocateAllianceID($id)
1402        {
1403                if (!isset($this->alliances_))
1404            $this->initXML();
1405
1406        if (!isset($this->alliances_))
1407            return false;
1408
1409                $alliances = $this->alliances_;
1410
1411        foreach ($alliances as $arraykey => $arrayvalue)
1412        {
1413            $tempally = $arrayvalue;
1414
1415            foreach ($tempally as $key => $value)
1416            {
1417                switch ($key)
1418                {
1419                    case "allianceID":
1420                        //return $tempally;
1421                                                if ( $value == $id )
1422                                                {
1423                                                        return $tempally;
1424                                                }
1425                        break;
1426                }
1427            }
1428        }
1429                return false;
1430        }
1431
1432        function UpdateAlliances($andCorps = false)
1433        {
1434                if (!isset($this->alliances_))
1435            $this->initXML();
1436
1437        if (!isset($this->alliances_))
1438            return false;
1439
1440                if ($andCorps)
1441                {
1442                        // Remove every single corp in the Killboard DB from their current Alliance
1443                        $db = new DBQuery(true);
1444                        $db->execute("UPDATE kb3_corps
1445                                                        SET crp_all_id = 14");
1446                }
1447
1448                $alliances = $this->alliances_;
1449                $alliance = new Alliance();
1450                $tempMyCorp = new Corporation();
1451                $myCorpAPI = new API_CorporationSheet();
1452
1453                $NumberOfAlliances = 0;
1454                $NumberOfCorps = 0;
1455                $NumberOfAlliancesAdded = 0; // we won't know this
1456                $NumberOfCorpsAdded = 0;
1457
1458                foreach ($alliances as $arraykey => $arrayvalue)
1459        {
1460            $tempally = $arrayvalue;
1461                        $NumberOfAlliances++;
1462
1463            foreach ($tempally as $key => $value)
1464            {
1465                switch ($key)
1466                {
1467                    case "allianceName":
1468                        $alliance->add($value);
1469                        break;
1470                                        case "memberCorps":
1471                                                // if $andCorps = true then add each and every single corp to the evekb db - resolving each name (expect this to be slow)
1472                                                // WARNING: Processing 5000+ corps this way is extremely slow and is almost guaranteed not to complete
1473                                                if ($andCorps)
1474                                                {
1475                                                        foreach ($value as $tempcorp)
1476                                                        {
1477                                                                $NumberOfCorps++;
1478
1479                                                                $myCorpAPI->setCorpID($tempcorp["corporationID"]);
1480                                                                $result .= $myCorpAPI->fetchXML();
1481
1482                                                                //$NumberOfCorpsAdded++;
1483                                                                $tempMyCorp->add($myCorpAPI->getCorporationName(), $alliance , gmdate("Y-m-d H:i:s"));
1484
1485                                                        }
1486
1487                                                }
1488                                                break;
1489                }
1490            }
1491        }
1492                $returnarray["NumAlliances"] = $NumberOfAlliances;
1493                $returnarray["NumCorps"] = $NumberOfCorps;
1494                $returnarray["NumAlliancesAdded"] = $NumberOfAlliancesAdded;
1495                $returnarray["NumCorpsAdded"] = $NumberOfCorpsAdded;
1496                return $returnarray;
1497
1498        }
1499}
1500
1501// **********************************************************************************************************************************************
1502// ****************                 API Conquerable Station/Outpost list - /eve/ConquerableStationList.xml.aspx                  ****************
1503// **********************************************************************************************************************************************
1504
1505class API_ConquerableStationList
1506{
1507        function getCachedUntil()
1508        {
1509                return $this->CachedUntil_;
1510        }
1511
1512        function getCurrentTime()
1513        {
1514                return $this->CurrentTime_;
1515        }
1516
1517        function getStations()
1518        {
1519                return $this->Stations_;
1520        }
1521
1522    function fetchXML()
1523    {
1524        $data = LoadGlobalData('/eve/ConquerableStationList.xml.aspx');
1525
1526        $xml_parser = xml_parser_create();
1527        xml_set_object ( $xml_parser, $this );
1528        xml_set_element_handler($xml_parser, "startElement", "endElement");
1529        xml_set_character_data_handler ( $xml_parser, 'characterData' );
1530
1531        if (!xml_parse($xml_parser, $data, true))
1532            return "<i>Error getting XML data from api.eve-online.com/eve/ConquerableStationList.xml.aspx </i><br><br>";
1533
1534        xml_parser_free($xml_parser);
1535
1536        return $this->html;
1537    }
1538
1539    function startElement($parser, $name, $attribs)
1540    {
1541                global $Station;
1542
1543        if ($name == "ROW")
1544        {
1545            if (count($attribs))
1546            {
1547                foreach ($attribs as $k => $v)
1548                {
1549                    switch ($k)
1550                    {
1551                        case "STATIONID":
1552                            $Station['stationID'] = $v;
1553                            break;
1554                        case "STATIONNAME":
1555                            $Station['stationName'] = $v;
1556                            break;
1557                        case "STATIONTYPEID":
1558                            $Station['stationTypeID'] = $v;
1559                            break;
1560                        case "SOLARSYSTEMID":
1561                            $Station['solarSystemID'] = $v;
1562                            break;
1563                                                case "CORPORATIONID":
1564                            $Station['corporationID'] = $v;
1565                            break;
1566                                                case "CORPORATIONNAME":
1567                            $Station['corporationName'] = $v;
1568                            break;
1569                    }
1570                }
1571            }
1572        }
1573    }
1574
1575    function endElement($parser, $name)
1576    {
1577                global $Station;
1578                global $tempvalue;
1579
1580                if ($name == "CURRENTTIME")
1581                        $this->CurrentTime_ = $tempvalue;
1582                if ($name == "CACHEDUNTIL")
1583                {
1584                        if  (config::get('API_extendedtimer_conq') == 0)
1585                        {
1586                                $this->CachedUntil_ = date("Y-m-d H:i:s", (strtotime($this->CurrentTime_)) + 85500);
1587                        } else {
1588                                $this->CachedUntil_ = $tempvalue;
1589                        }
1590                        ApiCache::set('API_eve_ConquerableStationList' , $this->CachedUntil_);
1591                }
1592
1593        if ($name == "ROW")
1594                {
1595                        $this->Stations_[] = $Station;
1596                        $Station = array();
1597                        unset($Station);
1598                }
1599    }
1600
1601    function characterData($parser, $data)
1602    {
1603        global $tempvalue;
1604
1605                $tempvalue = $data;
1606    }
1607}
1608
1609// **********************************************************************************************************************************************
1610// ****************                                   API Error list - /eve/ErrorList.xml.aspx                                   ****************
1611// **********************************************************************************************************************************************
1612
1613class API_ErrorList
1614{
1615        function getCachedUntil()
1616        {
1617                return $this->CachedUntil_;
1618        }
1619
1620        function getCurrentTime()
1621        {
1622                return $this->CurrentTime_;
1623        }
1624
1625        function getErrorList()
1626        {
1627                return $this->Error_;
1628        }
1629
1630    function fetchXML()
1631    {
1632        $data = LoadGlobalData('/eve/ErrorList.xml.aspx');
1633
1634        $xml_parser = xml_parser_create();
1635        xml_set_object ( $xml_parser, $this );
1636        xml_set_element_handler($xml_parser, "startElement", "endElement");
1637        xml_set_character_data_handler ( $xml_parser, 'characterData' );
1638
1639        if (!xml_parse($xml_parser, $data, true))
1640            return "<i>Error getting XML data from api.eve-online.com/eve/ErrorList.xml.aspx </i><br><br>";
1641
1642        xml_parser_free($xml_parser);
1643
1644        return $this->html;
1645    }
1646
1647    function startElement($parser, $name, $attribs)
1648    {
1649                global $ErrorData;
1650
1651        if ($name == "ROW")
1652        {
1653            if (count($attribs))
1654            {
1655                foreach ($attribs as $k => $v)
1656                {
1657                    switch ($k)
1658                    {
1659                        case "ERRORCODE":
1660                            $ErrorData['errorCode'] = $v;
1661                            break;
1662                        case "ERRORTEXT":
1663                            $ErrorData['errorText'] = $v;
1664                            break;
1665                    }
1666                }
1667            }
1668        }
1669    }
1670
1671    function endElement($parser, $name)
1672    {
1673                global $ErrorData;
1674                global $tempvalue;
1675
1676                if ($name == "CURRENTTIME")
1677                        $this->CurrentTime_ = $tempvalue;
1678                if ($name == "CACHEDUNTIL")
1679                {
1680                        $this->CachedUntil_ = $tempvalue;
1681                        ApiCache::set('API_eve_ErrorList' , $tempvalue);
1682                }
1683
1684        if ($name == "ROW")
1685                {
1686                        $this->Error_[] = $ErrorData;
1687                        $ErrorData = array();
1688                        unset($ErrorData);
1689                }
1690    }
1691
1692    function characterData($parser, $data)
1693    {
1694        global $tempvalue;
1695
1696                $tempvalue = $data;
1697    }
1698}
1699
1700// **********************************************************************************************************************************************
1701// ****************                                   API Jumps list - /map/Jumps.xml.aspx                                   ****************
1702// **********************************************************************************************************************************************
1703
1704class API_Jumps
1705{
1706        function getCachedUntil()
1707        {
1708                return $this->CachedUntil_;
1709        }
1710
1711        function getCurrentTime()
1712        {
1713                return $this->CurrentTime_;
1714        }
1715
1716        function getDataTime()
1717        {
1718                return $this->DataTime_;
1719        }
1720
1721        function getJumps()
1722        {
1723                return $this->Jumps_;
1724        }
1725
1726    function fetchXML()
1727    {
1728        $data = LoadGlobalData('/map/Jumps.xml.aspx');
1729
1730        $xml_parser = xml_parser_create();
1731        xml_set_object ( $xml_parser, $this );
1732        xml_set_element_handler($xml_parser, "startElement", "endElement");
1733        xml_set_character_data_handler ( $xml_parser, 'characterData' );
1734
1735        if (!xml_parse($xml_parser, $data, true))
1736            return "<i>Error getting XML data from api.eve-online.com/map/Jumps.xml.aspx </i><br><br>";
1737
1738        xml_parser_free($xml_parser);
1739
1740        return $this->html;
1741    }
1742
1743    function startElement($parser, $name, $attribs)
1744    {
1745                global $JumpData;
1746
1747        if ($name == "ROW")
1748        {
1749            if (count($attribs))
1750            {
1751                foreach ($attribs as $k => $v)
1752                {
1753                    switch ($k)
1754                    {
1755                        case "SOLARSYSTEMID":
1756                            $JumpData['solarSystemID'] = $v;
1757                            break;
1758                        case "SHIPJUMPS":
1759                            $JumpData['shipJumps'] = $v;
1760                            break;
1761                    }
1762                }
1763            }
1764        }
1765    }
1766
1767    function endElement($parser, $name)
1768    {
1769                global $JumpData;
1770                global $tempvalue;
1771
1772                if ($name == "CURRENTTIME")
1773                        $this->CurrentTime_ = $tempvalue;
1774                if ($name == "DATATIME")
1775                        $this->DataTime_ = $tempvalue;
1776                if ($name == "CACHEDUNTIL")
1777                {
1778                        $this->CachedUntil_ = $tempvalue;
1779                        ApiCache::set('API_map_Jumps' , $tempvalue);
1780                }
1781
1782        if ($name == "ROW")
1783                {
1784                        $this->Jumps_[] = $JumpData;
1785                        $JumpData = array();
1786                        unset($JumpData);
1787                }
1788    }
1789
1790    function characterData($parser, $data)
1791    {
1792        global $tempvalue;
1793
1794                $tempvalue = $data;
1795    }
1796}
1797
1798// **********************************************************************************************************************************************
1799// ****************                                   API Kills list - /map/Kills.xml.aspx                                   ****************
1800// **********************************************************************************************************************************************
1801
1802class API_Kills
1803{
1804        function getCachedUntil()
1805        {
1806                return $this->CachedUntil_;
1807        }
1808
1809        function getCurrentTime()
1810        {
1811                return $this->CurrentTime_;
1812        }
1813
1814        function getDataTime()
1815        {
1816                return $this->DataTime_;
1817        }
1818
1819        function getkills()
1820        {
1821                return $this->kills_;
1822        }
1823
1824    function fetchXML()
1825    {
1826        $data = LoadGlobalData('/map/Kills.xml.aspx');
1827
1828        $xml_parser = xml_parser_create();
1829        xml_set_object ( $xml_parser, $this );
1830        xml_set_element_handler($xml_parser, "startElement", "endElement");
1831        xml_set_character_data_handler ( $xml_parser, 'characterData' );
1832
1833        if (!xml_parse($xml_parser, $data, true))
1834            return "<i>Error getting XML data from api.eve-online.com/map/Kills.xml.aspx </i><br><br>";
1835
1836        xml_parser_free($xml_parser);
1837
1838        return $this->html;
1839    }
1840
1841    function startElement($parser, $name, $attribs)
1842    {
1843                global $KillsData;
1844
1845        if ($name == "ROW")
1846        {
1847            if (count($attribs))
1848            {
1849                foreach ($attribs as $k => $v)
1850                {
1851                    switch ($k)
1852                    {
1853                        case "SOLARSYSTEMID":
1854                            $KillsData['solarSystemID'] = $v;
1855                            break;
1856                        case "SHIPKILLS":
1857                            $KillsData['shipKills'] = $v;
1858                            break;
1859                                                case "FACTIONKILLS":
1860                            $KillsData['factionKills'] = $v;
1861                            break;
1862                                                case "PODKILLS":
1863                            $KillsData['podKills'] = $v;
1864                            break;
1865                    }
1866                }
1867            }
1868        }
1869    }
1870
1871    function endElement($parser, $name)
1872    {
1873                global $KillsData;
1874                global $tempvalue;
1875
1876                if ($name == "CURRENTTIME")
1877                        $this->CurrentTime_ = $tempvalue;
1878                if ($name == "DATATIME")
1879                        $this->DataTime_ = $tempvalue;
1880                if ($name == "CACHEDUNTIL")
1881                {
1882                        $this->CachedUntil_ = $tempvalue;
1883                        ApiCache::set('API_map_Kills' , $tempvalue);
1884                }
1885
1886        if ($name == "ROW")
1887                {
1888                        $this->kills_[] = $KillsData;
1889                        $KillsData = array();
1890                        unset($KillsData);
1891                }
1892    }
1893
1894    function characterData($parser, $data)
1895    {
1896        global $tempvalue;
1897
1898                $tempvalue = $data;
1899    }
1900}
1901
1902// **********************************************************************************************************************************************
1903// ****************                            API Alliance Sovereignty - /map/Sovereignty.xml.aspx                              ****************
1904// **********************************************************************************************************************************************
1905
1906class API_Sovereignty
1907{
1908        function getCachedUntil()
1909        {
1910                return $this->CachedUntil_;
1911        }
1912
1913        function getCurrentTime()
1914        {
1915                return $this->CurrentTime_;
1916        }
1917
1918        function getDataTime()
1919        {
1920                return $this->DataTime_;
1921        }
1922
1923        function getSovereignty()
1924        {
1925                return $this->Sovereignty_;
1926        }
1927
1928    function fetchXML()
1929    {
1930        $data = LoadGlobalData('/map/Sovereignty.xml.aspx');
1931
1932        $xml_parser = xml_parser_create();
1933        xml_set_object ( $xml_parser, $this );
1934        xml_set_element_handler($xml_parser, "startElement", "endElement");
1935        xml_set_character_data_handler ( $xml_parser, 'characterData' );
1936
1937        if (!xml_parse($xml_parser, $data, true))
1938            return "<i>Error getting XML data from api.eve-online.com/map/Sovereignty.xml.aspx  </i><br><br>";
1939
1940        xml_parser_free($xml_parser);
1941
1942        return $this->html;
1943    }
1944
1945    function startElement($parser, $name, $attribs)
1946    {
1947                global $SovereigntyData;
1948
1949        if ($name == "ROW")
1950        {
1951            if (count($attribs))
1952            {
1953                foreach ($attribs as $k => $v)
1954                {
1955                    switch ($k)
1956                    {
1957                        case "SOLARSYSTEMID":
1958                            $SovereigntyData['solarSystemID'] = $v;
1959                            break;
1960                        case "ALLIANCEID":
1961                            $SovereigntyData['allianceID'] = $v;
1962                            break;
1963                                                case "CONSTELLATIONSOVEREIGNTY":
1964                            $SovereigntyData['constellationSovereignty'] = $v;
1965                            break;
1966                                                case "SOVEREIGNTYLEVEL":
1967                            $SovereigntyData['sovereigntyLevel'] = $v;
1968                            break;
1969                                                case "FACTIONID":
1970                            $SovereigntyData['factionID'] = $v;
1971                            break;
1972                                                case "SOLARSYSTEMNAME":
1973                            $SovereigntyData['solarSystemName'] = $v;
1974                            break;
1975                    }
1976                }
1977            }
1978        }
1979    }
1980
1981    function endElement($parser, $name)
1982    {
1983                global $SovereigntyData;
1984                global $tempvalue;
1985
1986                if ($name == "CURRENTTIME")
1987                        $this->CurrentTime_ = $tempvalue;
1988                if ($name == "DATATIME")
1989                        $this->DataTime_ = $tempvalue;
1990                if ($name == "CACHEDUNTIL")
1991                {
1992                        if  (config::get('API_extendedtimer_sovereignty') == 0)
1993                        {
1994                                $this->CachedUntil_ = date("Y-m-d H:i:s", (strtotime($this->CurrentTime_)) + 85500);
1995                        } else {
1996                                $this->CachedUntil_ = $tempvalue;
1997                        }
1998                        ApiCache::set('API_map_Sovereignty' , $this->CachedUntil_);
1999                }
2000
2001        if ($name == "ROW")
2002                {
2003                        $this->Sovereignty_[] = $SovereigntyData;
2004                        $SovereigntyData = array();
2005                        unset($SovereigntyData);
2006                }
2007    }
2008
2009    function characterData($parser, $data)
2010    {
2011                global $tempvalue;
2012
2013                $tempvalue = $data;
2014    }
2015
2016        function getSystemDetails($sysname)
2017        {
2018                if (!isset($this->Sovereignty_))
2019            $this->fetchXML();
2020
2021        if (!isset($this->Sovereignty_))
2022            return false;
2023
2024                $Sov = $this->Sovereignty_;
2025
2026                foreach ($Sov as $myTempData)
2027                {
2028                        if ($myTempData['solarSystemName'] == $sysname)
2029                                return $myTempData;
2030                }
2031
2032                return;
2033        }
2034
2035        function getSystemIDDetails($sysID)
2036        {
2037                if (!isset($this->Sovereignty_))
2038            $this->fetchXML();
2039
2040        if (!isset($this->Sovereignty_))
2041            return false;
2042
2043                //echo var_dump($this->Sovereignty_);
2044
2045                $Sov = $this->Sovereignty_;
2046
2047                foreach ($Sov as $myTempData)
2048                {
2049                        if ($myTempData['solarSystemID'] == $sysID)
2050                                return $myTempData;
2051                }
2052
2053                return false;
2054        }
2055}
2056
2057// **********************************************************************************************************************************************
2058// ****************                               API Reference Types - /eve/RefTypes.xml.aspx                                   ****************
2059// **********************************************************************************************************************************************
2060
2061class API_RefTypes
2062{
2063        function getCachedUntil()
2064        {
2065                return $this->CachedUntil_;
2066        }
2067
2068        function getCurrentTime()
2069        {
2070                return $this->CurrentTime_;
2071        }
2072
2073        function getRefTypes()
2074        {
2075                return $this->RefTypes_;
2076        }
2077
2078    function fetchXML()
2079    {
2080        $data = LoadGlobalData('/eve/RefTypes.xml.aspx');
2081
2082        $xml_parser = xml_parser_create();
2083        xml_set_object ( $xml_parser, $this );
2084        xml_set_element_handler($xml_parser, "startElement", "endElement");
2085        xml_set_character_data_handler ( $xml_parser, 'characterData' );
2086
2087        if (!xml_parse($xml_parser, $data, true))
2088            return "<i>Error getting XML data from api.eve-online.com/eve/RefTypes.xml.aspx  </i><br><br>";
2089
2090        xml_parser_free($xml_parser);
2091
2092        return $this->html;
2093    }
2094
2095    function startElement($parser, $name, $attribs)
2096    {
2097                global $RefTypeData;
2098
2099        if ($name == "ROW")
2100        {
2101            if (count($attribs))
2102            {
2103                foreach ($attribs as $k => $v)
2104                {
2105                    switch ($k)
2106                    {
2107                        case "REFTYPEID":
2108                            $RefTypeData['refTypeID'] = $v;
2109                            break;
2110                        case "REFTYPENAME":
2111                            $RefTypeData['refTypeName'] = $v;
2112                            break;
2113                    }
2114                }
2115            }
2116        }
2117    }
2118
2119    function endElement($parser, $name)
2120    {
2121                global $RefTypeData;
2122                global $tempvalue;
2123
2124                if ($name == "CURRENTTIME")
2125                        $this->CurrentTime_ = $tempvalue;
2126                if ($name == "CACHEDUNTIL")
2127                {
2128                        $this->CachedUntil_ = $tempvalue;
2129                        ApiCache::set('API_eve_RefTypes' , $tempvalue);
2130                }
2131
2132        if ($name == "ROW")
2133                {
2134                        $this->RefTypes_[] = $RefTypeData;
2135                        $RefTypeData = array();
2136                        unset($RefTypeData);
2137                }
2138    }
2139
2140    function characterData($parser, $data)
2141    {
2142        global $tempvalue;
2143
2144                $tempvalue = $data;
2145    }
2146}
2147
2148// **********************************************************************************************************************************************
2149// ****************                           API Faction War Systems - /map/FacWarSystems.xml.aspx                              ****************
2150// **********************************************************************************************************************************************
2151
2152class API_FacWarSystems
2153{
2154        function getCachedUntil()
2155        {
2156                return $this->CachedUntil_;
2157        }
2158
2159        function getCurrentTime()
2160        {
2161                return $this->CurrentTime_;
2162        }
2163
2164        function getFacWarSystems()
2165        {
2166                return $this->FacWarSystems_;
2167        }
2168
2169    function fetchXML()
2170    {
2171        $data = LoadGlobalData('/map/FacWarSystems.xml.aspx');
2172
2173        $xml_parser = xml_parser_create();
2174        xml_set_object ( $xml_parser, $this );
2175        xml_set_element_handler($xml_parser, "startElement", "endElement");
2176        xml_set_character_data_handler ( $xml_parser, 'characterData' );
2177
2178        if (!xml_parse($xml_parser, $data, true))
2179            return "<i>Error getting XML data from api.eve-online.com/map/FacWarSystems.xml.aspx  </i><br><br>";
2180
2181        xml_parser_free($xml_parser);
2182
2183        return $this->FacWarSystems_;
2184    }
2185
2186    function startElement($parser, $name, $attribs)
2187    {
2188                global $FacWarSystem;
2189
2190        if ($name == "ROW")
2191        {
2192            if (count($attribs))
2193            {
2194                foreach ($attribs as $k => $v)
2195                {
2196                    switch ($k)
2197                    {
2198                        case "SOLARSYSTEMID":
2199                            $FacWarSystem['solarSystemID'] = $v;
2200                            break;
2201                        case "SOLARSYSTEMNAME":
2202                            $FacWarSystem['solarSystemName'] = $v;
2203                            break;
2204                                                case "OCCUPYINGFACTIONID":
2205                            $FacWarSystem['occupyingFactionID'] = $v;
2206                            break;
2207                                                case "OCCUPYINGFACTIONNAME":
2208                            $FacWarSystem['occupyingFactionName'] = $v;
2209                            break;
2210                                                case "CONTESTED":
2211                            $FacWarSystem['contested'] = $v;
2212                            break;
2213                    }
2214                }
2215            }
2216        }
2217    }
2218
2219    function endElement($parser, $name)
2220    {
2221                global $FacWarSystem;
2222                global $tempvalue;
2223
2224                if ($name == "CURRENTTIME")
2225                        $this->CurrentTime_ = $tempvalue;
2226                if ($name == "CACHEDUNTIL")
2227                {
2228                        if  (config::get('API_extendedtimer_facwarsystems') == 0)
2229                        {
2230                                $this->CachedUntil_ = date("Y-m-d H:i:s", (strtotime($this->CurrentTime_)) + 85500);
2231                        } else {
2232                                $this->CachedUntil_ = $tempvalue;
2233                        }
2234                        ApiCache::set('API_map_FacWarSystems' , $this->CachedUntil_);
2235                }
2236
2237        if ($name == "ROW")
2238                {
2239                        $this->FacWarSystems_[] = $FacWarSystem;
2240                        $FacWarSystem = array();
2241                        unset($FacWarSystem);
2242                }
2243    }
2244
2245    function characterData($parser, $data)
2246    {
2247        global $tempvalue;
2248
2249                $tempvalue = $data;
2250    }
2251}
2252
2253// **********************************************************************************************************************************************
2254// ****************                                  API Standings - /corp & char/Standings.xml.aspx                             ****************
2255// **********************************************************************************************************************************************
2256class API_Standings
2257{
2258        function getCachedUntil()
2259        {
2260                return $this->CachedUntil_;
2261        }
2262
2263        function getCurrentTime()
2264        {
2265                return $this->CurrentTime_;
2266        }
2267
2268        // boolean value - sets between char/corp
2269        function isUser($value)
2270        {
2271                $this->isUser_ = $value;
2272        }
2273
2274        function setAPIKey($key)
2275        {
2276                $this->API_apiKey_ = $key;
2277        }
2278
2279        function setUserID($uid)
2280        {
2281                $this->API_userID_ = $uid;
2282        }
2283
2284        function setCharacterID($cid)
2285        {
2286                $this->API_characterID_ = $cid;
2287        }
2288
2289        function getCharacters()
2290        {
2291                return $this->Characters_;
2292        }
2293        function getCorporations()
2294        {
2295                return $this->Corporations_;
2296        }
2297        function getAlliances()
2298        {
2299                return $this->Alliances_;
2300        }
2301        function getAgents()
2302        {
2303                return $this->Agents_;
2304        }
2305        function getNPCCorporations()
2306        {
2307                return $this->NPCCorporations_;
2308        }
2309        function getFactions()
2310        {
2311                return $this->Factions_;
2312        }
2313        function getAllianceCorporations()
2314        {
2315                return $this->AllianceCorporations_;
2316        }
2317        function getAliianceAlliances()
2318        {
2319                return $this->AliianceAlliances_;
2320        }
2321
2322        function fetchXML()
2323        {
2324                $this->isAllianceStandings_ = false;
2325                $this->isCorporationStandings_ = false;
2326
2327                if ($this->isUser_)
2328                {
2329                        // is a player feed - take details from logged in user
2330                        if (user::get('usr_pilot_id'))
2331                {
2332                                $myEveCharAPI = new API_CharacterSheet();
2333                                $this->html .= $myEveCharAPI->fetchXML();
2334
2335                                $skills = $myEveCharAPI->getSkills();
2336
2337                                $this->connections_ = 0;
2338                                $this->diplomacy_ = 0;
2339
2340                                foreach ((array)$skills as $myTempData)
2341                                {
2342                                        if ($myTempData['typeID'] == "3359")
2343                                                $this->connections_ = $myTempData['Level'];
2344                                        if ($myTempData['typeID'] == "3357")
2345                                                $this->diplomacy_ = $myTempData['Level'];
2346                                }
2347
2348                                $myKeyString = "userID=" . $this->API_userID_ . "&apiKey=" . $this->API_apiKey_ . "&characterID=" . $this->API_characterID_;
2349
2350                                $data = $this->loaddata($myKeyString, "char");
2351                        } else {
2352                                return "You are not logged in.";
2353                        }
2354
2355                } else {
2356                        // is a corp feed
2357                        $myKeyString = "userID=" . $this->API_userID_ . "&apiKey=" . $this->API_apiKey_ . "&characterID=" . $this->API_characterID_;
2358                        $data = $this->loaddata($myKeyString, "corp");
2359                }
2360
2361        $xml_parser = xml_parser_create();
2362        xml_set_object ( $xml_parser, $this );
2363        xml_set_element_handler($xml_parser, "startElement", "endElement");
2364        xml_set_character_data_handler ( $xml_parser, 'characterData' );
2365
2366        if (!xml_parse($xml_parser, $data, true))
2367            return "<i>Error getting XML data from api.eve-online.com/Standings.xml.aspx  </i><br><br>";
2368
2369        xml_parser_free($xml_parser);
2370
2371                // sort the arrays (in descending order of standing)
2372                $this->Factions_ = $this->mysortarray($this->Factions_);
2373                $this->Characters_ = $this->mysortarray($this->Characters_);
2374                $this->Corporations_ = $this->mysortarray($this->Corporations_);
2375                $this->Alliances_ = $this->mysortarray($this->Alliances_);
2376                $this->Agents_ = $this->mysortarray($this->Agents_);
2377                $this->NPCCorporations_ = $this->mysortarray($this->NPCCorporations_);
2378                $this->AllianceCorporations_ = $this->mysortarray($this->AllianceCorporations_);
2379                $this->AllianceAlliances_ = $this->mysortarray($this->AliianceAlliances_);
2380
2381                return $this->html;
2382        }
2383
2384        function mysortarray($arraydata)
2385        {
2386                if (count($arraydata) != 0 )
2387                {
2388                        foreach ((array)$arraydata as $key => $row) {
2389                        $standing[$key]  = $row['Standing'];
2390                        $name[$key] = $row['Name'];
2391                                $id[$key] = $row['ID'];
2392                        }
2393
2394                        array_multisort($standing, SORT_DESC, $name, SORT_ASC, $id, SORT_ASC, $arraydata);
2395
2396                        $standing = array();
2397                        unset($standing);
2398                        $name = array();
2399                        unset($name);
2400                        $id = array();
2401                        unset($id);
2402
2403                        return $arraydata;
2404                }
2405        }
2406
2407        function startElement($parser, $name, $attribs)
2408    {
2409
2410                if ($name == "CORPORATIONSTANDINGS")
2411                {
2412                        $this->isAllianceStandings_ = false;
2413                        $this->isCorporationStandings_ = true;
2414                }
2415                if ($name == "STANDINGSTO")
2416                {
2417                        $this->StandingsTo_ = true; // used to determine if/when to apply diplomacy/connections bonus
2418                }
2419                if ($name == "STANDINGSFROM")
2420                {
2421                        $this->StandingsTo_ = false;
2422                }
2423                if ($name == "ALLIANCESTANDINGS")
2424                {
2425                        $this->isAllianceStandings_ = true;
2426                        $this->isCorporationStandings_ = false;
2427                }
2428
2429                if ($name == "ROWSET") // In this If statement we set booleans to ultimately determine where the data in the next If statement is stored
2430        {
2431            if (count($attribs))
2432            {
2433                foreach ($attribs as $k => $v)
2434                {
2435                    switch ($k)
2436                    {
2437                        case "NAME":
2438                                                        switch ($v)
2439                                {
2440                                                                // bitwise or numeric flag would be better and more concise - but fuck it!
2441                                                                case "characters": // can only be personal/corp
2442                                                                        $this->isCharacters_ = true;
2443                                                                        $this->isCorporations_ = false;
2444                                                                        $this->isAlliances_ = false;
2445                                                                        $this->isAgents_ = false;
2446                                                                        $this->isNPCCorporations_ = false;
2447                                                                        $this->isFactions_ = false;
2448                                                                        $this->isAllianceCorporations_ = false;
2449                                                                        $this->isAllianceAlliances_ = false;
2450                                                                        break;
2451                                                                case "corporations": // can be either personal/corp or alliance
2452                                                                        $this->isCharacters_ = false;
2453                                                                        $this->isCorporations_ = false;
2454                                                                        $this->isAlliances_ = false;
2455                                                                        $this->isAgents_ = false;
2456                                                                        $this->isNPCCorporations_ = false;
2457                                                                        $this->isFactions_ = false;
2458                                                                        $this->isAllianceCorporations_ = false;
2459                                                                        $this->isAllianceAlliances_ = false;
2460
2461                                                                        if (!$this->isAllianceStandings_) // then it is personal/corp
2462                                                                        {
2463                                                                                $this->isCorporations_ = true;
2464                                                                        } else { // then it is alliance
2465                                                                                $this->isAllianceCorporations_ = true;
2466                                                                        }
2467                                                                        break;
2468                                                                case "alliances": // can be either personal/corp or alliance
2469                                                                        $this->isCharacters_ = false;
2470                                                                        $this->isCorporations_ = false;
2471                                                                        $this->isAlliances_ = false;
2472                                                                        $this->isAgents_ = false;
2473                                                                        $this->isNPCCorporations_ = false;
2474                                                                        $this->isFactions_ = false;
2475                                                                        $this->isAllianceCorporations_ = false;
2476                                                                        $this->isAllianceAlliances_ = false;
2477
2478                                                                        if (!$this->isAllianceStandings_) // then it is personal/corp
2479                                                                        {
2480                                                                                $this->isAlliances_ = true;
2481                                                                        } else { // then it is alliance
2482                                                                                $this->isAllianceAlliances_ = true;
2483                                                                        }
2484                                                                        break;
2485                                                                case "agents": // can only be personal/corp
2486                                                                        $this->isCharacters_ = false;
2487                                                                        $this->isCorporations_ = false;
2488                                                                        $this->isAlliances_ = false;
2489                                                                        $this->isAgents_ = true;
2490                                                                        $this->isNPCCorporations_ = false;
2491                                                                        $this->isFactions_ = false;
2492                                                                        $this->isAllianceCorporations_ = false;
2493                                                                        $this->isAllianceAlliances_ = false;
2494                                                                        break;
2495                                                                case "NPCCorporations": // can only be personal/corp
2496                                                                        $this->isCharacters_ = false;
2497                                                                        $this->isCorporations_ = false;
2498                                                                        $this->isAlliances_ = false;
2499                                                                        $this->isAgents_ = false;
2500                                                                        $this->isNPCCorporations_ = true;
2501                                                                        $this->isFactions_ = false;
2502                                                                        $this->isAllianceCorporations_ = false;
2503                                                                        $this->isAllianceAlliances_ = false;
2504                                                                        break;
2505                                                                case "factions": // can only be personal/corp
2506                                                                        $this->isCharacters_ = false;
2507                                                                        $this->isCorporations_ = false;
2508                                                                        $this->isAlliances_ = false;
2509                                                                        $this->isAgents_ = false;
2510                                                                        $this->isNPCCorporations_ = false;
2511                                                                        $this->isFactions_ = true;
2512                                                                        $this->isAllianceCorporations_ = false;
2513                                                                        $this->isAllianceAlliances_ = false;
2514                                                                        break;
2515                                                        }
2516                            break;
2517                                        }
2518                                }
2519                        }
2520                }
2521
2522                if ($name == "ROW")
2523        {
2524                        global $tempdata;
2525
2526                        if (count($attribs))
2527            {
2528                foreach ($attribs as $k => $v)
2529                {
2530                    switch ($k)
2531                    {
2532                                                case "TOID":
2533                                                        $tempdata['ID'] = $v;
2534                            break;
2535                                                case "FROMID":
2536                                                        $tempdata['ID'] = $v;
2537                            break;
2538                                                case "TONAME":
2539                                                        $tempdata['Name'] = $v;
2540                            break;
2541                                                case "FROMNAME":
2542                                                        $tempdata['Name'] = $v;
2543                            break;
2544                                                case "STANDING":
2545                                                        // use flags determined in previous If... to load the correct array[]
2546                                                        if ($this->isUser_ && !$this->StandingsTo_)
2547                                                        {
2548                                                                // set standings bonus where applicable
2549                                                                // calculate bonus
2550                                                                if ($v >= 0) // Connections
2551                                                                        $tempdata['Standing'] = number_format($v + ((10 - $v) * (0.04 * $this->connections_)), 2, '.', '');
2552                                                                else  // Diplomacy
2553                                                                        $tempdata['Standing'] = number_format($v + ((10 - $v) * (0.04 * $this->diplomacy_)), 2, '.', '');
2554                                                        } else {
2555                                                                $tempdata['Standing'] = $v;
2556                                                        }
2557
2558                                                        // check that 'Name' isn't empty as this means the value was reset
2559                                                        if ($tempdata['Name'] != "")
2560                                                        {
2561                                                                if ($this->isCharacters_) {
2562                                                                        $this->Characters_[] = $tempdata;
2563                                                                } elseif ($this->isCorporations_) {
2564                                                                        $this->Corporations_[] = $tempdata;
2565                                                                } elseif ($this->isAlliances_ ) {
2566                                                                        $this->Alliances_[] = $tempdata;
2567                                                                } elseif ($this->isAgents_) {
2568                                                                        $this->Agents_[] = $tempdata;
2569                                                                } elseif ($this->isNPCCorporations_) {
2570                                                                        $this->NPCCorporations_[] = $tempdata;
2571                                                                } elseif ($this->isFactions_) {
2572                                                                        $this->Factions_[] = $tempdata;
2573                                                                } elseif ($this->isAllianceCorporations_) {
2574                                                                        $this->AllianceCorporations_[] = $tempdata;
2575                                                                } elseif ($this->isAllianceAlliances_) {
2576                                                                        $this->AllianceAlliances_[] = $tempdata;
2577                                                                }
2578                                                        }
2579
2580                                                        $tempdata = array();
2581                                                        unset($tempdata);
2582                            break;
2583                                        }
2584                                }
2585                        }
2586                }
2587    }
2588
2589    function endElement($parser, $name)
2590    {
2591
2592                if ($name == "CURRENTTIME")
2593                        $this->CurrentTime_ = $this->characterDataValue;
2594                if ($name == "CACHEDUNTIL")
2595                {
2596                        $this->CachedUntil_ = $this->characterDataValue;
2597                        ApiCache::set( $this->API_characterID_ . '_Standings' , $this->characterDataValue);
2598                }
2599    }
2600
2601    function characterData($parser, $data)
2602    {
2603                $this->characterDataValue = $data;
2604    }
2605
2606        function loaddata($keystring, $typestring)
2607    {
2608                $configvalue = $this->API_characterID_ . '_Standings';
2609
2610                $CachedTime = ApiCache::get($configvalue);
2611                $UseCaching = config::get('API_UseCache');
2612
2613        $url = "http://api.eve-online.com/" . $typestring . "/Standings.xml.aspx" . $keystring;
2614        $path = "/" . $typestring . "/Standings.xml.aspx";
2615
2616                // 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.
2617                if ($CachedTime == "")
2618        {
2619                $CachedTime = "2005-01-01 00:00:00"; // fake date to ensure that it runs first time.
2620        }
2621
2622                if (is_file(getcwd().'/cache/api/'.$configvalue.'.xml'))
2623                        $cacheexists = true;
2624                else
2625                        $cacheexists = false;
2626
2627
2628                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
2629        {
2630                $fp = fsockopen("api.eve-online.com", 80);
2631
2632                if (!$fp)
2633                {
2634                                $this->Output_ .= "Could not connect to API URL";
2635                } else {
2636                // request the xml
2637                fputs ($fp, "POST " . $path . " HTTP/1.0\r\n");
2638                fputs ($fp, "Host: api.eve-online.com\r\n");
2639                fputs ($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
2640                fputs ($fp, "User-Agent: PHPApi\r\n");
2641                fputs ($fp, "Content-Length: " . strlen($keystring) . "\r\n");
2642                fputs ($fp, "Connection: close\r\n\r\n");
2643                fputs ($fp, $keystring."\r\n");
2644
2645                // retrieve contents
2646                $contents = "";
2647                while (!feof($fp))
2648                {
2649                    $contents .= fgets($fp);
2650                }
2651
2652                // close connection
2653                fclose($fp);
2654
2655                $start = strpos($contents, "?>");
2656                if ($start !== FALSE)
2657                {
2658                        $contents = substr($contents, $start + strlen("\r\n\r\n"));
2659                        }
2660
2661                                if ($UseCaching == 0) // Save the file if we're caching (0 = true in Thunks world)
2662                                {
2663                                        $file = fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'w+');
2664                                fwrite($file, $contents);
2665                                fclose($file);
2666                                        @chmod(getcwd().'/cache/api/'.$configvalue.'.xml',0666);
2667                                }
2668                }
2669                } else {
2670                        // re-use cached XML
2671                        if ($fp = @fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'r')) {
2672                $contents = fread($fp, filesize(getcwd().'/cache/api/'.$configvalue.'.xml'));
2673                        fclose($fp);
2674                } else {
2675                                return "<i>error loading cached file ".$configvalue.".xml</i><br><br>";
2676                }
2677                }
2678        return $contents;
2679    }
2680}
2681
2682// **********************************************************************************************************************************************
2683// ****************                                 API Character Sheet - char/CharacterSheet.xml.aspx                           ****************
2684// **********************************************************************************************************************************************
2685// Incomplete - Does not read Certificates or Roles
2686class API_CharacterSheet
2687{
2688        function getCachedUntil()
2689        {
2690                return $this->CachedUntil_;
2691        }
2692
2693        function getCurrentTime()
2694        {
2695                return $this->CurrentTime_;
2696        }
2697
2698        function getSkills()
2699        {
2700                return $this->Skills_;
2701        }
2702
2703        // array 1-5 based on implant slot position. 6-10 don't seem to appear, presumably because Hardwirings do not affect skill training.
2704        function getImplants()
2705        {
2706                return $this->Implant_;
2707        }
2708
2709        function getIntelligence()
2710        {
2711                return $this->Intelligence_;
2712        }
2713
2714        function getMemory()
2715        {
2716                return $this->Memory_;
2717        }
2718
2719        function getCharisma()
2720        {
2721                return $this->Charisma_;
2722        }
2723
2724        function getPerception()
2725        {
2726                return $this->Perception_;
2727        }
2728
2729        function getWillpower()
2730        {
2731                return $this->Willpower_;
2732        }
2733        function getCharacterID()
2734        {
2735                return $this->CharacterID_;
2736        }
2737        function getName()
2738        {
2739                return $this->Name_;
2740        }
2741        function getRace()
2742        {
2743                return $this->Race_;
2744        }
2745        function getBloodLine()
2746        {
2747                return $this->BloodLine_;
2748        }
2749        function getGender()
2750        {
2751                return $this->Gender_;
2752        }
2753        function getCorporationName()
2754        {
2755                return $this->CorporationName_;
2756        }
2757        function getCorporationID()
2758        {
2759                return $this->CorporationID_;
2760        }
2761        function getCloneName()
2762        {
2763                return $this->CloneName_;
2764        }
2765        function getCloneSkillPoints()
2766        {
2767                return $this->CloneSkillPoints_;
2768        }
2769        function getBalance()
2770        {
2771                return $this->Balance_;
2772        }
2773        function fetchXML()
2774        {
2775                // is a player feed - take details from logged in user
2776                if (user::get('usr_pilot_id'))
2777        {
2778                        require_once('class.pilot.php');
2779                        $plt = new pilot(user::get('usr_pilot_id'));
2780                        $usersname = $plt->getName();
2781
2782                        $this->CharName_ = $usersname;  // $this->CharName_ is used later for config key value for caching
2783
2784                        $sql = 'select plts.plt_id, plts.plt_externalid from kb3_pilots plts where plts.plt_name = "' . $usersname . '"';
2785
2786                $qry = new DBQuery();
2787                        $qry->execute($sql);
2788                        $row = $qry->getRow();
2789
2790                $pilot_id = $row['plt_id'];
2791                $API_charID = $row['plt_externalid'];
2792
2793                if ( $pilot_id == 0 )
2794                        {
2795                        return "Something went wrong with finiding pilots external ID<br>";
2796                }
2797
2798                        $newsql = 'SELECT userID , apiKey FROM kb3_api_user WHERE charID = "' . $API_charID . '"';
2799                        $qry->execute($newsql);
2800                $userrow = $qry->getRow();
2801
2802                        $API_userID = $userrow['userID'];
2803                        $API_apiKey = $userrow['apiKey'];
2804
2805                        $myKeyString = "userID=" . $API_userID . "&apiKey=" . $API_apiKey . "&characterID=" . $API_charID;
2806
2807                        $data = $this->loaddata($myKeyString);
2808                } else {
2809                        return "You are not logged in.";
2810                }
2811
2812        $xml_parser = xml_parser_create();
2813        xml_set_object ( $xml_parser, $this );
2814        xml_set_element_handler($xml_parser, "startElement", "endElement");
2815        xml_set_character_data_handler ( $xml_parser, 'characterData' );
2816
2817        if (!xml_parse($xml_parser, $data, true))
2818            return "<i>Error getting XML data from api.eve-online.com/CharacterSheet.xml.aspx  </i><br><br>";
2819
2820        xml_parser_free($xml_parser);
2821
2822                return $this->html;
2823        }
2824
2825        function startElement($parser, $name, $attribs)
2826    {
2827                if ($name == "ROW")
2828        {
2829                        global $tempdata;
2830
2831                        if (count($attribs))
2832            {
2833                foreach ($attribs as $k => $v)
2834                {
2835                    switch ($k)
2836                    {
2837                                                case "TYPEID":
2838                                                        $tempdata['typeID'] = $v;
2839                                                        $tempdata['SkillName'] = gettypeIDname($v);
2840                                                        $tempdata['GroupID'] = getgroupID($v);
2841                                                        $tempdata['GroupName'] = getgroupIDname($tempdata['GroupID']);
2842                                                        $tempdata['Rank'] = gettypeIDrank($v);
2843                            break;
2844                                                case "SKILLPOINTS":
2845                                                        $tempdata['SkillPoints'] = $v;
2846                            break;
2847                                                case "LEVEL":
2848                                                        $tempdata['Level'] = $v;
2849
2850                                                        $this->Skills_[] = $tempdata;
2851
2852                                                        $tempdata = array();
2853                                                        unset($tempdata);
2854                            break;
2855                                                case "UNPUBLISHED": // unused skill eg. Black Market Trading
2856                                                        $tempdata = array();
2857                                                        unset($tempdata);
2858                            break;
2859                                        }
2860                                }
2861                        }
2862                }
2863    }
2864
2865    function endElement($parser, $name)
2866    {
2867                // Player Details
2868                if ($name == "CHARACTERID")
2869                        $this->CharacterID_ = $this->characterDataValue;
2870                if ($name == "NAME")
2871                        $this->Name_ = $this->characterDataValue;
2872                if ($name == "RACE")
2873                        $this->Race_ = $this->characterDataValue;
2874                if ($name == "BLOODLINE")
2875                        $this->BloodLine_ = $this->characterDataValue;
2876                if ($name == "GENDER")
2877                        $this->Gender_ = $this->characterDataValue;
2878                if ($name == "CORPORATIONNAME")
2879                        $this->CorporationName_ = $this->characterDataValue;
2880                if ($name == "CORPORATIONID")
2881                        $this->CorporationID_ = $this->characterDataValue;
2882                if ($name == "CLONENAME")
2883                        $this->CloneName_ = $this->characterDataValue;
2884                if ($name == "CLONESKILLPOINTS")
2885                        $this->CloneSkillPoints_ = $this->characterDataValue;
2886                if ($name == "BALANCE")
2887                        $this->Balance_ = $this->characterDataValue;
2888
2889                // Augmentations
2890                if ($name == "AUGMENTATORNAME")
2891                        $tempaug['Name'] = $this->characterDataValue;
2892                if ($name == "AUGMENTATORVALUE")
2893                        $tempaug['Value'] = $this->characterDataValue;
2894
2895                if ($name == "PERCEPTIONBONUS")
2896                {
2897                        $this->Implant_[1] = $tempaug;
2898
2899                        $tempaug = array();
2900                        unset($tempaug);
2901                }
2902                if ($name == "MEMORYBONUS")
2903                {
2904                        $this->Implant_[2] = $tempaug;
2905
2906                        $tempaug = array();
2907                        unset($tempaug);
2908                }
2909                if ($name == "WILLPOWERBONUS")
2910                {
2911                        $this->Implant_[3] = $tempaug;
2912
2913                        $tempaug = array();
2914                        unset($tempaug);
2915                }
2916                if ($name == "INTELLIGENCEBONUS")
2917                {
2918                        $this->Implant_[4] = $tempaug;
2919
2920                        $tempaug = array();
2921                        unset($tempaug);
2922                }
2923                if ($name == "CHARISMABONUS")
2924                {
2925                        $this->Implant_[5] = $tempaug;
2926
2927                        $tempaug = array();
2928                        unset($tempaug);
2929                }
2930
2931                // Attributes
2932                if ($name == "INTELLIGENCE")
2933                        $this->Intelligence_ = $this->characterDataValue;
2934                if ($name == "MEMORY")
2935                        $this->Memory_ = $this->characterDataValue;
2936                if ($name == "CHARISMA")
2937                        $this->Charisma_ = $this->characterDataValue;
2938                if ($name == "PERCEPTION")
2939                        $this->Perception_ = $this->characterDataValue;
2940                if ($name == "WILLPOWER")
2941                        $this->Willpower_ = $this->characterDataValue;
2942
2943                if ($name == "CURRENTTIME")
2944                        $this->CurrentTime_ = $this->characterDataValue;
2945                if ($name == "CACHEDUNTIL")
2946                {
2947                        $this->CachedUntil_ = $this->characterDataValue;
2948                        //ApiCache::set('API_eve_RefTypes' , $this->characterDataValue);
2949                        ApiCache::set( $this->CharName_ . '_CharacterSheet' , $this->characterDataValue);
2950                }
2951    }
2952
2953    function characterData($parser, $data)
2954    {
2955                $this->characterDataValue = $data;
2956    }
2957
2958        function loaddata($keystring)
2959    {
2960                $configvalue = $this->CharName_ . '_CharacterSheet';
2961
2962                $CachedTime = ApiCache::get($configvalue);
2963                $UseCaching = config::get('API_UseCache');
2964
2965        $url = "http://api.eve-online.com/char/CharacterSheet.xml.aspx" . $keystring;
2966
2967        $path = '/char/CharacterSheet.xml.aspx';
2968
2969                // 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.
2970                if ($CachedTime == "")
2971        {
2972                $CachedTime = "2005-01-01 00:00:00"; // fake date to ensure that it runs first time.
2973        }
2974
2975                if (is_file(getcwd().'/cache/api/'.$configvalue.'.xml'))
2976                        $cacheexists = true;
2977                else
2978                        $cacheexists = false;
2979
2980                // if API_UseCache = 1 (off) then don't use cache
2981                if ((strtotime(gmdate("M d Y H:i:s")) - strtotime($CachedTime) > 0) || ($UseCaching == 1)  || !$cacheexists )
2982        {
2983                $fp = fsockopen("api.eve-online.com", 80);
2984
2985                if (!$fp)
2986                {
2987                $this->Output_ .= "Could not connect to API URL";
2988                } else {
2989                        // request the xml
2990                fputs ($fp, "POST " . $path . " HTTP/1.0\r\n");
2991                fputs ($fp, "Host: api.eve-online.com\r\n");
2992                fputs ($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
2993                fputs ($fp, "User-Agent: PHPApi\r\n");
2994                fputs ($fp, "Content-Length: " . strlen($keystring) . "\r\n");
2995                fputs ($fp, "Connection: close\r\n\r\n");
2996                fputs ($fp, $keystring."\r\n");
2997
2998                        // retrieve contents
2999                $contents = "";
3000                while (!feof($fp))
3001                {
3002                        $contents .= fgets($fp);
3003                }
3004
3005                // close connection
3006                fclose($fp);
3007
3008                $start = strpos($contents, "?>");
3009                if ($start !== FALSE)
3010                {
3011                        $contents = substr($contents, $start + strlen("\r\n\r\n"));
3012                }
3013
3014                                // Save the file if we're caching (0 = true in Thunks world)
3015                                if ($UseCaching == 0)
3016                                {
3017                                        $file = fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'w+');
3018                                fwrite($file, $contents);
3019                                fclose($file);
3020                                        @chmod(getcwd().'/cache/api/'.$configvalue.'.xml',0666);
3021                                }
3022                }
3023                } else {
3024                        // re-use cached XML
3025                        if ($fp = @fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'r')) {
3026                $contents = fread($fp, filesize(getcwd().'/cache/api/'.$configvalue.'.xml'));
3027                        fclose($fp);
3028                } else {
3029                                return "<i>error loading cached file ".$configvalue.".xml</i><br><br>";
3030                }
3031                }
3032        return $contents;
3033    }
3034}
3035
3036// **********************************************************************************************************************************************
3037// ****************                                 API Skill Training Sheet - char/SkillInTraining.xml.aspx                     ****************
3038// **********************************************************************************************************************************************
3039class API_SkillInTraining
3040{
3041
3042        function getSkillInTraining()
3043        {
3044                return $this->SkillInTraining_;
3045        }
3046
3047        function getCurrentTQTime()
3048        {
3049                return $this->CurrentTQTime_;
3050        }
3051
3052        function getTrainingEndTime()
3053        {
3054                return $this->TrainingEndTime_;
3055        }
3056
3057        function getTrainingStartTime()
3058        {
3059                return $this->TrainingStartTime_;
3060        }
3061
3062        function getTrainingTypeID()
3063        {
3064                return $this->TrainingTypeID_;
3065        }
3066
3067        function getTrainingStartSP()
3068        {
3069                return $this->TrainingStartSP_;
3070        }
3071
3072        function getTrainingDestinationSP()
3073        {
3074                return $this->TrainingDestinationSP_;
3075        }
3076
3077        function getTrainingToLevel()
3078        {
3079                return $this->TrainingToLevel_;
3080        }
3081
3082        function getCachedUntil()
3083        {
3084                return $this->CachedUntil_;
3085        }
3086
3087        function getCurrentTime()
3088        {
3089                return $this->CurrentTime_;
3090        }
3091
3092        function getSPTrained()
3093        {
3094                return $this->SPTrained_;
3095        }
3096
3097        function getTrainingTimeRemaining()
3098        {
3099                return $this->TrainingTimeRemaining_;
3100        }
3101
3102        function fetchXML()
3103        {
3104                // is a player feed - take details from logged in user
3105                if (user::get('usr_pilot_id'))
3106        {
3107                        require_once('class.pilot.php');
3108                        $plt = new pilot(user::get('usr_pilot_id'));
3109                        $usersname = $plt->getName();
3110
3111                        $this->CharName_ = $usersname;
3112
3113                        $sql = 'select plts.plt_id, plts.plt_externalid from kb3_pilots plts where plts.plt_name = "' . $usersname . '"';
3114
3115                $qry = new DBQuery();
3116                        $qry->execute($sql);
3117                        $row = $qry->getRow();
3118
3119                $pilot_id = $row['plt_id'];
3120                $API_charID = $row['plt_externalid'];
3121
3122                if ( $pilot_id == 0 )
3123                        {
3124                        return "Something went wrong with finiding pilots external ID<br>";
3125                }
3126
3127                        $newsql = 'SELECT userID , apiKey FROM kb3_api_user WHERE charID = "' . $API_charID . '"';
3128                        $qry->execute($newsql);
3129                $userrow = $qry->getRow();
3130
3131                        $API_userID = $userrow['userID'];
3132                        $API_apiKey = $userrow['apiKey'];
3133
3134                        $myKeyString = "userID=" . $API_userID . "&apiKey=" . $API_apiKey . "&characterID=" . $API_charID;
3135
3136                        $data = $this->loaddata($myKeyString);
3137                } else {
3138                        return "You are not logged in.";
3139                }
3140
3141        $xml_parser = xml_parser_create();
3142        xml_set_object ( $xml_parser, $this );
3143        xml_set_element_handler($xml_parser, "startElement", "endElement");
3144        xml_set_character_data_handler ( $xml_parser, 'characterData' );
3145
3146        if (!xml_parse($xml_parser, $data, true))
3147            return "<i>Error getting XML data from api.eve-online.com/SkillInTraining.xml.aspx  </i><br><br>";
3148
3149        xml_parser_free($xml_parser);
3150
3151                // Calculate Time Training remaining and amount of SP Done
3152                if ($this->SkillInTraining_ == 1)
3153                {
3154                        $trainingleft = $this->TrainingEndTime_;
3155
3156                $now       = time();
3157                        $gmmktime  = gmmktime();
3158                $finaltime = $gmmktime - $now;
3159
3160                $year   = (int)substr($trainingleft, 0, 4);
3161                $month  = (int)substr($trainingleft, 5, 2);
3162                $day    = (int)substr($trainingleft, 8, 2);
3163                $hour   = (int)substr($trainingleft, 11, 2) + (($finaltime > 0) ? floor($finaltime / 60 / 60) : 0); //2007-06-22 16:47:50
3164                $minute = (int)substr($trainingleft, 14, 2);
3165                $second = (int)substr($trainingleft, 17, 2);
3166
3167                $difference = gmmktime($hour, $minute, $second, $month, $day, $year) - $now;
3168                        $timedone = $difference;
3169                if ($difference >= 1)
3170                        {
3171                        $days = floor($difference/86400);
3172                        $difference = $difference - ($days*86400);
3173                        $hours = floor($difference/3600);
3174                        $difference = $difference - ($hours*3600);
3175                        $minutes = floor($difference/60);
3176                        $difference = $difference - ($minutes*60);
3177                        $seconds = $difference;
3178                                $this->TrainingTimeRemaining_ = "$days Days, $hours Hours, $minutes Minutes and $seconds Seconds.";
3179                } else {
3180                        $this->TrainingTimeRemaining_ = "Done !";
3181                }
3182
3183                        // Calculate SP done by using the ratio gained from Time spent training so far.
3184                $finaltime = strtotime($this->TrainingEndTime_) - strtotime($this->TrainingStartTime_); // in seconds
3185                        $ratio =  1 - ($timedone / $finaltime);
3186                        $this->SPTrained_ = ($this->TrainingDestinationSP_ - $this->TrainingStartSP_) * $ratio;
3187                }
3188
3189                return $this->html; // should be empty, but keeping just incase - errors are returned by Text so worth looking anyway.
3190        }
3191
3192        function startElement($parser, $name, $attribs)
3193    {
3194                // Nothing to do here
3195    }
3196
3197    function endElement($parser, $name)
3198    {
3199                // Details
3200                if ($name == "SKILLINTRAINING")
3201                        $this->SkillInTraining_ = $this->characterDataValue;
3202                if ($name == "CURRENTTQTIME")
3203                        $this->CurrentTQTime_ = $this->characterDataValue;
3204                if ($name == "TRAININGENDTIME")
3205                        $this->TrainingEndTime_ = $this->characterDataValue;
3206                if ($name == "TRAININGSTARTTIME")
3207                        $this->TrainingStartTime_ = $this->characterDataValue;
3208                if ($name == "TRAININGTYPEID")
3209                        $this->TrainingTypeID_ = $this->characterDataValue;
3210                if ($name == "TRAININGSTARTSP")
3211                        $this->TrainingStartSP_ = $this->characterDataValue;
3212                if ($name == "TRAININGDESTINATIONSP")
3213                        $this->TrainingDestinationSP_ = $this->characterDataValue;
3214                if ($name == "TRAININGTOLEVEL")
3215                        $this->TrainingToLevel_ = $this->characterDataValue;
3216
3217                if ($name == "CURRENTTIME")
3218                        $this->CurrentTime_ = $this->characterDataValue;
3219                if ($name == "CACHEDUNTIL")
3220                {
3221                        $this->CachedUntil_ = $this->characterDataValue;
3222                        //ApiCache::set('API_eve_RefTypes' , $this->characterDataValue);
3223                        ApiCache::set( $this->CharName_ . '_SkillInTraining' , $this->characterDataValue);
3224                }
3225    }
3226
3227    function characterData($parser, $data)
3228    {
3229                $this->characterDataValue = $data;
3230    }
3231
3232        function loaddata($keystring)
3233    {
3234                $configvalue = $this->CharName_ . '_SkillInTraining';
3235
3236                $CachedTime = ApiCache::get($configvalue);
3237                $UseCaching = config::get('API_UseCache');
3238
3239        $url = "http://api.eve-online.com/char/SkillInTraining.xml.aspx" . $keystring;
3240
3241        $path = '/char/SkillInTraining.xml.aspx';
3242
3243                // 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.
3244                if ($CachedTime == "")
3245        {
3246                $CachedTime = "2005-01-01 00:00:00"; // fake date to ensure that it runs first time.
3247        }
3248
3249                if (is_file(getcwd().'/cache/api/'.$configvalue.'.xml'))
3250                        $cacheexists = true;
3251                else
3252                        $cacheexists = false;
3253
3254                // if API_UseCache = 1 (off) then don't use cache
3255                if ((strtotime(gmdate("M d Y H:i:s")) - strtotime($CachedTime) > 0) || ($UseCaching == 1)  || !$cacheexists )
3256        {
3257                $fp = fsockopen("api.eve-online.com", 80);
3258
3259                if (!$fp)
3260                {
3261                $this->Output_ .= "Could not connect to API URL";
3262                } else {
3263                        // request the xml
3264                fputs ($fp, "POST " . $path . " HTTP/1.0\r\n");
3265                fputs ($fp, "Host: api.eve-online.com\r\n");
3266                fputs ($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
3267                fputs ($fp, "User-Agent: PHPApi\r\n");
3268                fputs ($fp, "Content-Length: " . strlen($keystring) . "\r\n");
3269                fputs ($fp, "Connection: close\r\n\r\n");
3270                fputs ($fp, $keystring."\r\n");
3271
3272                        // retrieve contents
3273                $contents = "";
3274                while (!feof($fp))
3275                {
3276                        $contents .= fgets($fp);
3277                }
3278
3279                // close connection
3280                fclose($fp);
3281
3282                $start = strpos($contents, "?>");
3283                if ($start !== FALSE)
3284                {
3285                        $contents = substr($contents, $start + strlen("\r\n\r\n"));
3286                }
3287
3288                                // Save the file if we're caching (0 = true in Thunks world)
3289                                if ($UseCaching == 0)
3290                                {
3291                                        $file = fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'w+');
3292                                fwrite($file, $contents);
3293                                fclose($file);
3294                                        @chmod(getcwd().'/cache/api/'.$configvalue.'.xml',0666);
3295                                }
3296                }
3297                } else {
3298                        // re-use cached XML
3299                        if ($fp = @fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'r')) {
3300                $contents = fread($fp, filesize(getcwd().'/cache/api/'.$configvalue.'.xml'));
3301                        fclose($fp);
3302                } else {
3303                                return "<i>error loading cached file ".$configvalue.".xml</i><br><br>";
3304                }
3305                }
3306        return $contents;
3307    }
3308}
3309
3310// **********************************************************************************************************************************************
3311// ****************                                       API StarbaseList - /corp/StarbaseList.xml.aspx                         ****************
3312// **********************************************************************************************************************************************
3313class API_StarbaseList
3314{
3315        function getCachedUntil()
3316        {
3317                return $this->CachedUntil_;
3318        }
3319
3320        function getCurrentTime()
3321        {
3322                return $this->CurrentTime_;
3323        }
3324
3325        function setAPIKey($key)
3326        {
3327                $this->API_apiKey_ = $key;
3328        }
3329
3330        function setUserID($uid)
3331        {
3332                $this->API_userID_ = $uid;
3333        }
3334
3335        function setCharacterID($cid)
3336        {
3337                $this->API_charID_ = $cid;
3338        }
3339
3340        function getStarbases()
3341        {
3342                return $this->Starbase_;
3343        }
3344
3345        function fetchXML()
3346        {
3347                // is a player feed - take details from logged in user
3348                if (user::get('usr_pilot_id'))
3349        {
3350                        require_once('class.pilot.php');
3351                        $plt = new pilot(user::get('usr_pilot_id'));
3352                        $usersname = $plt->getName();
3353
3354                        $this->CharName_ = $usersname;
3355
3356                        $sql = 'select plts.plt_id, plts.plt_externalid from kb3_pilots plts where plts.plt_name = "' . $usersname . '"';
3357
3358                $qry = new DBQuery();
3359                        $qry->execute($sql);
3360                        $row = $qry->getRow();
3361
3362                $pilot_id = $row['plt_id'];
3363                $API_charID = $row['plt_externalid'];
3364
3365                if ( $pilot_id == 0 )
3366                        {
3367                        return "Something went wrong with finiding pilots external ID<br>";
3368                }
3369
3370                        $newsql = 'SELECT userID , apiKey FROM kb3_api_user WHERE charID = "' . $API_charID . '"';
3371                        $qry->execute($newsql);
3372                $userrow = $qry->getRow();
3373
3374                        $API_userID = $userrow['userID'];
3375                        $API_apiKey = $userrow['apiKey'];
3376
3377                        $myKeyString = "userID=" . $API_userID . "&apiKey=" . $API_apiKey . "&characterID=" . $API_charID;
3378
3379                        $data = $this->loaddata($myKeyString);
3380                } else {
3381                        if ($this->API_userID_ != "" && $this->API_apiKey_ != "" && $this->API_charID_ != "")
3382                        {
3383                                $myKeyString = "userID=" . $this->API_userID_ . "&apiKey=" . $this->API_apiKey_ . "&characterID=" . $this->API_charID_;
3384                                $this->CharName_ = $this->API_charID_;
3385                                $data = $this->loaddata($myKeyString);
3386                        } else {
3387                                return "You are not logged in and have not set API details.";
3388                        }
3389                }
3390
3391        $xml_parser = xml_parser_create();
3392        xml_set_object ( $xml_parser, $this );
3393        xml_set_element_handler($xml_parser, "startElement", "endElement");
3394        xml_set_character_data_handler ( $xml_parser, 'characterData' );
3395
3396        if (!xml_parse($xml_parser, $data, true))
3397            return "<i>Error getting XML data from api.eve-online.com/StarbaseList.xml.aspx  </i><br><br>";
3398
3399        xml_parser_free($xml_parser);
3400
3401                return $this->html; // should be empty, but keeping just incase - errors are returned by Text so worth looking anyway.
3402        }
3403
3404        function startElement($parser, $name, $attribs)
3405    {
3406                if ($name == "ROW")
3407        {
3408                        global $tempdata;
3409
3410                        if (count($attribs))
3411            {
3412                foreach ($attribs as $k => $v)
3413                {
3414                    switch ($k)
3415                    {
3416                                                case "ITEMID":
3417                                                        $tempdata['itemID'] = $v;
3418                            break;
3419                                                case "TYPEID":
3420                                                        $tempdata['typeID'] = $v;
3421                                                        $tempdata['typeName'] = gettypeIDname($v);
3422                            break;
3423                                                case "LOCATIONID":
3424                                                        $tempdata['locationID'] = $v;
3425                                                        $sql = 'select sys.sys_name, sys.sys_sec from kb3_systems sys where sys.sys_eve_id = '.$v;
3426
3427                                $qry = new DBQuery();
3428                                $qry->execute($sql);
3429                                $row = $qry->getRow();
3430
3431                                $tempdata['locationName'] = $row['sys_name'];
3432                                $mysec = $row['sys_sec'];
3433                                if ($mysec <= 0)
3434                                $tempdata['locationSec'] = number_format(0.0, 1);
3435                                else
3436                                $tempdata['locationSec'] = number_format(round($mysec, 1), 1);
3437                            break;
3438                                                case "MOONID":
3439                                                        $tempdata['moonID'] = $v;
3440                                                        $tempmoon = getMoonName($v);
3441
3442                                                        if ($tempmoon == "")
3443                                                        {
3444                                                                // Use API IDtoName to get Moon Name.
3445                                                                $this->myIDName = new API_IDtoName();
3446                                                                $this->myIDName->clear();
3447                                                                $this->myIDName->setIDs($v);
3448                                                                $this->Output_ .= $this->myIDName->fetchXML();
3449                                                                $myNames = $this->myIDName->getIDData();
3450                                                                $tempdata['moonName'] = $myNames[0]['name'];
3451                                                        } else {
3452                                                                $tempdata['moonName'] = $tempmoon;
3453                                                        }
3454                            break;
3455                                                case "STATE":
3456                                                        $tempdata['state'] = $v;
3457                            break;
3458                                                case "STATETIMESTAMP":
3459                                                        $tempdata['stateTimestamp'] = $v;
3460                            break;
3461                                                case "ONLINETIMESTAMP":
3462                                                        $tempdata['onlineTimestamp'] = $v;
3463                                                        $this->Starbase_[] = $tempdata;
3464
3465                                                        $tempdata = array();
3466                                                        unset($tempdata);
3467                            break;
3468                                        }
3469                                }
3470                        }
3471                }
3472    }
3473
3474    function endElement($parser, $name)
3475    {
3476                // Details
3477                if ($name == "ERROR")
3478                        $this->html .= $this->characterDataValue;
3479                if ($name == "CURRENTTIME")
3480                        $this->CurrentTime_ = $this->characterDataValue;
3481                if ($name == "CACHEDUNTIL")
3482                {
3483                        $this->CachedUntil_ = $this->characterDataValue;
3484                        //ApiCache::set('API_eve_RefTypes' , $this->characterDataValue);
3485                        ApiCache::set( $this->CharName_ . '_StarbaseList' , $this->characterDataValue);
3486                }
3487    }
3488
3489    function characterData($parser, $data)
3490    {
3491                $this->characterDataValue = $data;
3492    }
3493
3494        function loaddata($keystring)
3495    {
3496                $configvalue = $this->CharName_ . '_StarbaseList';
3497
3498                $CachedTime = ApiCache::get($configvalue);
3499                $UseCaching = config::get('API_UseCache');
3500
3501        $url = "http://api.eve-online.com/corp/StarbaseList.xml.aspx" . $keystring;
3502
3503        $path = '/corp/StarbaseList.xml.aspx';
3504
3505                // 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.
3506                if ($CachedTime == "")
3507        {
3508                $CachedTime = "2005-01-01 00:00:00"; // fake date to ensure that it runs first time.
3509        }
3510
3511                if (is_file(getcwd().'/cache/api/'.$configvalue.'.xml'))
3512                        $cacheexists = true;
3513                else
3514                        $cacheexists = false;
3515
3516                // if API_UseCache = 1 (off) then don't use cache
3517                if ((strtotime(gmdate("M d Y H:i:s")) - strtotime($CachedTime) > 0) || ($UseCaching == 1)  || !$cacheexists )
3518        {
3519                $fp = fsockopen("api.eve-online.com", 80);
3520
3521                if (!$fp)
3522                {
3523                $this->Output_ .= "Could not connect to API URL";
3524                } else {
3525                        // request the xml
3526                fputs ($fp, "POST " . $path . " HTTP/1.0\r\n");
3527                fputs ($fp, "Host: api.eve-online.com\r\n");
3528                fputs ($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
3529                fputs ($fp, "User-Agent: PHPApi\r\n");
3530                fputs ($fp, "Content-Length: " . strlen($keystring) . "\r\n");
3531                fputs ($fp, "Connection: close\r\n\r\n");
3532                fputs ($fp, $keystring."\r\n");
3533
3534                        // retrieve contents
3535                $contents = "";
3536                while (!feof($fp))
3537                {
3538                        $contents .= fgets($fp);
3539                }
3540
3541                // close connection
3542                fclose($fp);
3543
3544                $start = strpos($contents, "?>");
3545                if ($start !== FALSE)
3546                {
3547                        $contents = substr($contents, $start + strlen("\r\n\r\n"));
3548                }
3549
3550                                // Save the file if we're caching (0 = true in Thunks world)
3551                                if ($UseCaching == 0)
3552                                {
3553                                        $file = fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'w+');
3554                                fwrite($file, $contents);
3555                                fclose($file);
3556                                        @chmod(getcwd().'/cache/api/'.$configvalue.'.xml',0666);
3557                                }
3558                }
3559                } else {
3560                        // re-use cached XML
3561                        if ($fp = @fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'r')) {
3562                $contents = fread($fp, filesize(getcwd().'/cache/api/'.$configvalue.'.xml'));
3563                        fclose($fp);
3564                } else {
3565                                return "<i>error loading cached file ".$configvalue.".xml</i><br><br>";
3566                }
3567                }
3568        return $contents;
3569    }
3570}
3571
3572// **********************************************************************************************************************************************
3573// ****************                                       API StarbaseDetail - /corp/StarbaseDetail.xml.aspx                          ****************
3574// **********************************************************************************************************************************************
3575class API_StarbaseDetail
3576{
3577        function getCachedUntil()
3578        {
3579                return $this->CachedUntil_;
3580        }
3581
3582        function getCurrentTime()
3583        {
3584                return $this->CurrentTime_;
3585        }
3586
3587        function setAPIKey($key)
3588        {
3589                $this->API_apiKey_ = $key;
3590        }
3591
3592        function setUserID($uid)
3593        {
3594                $this->API_userID_ = $uid;
3595        }
3596
3597        function setCharacterID($cid)
3598        {
3599                $this->API_charID_ = $cid;
3600        }
3601
3602        function setitemID($itemID)
3603        {
3604                $this->API_itemID_ = $itemID;
3605        }
3606        function getFuel()
3607        {
3608                return $this->Fuel_;
3609        }
3610        function getState()
3611        {
3612                return $this->State_;
3613        }
3614        function getstateTimestamp()
3615        {
3616                return $this->stateTimestamp_;
3617        }
3618        function getonlineTimestamp()
3619        {
3620                return $this->onlineTimestamp_;
3621        }
3622        function getusageFlags()
3623        {
3624                return $this->usageFlags_;
3625        }
3626        function getdeployFlags()
3627        {
3628                return $this->deployFlags_;
3629        }
3630        function getallowCorporationMembers()
3631        {
3632                return $this->allowCorporationMembers_;
3633        }
3634        function getallowAllianceMembers()
3635        {
3636                return $this->allowAllianceMembers_;
3637        }
3638        function getclaimSovereignty()
3639        {
3640                return $this->claimSovereignty_;
3641        }
3642        function getonStandingDrop()
3643        {
3644                return $this->onStandingDrop_;
3645        }
3646        function getonStatusDrop()
3647        {
3648                return $this->onStatusDrop_;
3649        }
3650        function getonAggression()
3651        {
3652                return $this->onAggression_;
3653        }
3654        function getonCorporationWar()
3655        {
3656                return $this->onCorporationWar_;
3657        }
3658
3659
3660        function fetchXML()
3661        {
3662                // is a player feed - take details from logged in user
3663                if (user::get('usr_pilot_id'))
3664        {
3665                        require_once('class.pilot.php');
3666                        $plt = new pilot(user::get('usr_pilot_id'));
3667                        $usersname = $plt->getName();
3668
3669                        $this->CharName_ = $usersname;
3670
3671                        $sql = 'select plts.plt_id, plts.plt_externalid from kb3_pilots plts where plts.plt_name = "' . $usersname . '"';
3672
3673                $qry = new DBQuery();
3674                        $qry->execute($sql);
3675                        $row = $qry->getRow();
3676
3677                $pilot_id = $row['plt_id'];
3678                $API_charID = $row['plt_externalid'];
3679
3680                if ( $pilot_id == 0 )
3681                        {
3682                        return "Something went wrong with finding pilots external ID<br>";
3683                }
3684
3685                        $newsql = 'SELECT userID , apiKey FROM kb3_api_user WHERE charID = "' . $API_charID . '"';
3686                        $qry->execute($newsql);
3687                $userrow = $qry->getRow();
3688
3689                        $API_userID = $userrow['userID'];
3690                        $API_apiKey = $userrow['apiKey'];
3691
3692                        $myKeyString = "userID=" . $API_userID . "&apiKey=" . $API_apiKey . "&characterID=" . $API_charID . "&itemID=" . $this->API_itemID_;
3693
3694                        $data = $this->loaddata($myKeyString);
3695                } else {
3696                        if (($this->API_userID_ != "") && ($this->API_apiKey_ != "") && ($this->API_charID_ != "") && ($this->API_itemID_ != ""))
3697                        {
3698                                $myKeyString = "userID=" . $this->API_userID_ . "&apiKey=" . $this->API_apiKey_ . "&characterID=" . $this->API_charID_ . "&itemID=" . $this->API_itemID_;
3699                                $this->CharName_ = $this->API_charID_;
3700                                $data = $this->loaddata($myKeyString);
3701                        } else {
3702                                return "You are not logged in and have not set API details.";
3703                        }
3704                }
3705
3706        $xml_parser = xml_parser_create();
3707        xml_set_object ( $xml_parser, $this );
3708        xml_set_element_handler($xml_parser, "startElement", "endElement");
3709        xml_set_character_data_handler ( $xml_parser, 'characterData' );
3710
3711        if (!xml_parse($xml_parser, $data, true))
3712            return "<i>Error getting XML data from api.eve-online.com/StarbaseDetail.xml.aspx  </i><br><br>";
3713
3714        xml_parser_free($xml_parser);
3715
3716                return $this->html; // should be empty, but keeping just incase - errors are returned by Text so worth looking anyway.
3717        }
3718
3719        function startElement($parser, $name, $attribs)
3720    {
3721                if ($name == "ROW")
3722        {
3723                        global $tempdata;
3724
3725                        if (count($attribs))
3726            {
3727                foreach ($attribs as $k => $v)
3728                {
3729                    switch ($k)
3730                    {
3731                                                case "TYPEID":
3732                                                        $fueldata['typeID'] = $v;
3733                                                        $fueldata['typeName'] = gettypeIDname($v);
3734                            break;
3735                                                case "QUANTITY":
3736                                                        $fueldata['quantity'] = $v;
3737                                                        $this->Fuel_[] = $fueldata;
3738
3739                                                        $fueldata = array();
3740                                                        unset($fueldata);
3741                            break;
3742                                        }
3743                                }
3744                        }
3745                }
3746
3747                if ($name == "ONSTANDINGDROP")
3748        {
3749                        if (count($attribs))
3750            {
3751                foreach ($attribs as $k => $v)
3752                {
3753                    switch ($k)
3754                    {
3755                                                case "ENABLED":
3756                                                        $this->onStandingDrop_['enabled'] = $v;
3757                            break;
3758                                                case "STANDING":
3759                                                        $this->onStandingDrop_['standing'] = $v;
3760                            break;
3761                                        }
3762                                }
3763                        }
3764                }
3765
3766                if ($name == "ONSTATUSDROP")
3767        {
3768                        if (count($attribs))
3769            {
3770                foreach ($attribs as $k => $v)
3771                {
3772                    switch ($k)
3773                    {
3774                                                case "ENABLED":
3775                                                        $this->onStatusDrop_['enabled'] = $v;
3776                            break;
3777                                                case "STANDING":
3778                                                        $this->onStatusDrop_['standing'] = $v;
3779                            break;
3780                                        }
3781                                }
3782                        }
3783                }
3784
3785                if ($name == "ONAGGRESSION")
3786        {
3787                        if (count($attribs))
3788            {
3789                foreach ($attribs as $k => $v)
3790                {
3791                    switch ($k)
3792                    {
3793                                                case "ENABLED":
3794                                                        $this->onAggression_['enabled'] = $v;
3795                            break;
3796                                        }
3797                                }
3798                        }
3799                }
3800
3801                if ($name == "ONCORPORATIONWAR")
3802        {
3803                        if (count($attribs))
3804            {
3805                foreach ($attribs as $k => $v)
3806                {
3807                    switch ($k)
3808                    {
3809                                                case "ENABLED":
3810                                                        $this->onCorporationWar_['enabled'] = $v;
3811                            break;
3812                                        }
3813                                }
3814                        }
3815                }
3816    }
3817
3818    function endElement($parser, $name)
3819    {
3820                // Details
3821                if ($name == "ERROR")
3822                        $this->html .= $this->characterDataValue;
3823
3824                if ($name == "STATE")
3825                        $this->State_ .= $this->characterDataValue;
3826                if ($name == "STATETIMESTAMP")
3827                        $this->stateTimestamp_ .= $this->characterDataValue;
3828                if ($name == "ONLINETIMESTAMP")
3829                        $this->onlineTimestamp_ .= $this->characterDataValue;
3830
3831                // General Settings
3832                if ($name == "USAGEFLAGS")
3833                        $this->usageFlags_ .= $this->characterDataValue;
3834                if ($name == "DEPLOYFLAGS")
3835                        $this->deployFlags_ .= $this->characterDataValue;
3836                if ($name == "ALLOWCORPORATIONMEMBERS")
3837                        $this->allowCorporationMembers_ .= $this->characterDataValue;
3838                if ($name == "ALLOWALLIANCEMEMBERS")
3839                        $this->allowAllianceMembers_ .= $this->characterDataValue;
3840                if ($name == "CLAIMSOVEREIGNTY")
3841                        $this->claimSovereignty_ .= $this->characterDataValue;
3842
3843                if ($name == "CURRENTTIME")
3844                        $this->CurrentTime_ = $this->characterDataValue;
3845                if ($name == "CACHEDUNTIL")
3846                {
3847                        $this->CachedUntil_ = $this->characterDataValue;
3848                        //ApiCache::set('API_eve_RefTypes' , $this->characterDataValue);
3849                        ApiCache::set( $this->API_itemID_ . '_StarbaseDetail' , $this->characterDataValue);
3850                }
3851    }
3852
3853    function characterData($parser, $data)
3854    {
3855                $this->characterDataValue = $data;
3856    }
3857
3858        function loaddata($keystring)
3859    {
3860                $configvalue = $this->API_itemID_ . '_StarbaseDetail';
3861
3862                $CachedTime = ApiCache::get($configvalue);
3863                $UseCaching = config::get('API_UseCache');
3864
3865        $url = "http://api.eve-online.com/corp/StarbaseDetail.xml.aspx" . $keystring;
3866
3867        $path = '/corp/StarbaseDetail.xml.aspx';
3868
3869                // 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.
3870                if ($CachedTime == "")
3871        {
3872                $CachedTime = "2005-01-01 00:00:00"; // fake date to ensure that it runs first time.
3873        }
3874
3875                if (is_file(getcwd().'/cache/api/'.$configvalue.'.xml'))
3876                        $cacheexists = true;
3877                else
3878                        $cacheexists = false;
3879
3880                // if API_UseCache = 1 (off) then don't use cache
3881                if ((strtotime(gmdate("M d Y H:i:s")) - strtotime($CachedTime) > 0) || ($UseCaching == 1)  || !$cacheexists )
3882        {
3883                $fp = fsockopen("api.eve-online.com", 80);
3884
3885                if (!$fp)
3886                {
3887                $this->Output_ .= "Could not connect to API URL";
3888                } else {
3889                        // request the xml
3890                fputs ($fp, "POST " . $path . " HTTP/1.0\r\n");
3891                fputs ($fp, "Host: api.eve-online.com\r\n");
3892                fputs ($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
3893                fputs ($fp, "User-Agent: PHPApi\r\n");
3894                fputs ($fp, "Content-Length: " . strlen($keystring) . "\r\n");
3895                fputs ($fp, "Connection: close\r\n\r\n");
3896                fputs ($fp, $keystring."\r\n");
3897
3898                        // retrieve contents
3899                $contents = "";
3900                while (!feof($fp))
3901                {
3902                        $contents .= fgets($fp);
3903                }
3904
3905                // close connection
3906                fclose($fp);
3907
3908                $start = strpos($contents, "?>");
3909                if ($start !== FALSE)
3910                {
3911                        $contents = substr($contents, $start + strlen("\r\n\r\n"));
3912                }
3913
3914                                // Save the file if we're caching (0 = true in Thunks world)
3915                                if ($UseCaching == 0)
3916                                {
3917                                        $file = fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'w+');
3918                                fwrite($file, $contents);
3919                                fclose($file);
3920                                        @chmod(getcwd().'/cache/api/'.$configvalue.'.xml',0666);
3921                                }
3922                }
3923                } else {
3924                        // re-use cached XML
3925                        if ($fp = @fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'r')) {
3926                $contents = fread($fp, filesize(getcwd().'/cache/api/'.$configvalue.'.xml'));
3927                        fclose($fp);
3928                } else {
3929                                return "<i>error loading cached file ".$configvalue.".xml</i><br><br>";
3930                }
3931                }
3932        return $contents;
3933    }
3934}
3935
3936// **********************************************************************************************************************************************
3937// ****************                                   API Corporation Sheet - /corp/CorporationSheet.xml.aspx                    ****************
3938// **********************************************************************************************************************************************
3939// INCOMPLETE - MISSING CORP DIVISIONS AND WALLET DIVISIONS
3940class API_CorporationSheet
3941{
3942        function getCachedUntil()
3943        {
3944                return $this->CachedUntil_;
3945        }
3946
3947        function getCurrentTime()
3948        {
3949                return $this->CurrentTime_;
3950        }
3951
3952        function setAPIKey($key)
3953        {
3954                $this->API_apiKey_ = $key;
3955        }
3956
3957        function setUserID($uid)
3958        {
3959                $this->API_userID_ = $uid;
3960        }
3961
3962        function setCharacterID($cid)
3963        {
3964                $this->API_charID_ = $cid;
3965        }
3966
3967        function setCorpID($corpid)
3968        {
3969                $this->API_corpID_ = $corpid;
3970        }
3971
3972        function getAllianceID()
3973        {
3974                return $this->allianceID_;
3975        }
3976
3977        function getAllianceName()
3978        {
3979                return $this->allianceName_;
3980        }
3981
3982        function getCorporationID()
3983        {
3984                return $this->corporationID_;
3985        }
3986
3987        function getCorporationName()
3988        {
3989                return $this->corporationName_;
3990        }
3991
3992        function getTicker()
3993        {
3994                return $this->ticker_;
3995        }
3996
3997        function getCeoID()
3998        {
3999                return $this->ceoID_;
4000        }
4001
4002        function getCeoName()
4003        {
4004                return $this->ceoName_;
4005        }
4006
4007        function getStationID()
4008        {
4009                return $this->stationID_;
4010        }
4011
4012        function getStationName()
4013        {
4014                return $this->stationName_;
4015        }
4016
4017        function getDescription()
4018        {
4019                return $this->description_;
4020        }
4021
4022        function getUrl()
4023        {
4024                return $this->url_;
4025        }
4026
4027        function getLogo()
4028        {
4029                return $this->logo_;
4030        }
4031
4032        function getTaxRate()
4033        {
4034                return $this->taxRate_;
4035        }
4036
4037        function getMemberCount()
4038        {
4039                return $this->memberCount_;
4040        }
4041
4042        function getMemberLimit()
4043        {
4044                return $this->memberLimit_;
4045        }
4046
4047        function getShares()
4048        {
4049                return $this->shares_;
4050        }
4051
4052        function fetchXML()
4053        {
4054                // is a player feed - take details from logged in user
4055                if ($this->API_corpID_ != "")
4056                {
4057                        $myKeyString = "corporationID=" . $this->API_corpID_;
4058                        $this->CharName_ = $this->API_corpID_;
4059                        $data = $this->loaddata($myKeyString);
4060
4061                } elseif (user::get('usr_pilot_id')) {
4062                        require_once('class.pilot.php');
4063                        $plt = new pilot(user::get('usr_pilot_id'));
4064                        $usersname = $plt->getName();
4065
4066                        $this->CharName_ = $usersname;
4067
4068                        $sql = 'select plts.plt_id, plts.plt_externalid from kb3_pilots plts where plts.plt_name = "' . $usersname . '"';
4069
4070                $qry = new DBQuery();
4071                        $qry->execute($sql);
4072                        $row = $qry->getRow();
4073
4074                $pilot_id = $row['plt_id'];
4075                $API_charID = $row['plt_externalid'];
4076
4077                if ( $pilot_id == 0 )
4078                        {
4079                        return "Something went wrong with finding pilots external ID<br>";
4080                }
4081
4082                        $newsql = 'SELECT userID , apiKey FROM kb3_api_user WHERE charID = "' . $API_charID . '"';
4083                        $qry->execute($newsql);
4084                $userrow = $qry->getRow();
4085
4086                        $API_userID = $userrow['userID'];
4087                        $API_apiKey = $userrow['apiKey'];
4088
4089                        $myKeyString = "userID=" . $API_userID . "&apiKey=" . $API_apiKey . "&characterID=" . $API_charID;
4090
4091                        $data = $this->loaddata($myKeyString);
4092                } else {
4093                        if (($this->API_userID_ != "") && ($this->API_apiKey_ != "") && ($this->API_charID_ != ""))
4094                        {
4095                                $myKeyString = "userID=" . $this->API_userID_ . "&apiKey=" . $this->API_apiKey_ . "&characterID=" . $this->API_charID_;
4096                                $this->CharName_ = $this->API_charID_;
4097                                $data = $this->loaddata($myKeyString);
4098                        } else {
4099                                return "You are not logged in and have not set API details.";
4100                        }
4101                }
4102
4103        $xml_parser = xml_parser_create();
4104        xml_set_object ( $xml_parser, $this );
4105        xml_set_element_handler($xml_parser, "startElement", "endElement");
4106        xml_set_character_data_handler ( $xml_parser, 'characterData' );
4107
4108        if (!xml_parse($xml_parser, $data, true))
4109            return "<i>Error getting XML data from api.eve-online.com/CorporationSheet.xml.aspx  </i><br><br>";
4110
4111        xml_parser_free($xml_parser);
4112
4113                return $this->html; // should be empty, but keeping just incase - errors are returned by Text so worth looking anyway.
4114        }
4115
4116        function startElement($parser, $name, $attribs)
4117    {
4118                $this->characterDataValue = "";
4119
4120                if ($name == "DESCRIPTION")
4121                {
4122                        $this->DataIsDescription = true;
4123                        //$this->characterDataValue = "";
4124                } else {
4125                        $this->DataIsDescription = false;
4126                }
4127    }
4128
4129    function endElement($parser, $name)
4130    {
4131                // Details
4132                switch ($name)
4133        {
4134                        case "ERROR":
4135                                $this->html .= $this->characterDataValue;
4136                break;
4137                        case "CORPORATIONID":
4138                                $this->corporationID_ = $this->characterDataValue;
4139                break;
4140                        case "CORPORATIONNAME":
4141                                $this->corporationName_ = $this->characterDataValue;
4142                break;
4143                        case "TICKER":
4144                                $this->ticker_ = $this->characterDataValue;
4145                break;
4146                        case "CEOID":
4147                                $this->ceoID_ = $this->characterDataValue;
4148                break;
4149                        case "CEONAME":
4150                                $this->ceoName_ = $this->characterDataValue;
4151                break;
4152                        case "STATIONID":
4153                                $this->stationID_ = $this->characterDataValue;
4154                break;
4155                        case "STATIONNAME":
4156                                $this->stationName_ = $this->characterDataValue;
4157                break;
4158                        case "DESCRIPTION":
4159                                $this->description_ = $this->characterDataValue;
4160                break;
4161                        case "URL":
4162                                $this->url_ = $this->characterDataValue;
4163                break;
4164                        case "ALLIANCEID":
4165                                $this->allianceID_ = $this->characterDataValue;
4166                break;
4167                        case "ALLIANCENAME":
4168                                $this->allianceName_ = $this->characterDataValue;
4169                break;
4170                        case "TAXRATE":
4171                                $this->taxRate_ = $this->characterDataValue;
4172                break;
4173                        case "MEMBERCOUNT":
4174                                $this->memberCount_ = $this->characterDataValue;
4175                break;
4176                        case "MEMBERLIMIT":
4177                                $this->memberLimit_ = $this->characterDataValue;
4178                break;
4179                        case "SHARES":
4180                                $this->shares_ = $this->characterDataValue;
4181                break;
4182
4183                        case "GRAPHICID":
4184                                $this->logo_["graphicID"] = $this->characterDataValue;
4185                break;
4186                        case "SHAPE1":
4187                                $this->logo_["shape1"] = $this->characterDataValue;
4188                break;
4189                        case "SHAPE2":
4190                                $this->logo_["shape2"] = $this->characterDataValue;
4191                break;
4192                        case "SHAPE3":
4193                                $this->logo_["shape3"] = $this->characterDataValue;
4194                break;
4195                        case "COLOR1":
4196                                $this->logo_["colour1"] = $this->characterDataValue;
4197                break;
4198                        case "COLOR2":
4199                                $this->logo_["colour2"] = $this->characterDataValue;
4200                break;
4201                        case "COLOR3":
4202                                $this->logo_["colour3"] = $this->characterDataValue;
4203                break;
4204                }
4205
4206                if ($name == "CURRENTTIME")
4207                        $this->CurrentTime_ = $this->characterDataValue;
4208                if ($name == "CACHEDUNTIL")
4209                {
4210                        $this->CachedUntil_ = $this->characterDataValue;
4211                        //ApiCache::set('API_eve_RefTypes' , $this->characterDataValue);
4212                        ApiCache::set( $this->CharName_ . '_CorporationSheet' , $this->characterDataValue);
4213                }
4214    }
4215
4216    function characterData($parser, $data)
4217    {
4218                //  This is a fix for some hosts that strip "<" and ">" from the API XML when it's put into a string. I have no idea why this happens, where or how - but this puts them back
4219                if ($this->DataIsDescription)
4220                {
4221                        if ( $data == "<" )
4222                        {
4223                                $this->tagsareworking = true;
4224                        }
4225
4226                        if (!$this->tagsareworking)
4227                        {
4228                                if ( ($data == "br") || ($data == "b") || ($data == "/a") || ($data == "/b") || ($data == "/font") || (substr($data,0,4)== "font") || (substr($data,0,6)== "a href"))
4229                                {
4230                                        $data = "<" .$data.">";
4231                                }
4232                        }
4233                        $this->characterDataValue .= $data;
4234                } else {
4235                        $this->characterDataValue = $data;
4236                }
4237
4238
4239                //echo $data;
4240    }
4241
4242        function loaddata($keystring)
4243    {
4244                $configvalue = $this->CharName_ . '_CorporationSheet';
4245
4246                $CachedTime = ApiCache::get($configvalue);
4247                $UseCaching = config::get('API_UseCache');
4248
4249        $url = "http://api.eve-online.com/corp/CorporationSheet.xml.aspx" . $keystring;
4250
4251        $path = '/corp/CorporationSheet.xml.aspx';
4252
4253                // 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.
4254                if ($CachedTime == "")
4255        {
4256                $CachedTime = "2005-01-01 00:00:00"; // fake date to ensure that it runs first time.
4257        }
4258
4259                if (is_file(getcwd().'/cache/api/'.$configvalue.'.xml'))
4260                        $cacheexists = true;
4261                else
4262                        $cacheexists = false;
4263
4264                // if API_UseCache = 1 (off) then don't use cache
4265                if ((strtotime(gmdate("M d Y H:i:s")) - strtotime($CachedTime) > 0) || ($UseCaching == 1)  || !$cacheexists )
4266        {
4267                $fp = fsockopen("api.eve-online.com", 80);
4268
4269                if (!$fp)
4270                {
4271                $this->Output_ .= "Could not connect to API URL";
4272                } else {
4273                        // request the xml
4274                fputs ($fp, "POST " . $path . " HTTP/1.0\r\n");
4275                fputs ($fp, "Host: api.eve-online.com\r\n");
4276                fputs ($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
4277                fputs ($fp, "User-Agent: PHPApi\r\n");
4278                fputs ($fp, "Content-Length: " . strlen($keystring) . "\r\n");
4279                fputs ($fp, "Connection: close\r\n\r\n");
4280                fputs ($fp, $keystring."\r\n");
4281
4282                        // retrieve contents
4283                $contents = "";
4284                while (!feof($fp))
4285                {
4286                        $contents .= fgets($fp);
4287                }
4288
4289                // close connection
4290                fclose($fp);
4291
4292                $start = strpos($contents, "?>");
4293                if ($start !== FALSE)
4294                {
4295                        $contents = substr($contents, $start + strlen("\r\n\r\n"));
4296                }
4297
4298                                // Save the file if we're caching (0 = true in Thunks world)
4299                                if ($UseCaching == 0)
4300                                {
4301                                        $file = fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'w+');
4302                                fwrite($file, $contents);
4303                                fclose($file);
4304                                        @chmod(getcwd().'/cache/api/'.$configvalue.'.xml',0666);
4305                                }
4306                }
4307                } else {
4308                        // re-use cached XML
4309                        if ($fp = @fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'r')) {
4310                $contents = fread($fp, filesize(getcwd().'/cache/api/'.$configvalue.'.xml'));
4311                        fclose($fp);
4312                } else {
4313                                return "<i>error loading cached file ".$configvalue.".xml</i><br><br>";
4314                }
4315                }
4316        return $contents;
4317    }
4318}
4319// **********************************************************************************************************************************************
4320// ****************                                   API Name -> ID Conversion /eve/CharacterID.xml.aspx                            ****************
4321// **********************************************************************************************************************************************
4322class API_NametoID
4323{
4324        function getCachedUntil()
4325        {
4326                return $this->CachedUntil_;
4327        }
4328
4329        function getCurrentTime()
4330        {
4331                return $this->CurrentTime_;
4332        }
4333
4334        function setNames($names)
4335        {
4336                $this->API_Names_ = $names;
4337        }
4338        function getNameData()
4339        {
4340                return $this->NameData_;
4341        }
4342
4343        function clear()
4344        {
4345                $this->NameData_ = array();
4346                unset($this->NameData_);
4347        }
4348
4349        function fetchXML()
4350        {
4351                if ($this->API_Names_ != "")
4352                {
4353                        $myKeyString = "names=" . $this->API_Names_;
4354                        $data = $this->loaddata($myKeyString);
4355                } else {
4356                        return "No Names have been input.";
4357                }
4358
4359        $xml_parser = xml_parser_create();
4360        xml_set_object ( $xml_parser, $this );
4361        xml_set_element_handler($xml_parser, "startElement", "endElement");
4362        xml_set_character_data_handler ( $xml_parser, 'characterData' );
4363
4364        if (!xml_parse($xml_parser, $data, true))
4365            return "<i>Error getting XML data from api.eve-online.com/CharacterID.xml.aspx  </i><br><br>";
4366
4367        xml_parser_free($xml_parser);
4368
4369                return $this->html; // should be empty, but keeping just incase - errors are returned by Text so worth looking anyway.
4370        }
4371
4372        function startElement($parser, $name, $attribs)
4373    {
4374                global $NameData;
4375
4376                if ($name == "ROW")
4377        {
4378            if (count($attribs))
4379            {
4380                foreach ($attribs as $k => $v)
4381                {
4382                    switch ($k)
4383                    {
4384                        case "NAME":
4385                            $NameData['name'] = $v;
4386                            break;
4387                        case "CHARACTERID":
4388                            $NameData['characterID'] = $v;
4389                            break;
4390                    }
4391                }
4392            }
4393        }
4394    }
4395
4396    function endElement($parser, $name)
4397    {
4398                global $NameData;
4399
4400                // Details
4401                if ($name == "ERROR")
4402                        $this->html .= $this->characterDataValue;
4403
4404                if ($name == "ROW")
4405                {
4406                        $this->NameData_[] = $NameData;
4407                        $NameData = array();
4408                        unset($NameData);
4409                }
4410
4411                if ($name == "CURRENTTIME")
4412                        $this->CurrentTime_ = $this->characterDataValue;
4413                if ($name == "CACHEDUNTIL") // cache not needed for this process
4414                {
4415                        $this->CachedUntil_ = $this->characterDataValue;
4416                        //ApiCache::set('API_eve_RefTypes' , $this->characterDataValue);
4417                        //ApiCache::set( $this->CharName_ . 'CharacterID' , $this->characterDataValue);
4418                }
4419    }
4420
4421    function characterData($parser, $data)
4422    {
4423                $this->characterDataValue = $data;
4424    }
4425
4426        function loaddata($keystring)
4427    {
4428        $url = "http://api.eve-online.com/eve/CharacterID.xml.aspx" . $keystring;
4429
4430        $path = '/eve/CharacterID.xml.aspx';
4431
4432
4433        $fp = fsockopen("api.eve-online.com", 80);
4434
4435        if (!$fp)
4436        {
4437            $this->Output_ .= "Could not connect to API URL";
4438        } else {
4439                 // request the xml
4440            fputs ($fp, "POST " . $path . " HTTP/1.0\r\n");
4441            fputs ($fp, "Host: api.eve-online.com\r\n");
4442            fputs ($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
4443            fputs ($fp, "User-Agent: PHPApi\r\n");
4444            fputs ($fp, "Content-Length: " . strlen($keystring) . "\r\n");
4445            fputs ($fp, "Connection: close\r\n\r\n");
4446            fputs ($fp, $keystring."\r\n");
4447
4448                 // retrieve contents
4449            $contents = "";
4450            while (!feof($fp))
4451            {
4452                $contents .= fgets($fp);
4453            }
4454
4455            // close connection
4456            fclose($fp);
4457
4458            $start = strpos($contents, "?>");
4459            if ($start !== FALSE)
4460            {
4461                        $contents = substr($contents, $start + strlen("\r\n\r\n"));
4462            }
4463        }
4464
4465        return $contents;
4466    }
4467}
4468// **********************************************************************************************************************************************
4469// ****************                                   API ID -> Name Conversion /eve/CharacterID.xml.aspx                            ****************
4470// **********************************************************************************************************************************************
4471class API_IDtoName
4472{
4473        function getCachedUntil()
4474        {
4475                return $this->CachedUntil_;
4476        }
4477
4478        function getCurrentTime()
4479        {
4480                return $this->CurrentTime_;
4481        }
4482
4483        function setIDs($IDs)
4484        {
4485                $this->API_IDs_ = $IDs;
4486        }
4487        function getIDData()
4488        {
4489                return $this->NameData_;
4490        }
4491
4492        function clear()
4493        {
4494                $this->NameData_ = array();
4495                unset($this->NameData_);
4496        }
4497
4498        function fetchXML()
4499        {
4500                if ($this->API_IDs_ != "")
4501                {
4502                        $myKeyString = "ids=" . $this->API_IDs_;
4503                        $data = $this->loaddata($myKeyString);
4504                } else {
4505                        return "No IDs have been input.";
4506                }
4507
4508        $xml_parser = xml_parser_create();
4509        xml_set_object ( $xml_parser, $this );
4510        xml_set_element_handler($xml_parser, "startElement", "endElement");
4511        xml_set_character_data_handler ( $xml_parser, 'characterData' );
4512
4513        if (!xml_parse($xml_parser, $data, true))
4514            return "<i>Error getting XML data from api.eve-online.com/CharacterName.xml.aspx  </i><br><br>";
4515
4516        xml_parser_free($xml_parser);
4517
4518                return $this->html; // should be empty, but keeping just incase - errors are returned by Text so worth looking anyway.
4519        }
4520
4521        function startElement($parser, $name, $attribs)
4522    {
4523                global $NameData;
4524
4525                if ($name == "ROW")
4526        {
4527            if (count($attribs))
4528            {
4529                foreach ($attribs as $k => $v)
4530                {
4531                    switch ($k)
4532                    {
4533                        case "NAME":
4534                            $NameData['name'] = $v;
4535                            break;
4536                        case "CHARACTERID":
4537                            $NameData['characterID'] = $v;
4538                            break;
4539                    }
4540                }
4541            }
4542        }
4543    }
4544
4545    function endElement($parser, $name)
4546    {
4547                global $NameData;
4548
4549                // Details
4550                if ($name == "ERROR")
4551                        $this->html .= $this->characterDataValue;
4552
4553                if ($name == "ROW")
4554                {
4555                        $this->NameData_[] = $NameData;
4556                        $NameData = array();
4557                        unset($NameData);
4558                }
4559
4560                if ($name == "CURRENTTIME")
4561                        $this->CurrentTime_ = $this->characterDataValue;
4562                if ($name == "CACHEDUNTIL") // cache not needed for this process
4563                {
4564                        $this->CachedUntil_ = $this->characterDataValue;
4565                        //ApiCache::set('API_eve_RefTypes' , $this->characterDataValue);
4566                        //ApiCache::set( $this->CharName_ . 'CharacterID' , $this->characterDataValue);
4567                }
4568    }
4569
4570    function characterData($parser, $data)
4571    {
4572                $this->characterDataValue = $data;
4573    }
4574
4575        function loaddata($keystring)
4576    {
4577        $url = "http://api.eve-online.com/eve/CharacterName.xml.aspx" . $keystring;
4578
4579        $path = '/eve/CharacterName.xml.aspx';
4580
4581
4582        $fp = fsockopen("api.eve-online.com", 80);
4583
4584        if (!$fp)
4585        {
4586            $this->Output_ .= "Could not connect to API URL";
4587        } else {
4588                 // request the xml
4589            fputs ($fp, "POST " . $path . " HTTP/1.0\r\n");
4590            fputs ($fp, "Host: api.eve-online.com\r\n");
4591            fputs ($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
4592            fputs ($fp, "User-Agent: PHPApi\r\n");
4593            fputs ($fp, "Content-Length: " . strlen($keystring) . "\r\n");
4594            fputs ($fp, "Connection: close\r\n\r\n");
4595            fputs ($fp, $keystring."\r\n");
4596
4597                 // retrieve contents
4598            $contents = "";
4599            while (!feof($fp))
4600            {
4601                $contents .= fgets($fp);
4602            }
4603
4604            // close connection
4605            fclose($fp);
4606
4607            $start = strpos($contents, "?>");
4608            if ($start !== FALSE)
4609            {
4610                        $contents = substr($contents, $start + strlen("\r\n\r\n"));
4611            }
4612        }
4613
4614        return $contents;
4615    }
4616}
4617
4618// **********************************************************************************************************************************************
4619// ****************                                API Server Status - /server/ServerStatus.xml.aspx                             ****************
4620// **********************************************************************************************************************************************
4621
4622class API_ServerStatus
4623{
4624   function getCachedUntil()
4625   {
4626      return $this->CachedUntil_;
4627   }
4628
4629   function getCurrentTime()
4630   {
4631      return $this->CurrentTime_;
4632   }
4633
4634   function getserverOpen()
4635   {
4636      return $this->serverOpen_;
4637   }
4638
4639   function getonlinePlayers()
4640   {
4641      return $this->onlinePlayers_;
4642   }
4643
4644    function fetchXML()
4645    {
4646        $data = LoadGlobalData('/server/ServerStatus.xml.aspx');
4647
4648        $xml_parser = xml_parser_create();
4649        xml_set_object ( $xml_parser, $this );
4650        xml_set_element_handler($xml_parser, "startElement", "endElement");
4651        xml_set_character_data_handler ( $xml_parser, 'characterData' );
4652
4653        if (!xml_parse($xml_parser, $data, true))
4654            return "<i>Error getting XML data from api.eve-online.com/server/ServerStatus.xml.aspx</i><br><br>";
4655
4656        xml_parser_free($xml_parser);
4657
4658        return $this->html;
4659    }
4660
4661        function startElement($parser, $name, $attribs)
4662    {
4663    // nothing to do here...
4664    }
4665
4666    function endElement($parser, $name)
4667    {
4668      global $tempvalue;
4669
4670      if ($name == "CURRENTTIME")
4671         $this->CurrentTime_ = $tempvalue;
4672      if ($name == "SERVEROPEN")
4673         $this->serverOpen_ = $tempvalue;
4674      if ($name == "ONLINEPLAYERS")
4675         $this->onlinePlayers_ = $tempvalue;
4676      if ($name == "CACHEDUNTIL")
4677      {
4678         $this->CachedUntil_ = $tempvalue;
4679                 ApiCache::set( 'API_server_ServerStatus' , $tempvalue);
4680      }
4681    }
4682
4683        function characterData($parser, $data)
4684    {
4685      global $tempvalue;
4686
4687      $tempvalue = $data;
4688    }
4689}
4690
4691// **********************************************************************************************************************************************
4692// **********************************************************************************************************************************************
4693// ****************                                                               GENERIC FUNCTIONS                                                                  ****************
4694// **********************************************************************************************************************************************
4695// **********************************************************************************************************************************************
4696
4697// **********************************************************************************************************************************************
4698// ****************                                                                Load Generic XML                                                                  ****************
4699// **********************************************************************************************************************************************
4700
4701// loads a generic XML sheet that requires no API Login as such
4702function LoadGlobalData($path)
4703{
4704        $temppath = substr($path, 0, strlen(£path) - 14);
4705        $configvalue = "API" . str_replace("/", "_", $temppath);
4706
4707        $CachedTime = ApiCache::get($configvalue);
4708        $UseCaching = config::get('API_UseCache');
4709
4710        // 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.
4711        if ($CachedTime == "")
4712    {
4713        $CachedTime = "2005-01-01 00:00:00"; // fake date to ensure that it runs first time.
4714    }
4715
4716        if (is_file(getcwd().'/cache/api/'.$configvalue.'.xml'))
4717                $cacheexists = true;
4718        else
4719                $cacheexists = false;
4720
4721        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
4722    {
4723        $fp = fsockopen("api.eve-online.com", 80);
4724
4725        if (!$fp)
4726        {
4727            echo "Error", "Could not connect to API URL<br>";
4728        } else {
4729            // request the xml
4730            fputs ($fp, "POST " . $path . " HTTP/1.0\r\n");
4731            fputs ($fp, "Host: api.eve-online.com\r\n");
4732            fputs ($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
4733            fputs ($fp, "User-Agent: PHPApi\r\n");
4734            fputs ($fp, "Content-Length: 0\r\n");
4735            fputs ($fp, "Connection: close\r\n\r\n");
4736            fputs ($fp, "\r\n");
4737
4738                 // retrieve contents
4739            $contents = "";
4740                 while (!feof($fp))
4741            {
4742                $contents .= fgets($fp);
4743            }
4744
4745            // close connection
4746            fclose($fp);
4747
4748            $start = strpos($contents, "?>");
4749            if ($start != false)
4750            {
4751                $contents = substr($contents, $start + strlen("\r\n\r\n"));
4752            }
4753
4754                        // Save the file if we're caching (0 = true in Thunks world)
4755                        if ( $UseCaching == 0 )
4756                        {
4757                                $file = fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'w+');
4758                        fwrite($file, $contents);
4759                        fclose($file);
4760                                @chmod(getcwd().'/cache/api/'.$configvalue.'.xml',0666);
4761                        }
4762        }
4763        } else {
4764                // re-use cached XML
4765                if ($fp = @fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'r')) {
4766            $contents = fread($fp, filesize(getcwd().'/cache/api/'.$configvalue.'.xml'));
4767                fclose($fp);
4768        } else {
4769                        return "<i>error loading cached file ".$configvalue.".xml</i><br><br>";
4770        }
4771        }
4772        return $contents;
4773}
4774
4775// **********************************************************************************************************************************************
4776// ****************                                                             Convert ID -> Name                                                                   ****************
4777// **********************************************************************************************************************************************
4778function gettypeIDname($id)
4779{
4780        $sql = 'select inv.typeName from kb3_invtypes inv where inv.typeID = ' . $id;
4781
4782    $qry = new DBQuery();
4783    $qry->execute($sql);
4784    $row = $qry->getRow();
4785
4786    return $row['typeName'];
4787}
4788
4789// **********************************************************************************************************************************************
4790// ****************                                                             Get GroupID from ID                                                                  ****************
4791// **********************************************************************************************************************************************
4792function getgroupID($id)
4793{
4794        $sql = 'select inv.groupID from kb3_invtypes inv where inv.typeID = ' . $id;
4795
4796    $qry = new DBQuery();
4797    $qry->execute($sql);
4798    $row = $qry->getRow();
4799
4800    return $row['groupID'];
4801}
4802
4803// **********************************************************************************************************************************************
4804// ****************                                                 Convert groupID -> groupName                                                             ****************
4805// **********************************************************************************************************************************************
4806function getgroupIDname($id)
4807{
4808        $sql = 'select itt.itt_name from kb3_item_types itt where itt.itt_id = ' . $id;
4809
4810    $qry = new DBQuery();
4811    $qry->execute($sql);
4812    $row = $qry->getRow();
4813
4814        return $row['itt_name'];
4815}
4816
4817// **********************************************************************************************************************************************
4818// ****************                                                             Get Skill Rank from ID                                                       ****************
4819// **********************************************************************************************************************************************
4820function gettypeIDrank($id)
4821{
4822        $sql = 'select att.value from kb3_dgmtypeattributes att where att.typeID = ' . $id . ' and att.attributeID = 275';
4823
4824    $qry = new DBQuery();
4825    $qry->execute($sql);
4826    $row = $qry->getRow();
4827
4828    return $row['value'];
4829}
4830
4831// **********************************************************************************************************************************************
4832// ****************                                                 Convert MoonID -> MoonName                                                               ****************
4833// **********************************************************************************************************************************************
4834function getMoonName($id)
4835{
4836        if ($id != 0)
4837        {
4838                $sql = 'select moon.itemID, moon.itemName from kb3_moons moon where moon.itemID = '.$id;
4839
4840        $qry = new DBQuery();
4841        $qry->execute($sql);
4842        $row = $qry->getRow();
4843
4844        return $row['itemName'];
4845        } else {
4846                return "Unknown";
4847        }
4848}
4849
4850// **********************************************************************************************************************************************
4851// ****************                                                             Find Thunky                                                                          ****************
4852// **********************************************************************************************************************************************
4853function FindThunk()
4854{ // round about now would probably be a good time for apologising about my sense of humour :oD
4855    $sql = 'select plts.plt_id, plts.plt_externalid from kb3_pilots plts where plts.plt_name = "Captain Thunk"';
4856
4857    $qry = new DBQuery();
4858    $qry->execute($sql);
4859    $row = $qry->getRow();
4860
4861    $pilot_id = $row['plt_id'];
4862    $pilot_charid = $row['plt_externalid'];
4863
4864    if ( $pilot_id != 0 )       {
4865        return '<a href="?a=pilot_detail&plt_id=' . $pilot_id . '" ><font size="2">Captain Thunk</font></a>';
4866    } else {
4867        return "Captain Thunk";
4868    }
4869}
4870
4871// **********************************************************************************************************************************************
4872// ****************                                                      Update  CCP CorpID                                                                  ****************
4873// **********************************************************************************************************************************************
4874function Update_CorpID($corpName, $corpID)
4875{
4876        if ( (strlen($corpName) != 0) && ($corpID != 0) )
4877        {
4878                $qry = new DBQuery();
4879                $qry->execute( "SELECT * FROM `kb3_corps` WHERE `crp_name` = '" . slashfix($corpName) . "'");
4880
4881                if ($qry->recordCount() != 0)
4882        {
4883                        $row = $qry->getRow();
4884                        if ($row['crp_external_id'] == NULL)
4885                        {
4886                                $qry->execute("update kb3_corps set crp_external_id = " . $corpID . " where `crp_id` = " . $row['crp_id']);
4887                        }
4888                }
4889        }
4890}
4891
4892// **********************************************************************************************************************************************
4893// ****************                                                     Update CCP AllianceID                                                                ****************
4894// **********************************************************************************************************************************************
4895function Update_AllianceID($allianceName, $allianceID)
4896{
4897        if ( ($allianceName != "NONE") && ($allianceID != 0) )
4898        {
4899                $qry = new DBQuery();
4900                $qry->execute( "SELECT * FROM `kb3_alliances` WHERE `all_name` = '" . slashfix($allianceName) . "'");
4901
4902                if ($qry->recordCount() != 0)
4903        {
4904                        $row = $qry->getRow();
4905                        if ($row['all_external_id'] == NULL)
4906                        {
4907                                $qry->execute("update kb3_alliances set all_external_id = " . $allianceID . " where `all_id` = " . $row['all_id']);
4908                        }
4909                }
4910        }
4911}
4912
4913// **********************************************************************************************************************************************
4914// ****************                                     Convert GMT Timestamp to local time                                                          ****************
4915// **********************************************************************************************************************************************
4916function ConvertTimestamp($timeStampGMT)
4917{
4918        if (!config::get('API_ConvertTimestamp'))
4919        {
4920                // set gmt offset
4921                $gmoffset = (strtotime(date("M d Y H:i:s")) - strtotime(gmdate("M d Y H:i:s")));
4922                //if (!config::get('API_ForceDST'))
4923                        //$gmoffset = $gmoffset + 3600;
4924
4925                $cachetime = date("Y-m-d H:i:s",  strtotime($timeStampGMT) + $gmoffset);
4926        } else {
4927                $cachetime = $timeStampGMT;
4928        }
4929
4930        return $cachetime;
4931}
4932?>
Note: See TracBrowser for help on using the browser.