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

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

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

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