root/dev/common/admin/feed_fetcher.php @ 450

Revision 450, 9.5 KB (checked in by kovell, 11 years ago)

Fixes: corp lookup remembers new name. feed fetcher description check works.

RevLine 
[361]1<?php
[380]2/*
3 * EDK Feed Syndication v1.7
4 * based on liq's feed syndication mod v1.5
5 *
6 */
[361]7
8@set_time_limit(0);
9@ini_set('memory_limit',999999999);
[380]10$feedversion = "v1.7";
[361]11
12require_once( "common/includes/class.kill.php" );
13require_once( "common/includes/class.parser.php" );
[380]14require_once( "common/includes/class.comments.php" );
[361]15
16$insideitem = false;
17$tag = "";
18$title = "";
19$description = "";
20$link = "";
21$x=0;
[370]22//! EDK Feed Syndication fetcher class.
[361]23
[370]24/*! This class is used to fetch the feed from another EDK board. It adds all
25 * fetched kills to the board and returns the id of the highest kill fetched.
26 */
27class Fetcher
28{
29//! Construct the Fetcher class and initialise variables.
30        function Fetcher()
31        {
32                $this->lastkllid_ = 0;
33                $this->finalkllid_ = 0;
34                //                $this->trackurl_ = '';
35                $this->trackfriend_ = '';
36                $this->trackkey_ = '';
37                $this->tracklast_ = 0;
38                $this->combined_ = false;
39        }
40        //! Fetch a new feed.
[361]41
[370]42        /*! Use the input parameters to fetch a feed, parse it and add new kills
43         * to the db.
44         * \param $url The base URL of the feed to fetch
45         * \param $str The query string to add to the base URL.
46         * \param $trackfriend Either 'on' or blank. Defines whether to fetch
47         * friendly kills
48         * \param $trackkey The configuration key to use when storing feed in
49         * the db.
50         * \return HTML output summarising the results of the fetch.
51         */
52
53        function grab($url, $str, $trackfriend = '', $trackkey = '')
54        {
[386]55                global $x, $uurl, $feedversion, $apikills;
[370]56                //                $this->trackurl_ = $trackurl;
57                $this->trackfriend_ = $trackfriend;
58                $this->trackkey_ = $trackkey;
[361]59                $x=0;
[380]60                $fetchurl = $url.$str."&board=".urlencode(KB_TITLE);
[386]61                if(strpos($fetchurl, 'apikills=1')) $apikills = true;
62                else $apikills = false;
[380]63                if(!strpos($fetchurl,'?')) $fetchurl =
64                                substr_replace($fetchurl,'?', strpos($fetchurl,'&'),0);
[361]65                $uurl = $url;
[438]66                // only lists fetched with lastkllid are ordered by id.
67                if(strpos($fetchurl, 'lastkllid')) $this->idordered = true;
68                else $this->idordered = false;
69                $this->feedfilename = 'cache/data/feed'.md5($uurl).'.xml';
[370]70                $xml_parser = xml_parser_create("UTF-8");
[361]71                xml_set_object ( $xml_parser, $this );
72                xml_set_element_handler($xml_parser, "startElement", "endElement");
73                xml_set_character_data_handler ( $xml_parser, 'characterData' );
74
[438]75                if(file_exists($this->feedfilename))
[370]76                {
[438]77            // Give up trying to parse the cached file after a day.
78            if (time() - filemtime($this->feedfilename) > 24 * 60 * 60 )
79                        {
80                                unlink($this->feedfilename);
81                                @unlink($this->feedfilename.'.stat');
82                                @unlink($this->feedfilename.'.tstat');
83                        }
84                }
85                if(!file_exists($this->feedfilename))
[370]86                {
[438]87                        include_once('common/includes/class.http.php');
88
89                        $http = new http_request($fetchurl);
90                        $http->set_useragent("EDK Feedfetcher ".$feedversion);
91                        $http->set_timeout(120);
92                        $http->set_cookie('PHPSESSID', 'a2bb4a7485eaba91b9d8db6aafd8ec5d');
93                        $data = $http->get_content();
94        //              $data = trim(preg_replace('<<!--.*?-->>', '', $data)); // remove <!-- Cached --> message, else it will break gzinflate
95                        $data = preg_replace('<<!--.*?-->>', '', $data); // remove <!-- Cached --> message, else it will break gzinflate
96                        if (!@gzinflate($data))
97                        {
98                                $cprs = "raw HTML stream";
99                        } else
100                        {
101                                $data = gzinflate($data);
102                                $cprs = "GZip compressed stream";
103                        }
104                        file_put_contents($this->feedfilename, $data);
[361]105                }
[438]106                else
107                {
108                        $data = file_get_contents($this->feedfilename);
109                        if(file_exists($this->feedfilename.'.stat'))
110                        {
111                                $this->tracklast_ = intval(file_get_contents($this->feedfilename.'.stat'));
112                                $this->tracktime_ = 0;
113                        }
114                        elseif(file_exists($this->feedfilename.'.tstat'))
115                        {
116                                $this->tracklast_ = 0;
117                                $this->tracktime_ = intval(file_get_contents($this->feedfilename.'.tstat'));
118                        }
119                        else
120                        {
121                                $this->tracklast_ = 0;
122                                $this->tracktime_ = 0;
123                        }
124                }
[361]125                if (!xml_parse($xml_parser, $data, true))
[438]126                {
127                        unlink($this->feedfilename);
128                        @unlink($this->feedfilename.'.stat');
129                        @unlink($this->feedfilename.'.tstat');
[361]130                        return "<i>Error getting XML data from ".$fetchurl."</i><br><br>";
[438]131                }
[361]132
133                xml_parser_free($xml_parser);
[438]134                unlink($this->feedfilename);
135                @unlink($this->feedfilename.'.stat');
136                @unlink($this->feedfilename.'.tstat');
137               
[370]138                if (config::get('fetch_verbose') )
139                {
[361]140                        if ($x)
141                                $html .= "<div class=block-header2>".$x." kills added from feed: ".$url."<br>".$str." <i><br>(".$cprs.")</i><br><br></div>";
142                        else
143                                $html .= "<div class=block-header2>No kills added from feed: ".$url."<br>".$str." <i><br>(".$cprs.")</i><br><br></div>";
[438]144                }
145                else
[370]146                {
[361]147                        if ($x)
148                                $html .= "<div class=block-header2>".$x." kills added from feed: ".$url." <i>(".$cprs.")</i><br><br></div>";
149                        else
150                                $html .= "<div class=block-header2>No kills added from feed: ".$url." <i>(".$cprs.")</i><br><br></div>";
151                }
152
[370]153                return $html;
154        }
155        //! XML start of element parser.
156        function startElement($parser, $name, $attrs)
157        {
[380]158                global $insideitem, $tag, $title, $description, $link, $apiID;
[370]159                //      if ($insideitem)
[361]160                $tag = $name;
[370]161                //else
162                if ($name == "ITEM")
163                        $insideitem = true;
164        }
[361]165
[370]166        //! XML end of element parser.
167        function endElement($parser, $name)
168        {
[386]169                global $insideitem, $tag, $title, $description, $link, $html, $x, $uurl, $apiID, $apikills;
[361]170
[370]171                if ($name == "ITEM")
172                {
[450]173                        if ( $description != "")
[370]174                        {
[438]175                                $description = trim(str_replace("\r", '', $description));
176                                $year = substr($description, 0, 4);
177                                $month = substr($description, 5, 2);
178                                $day = substr($description, 8, 2);
179                                $killstamp = mktime(0, 0, 0, $month, $day, $year);
180                                if ( $this->idordered && $this->tracklast_ > intval($title))
[404]181                                {
[438]182                                        $html .= "Killmail ".intval($title)." already processed <br>";
[404]183                                }
[438]184                                elseif (!$this->idordered && $this->tracktime_ > $killstamp)
[380]185                                {
[438]186                                        $html .= "Killmail ".intval($title)." already processed. <br>";
187                                }
188                                else
189                                {
190                                        //Check age of mail
191                                        if(config::get('filter_apply'))
[380]192                                        {
[438]193                                                $filterdate = config::get('filter_date');
194                                                if ($killstamp < $filterdate) $killid = -4;
195                                        }
196                                        if(config::get('filter_apply') && $killid == -4);
197                                        // If the kill has an external id then check if it is already
198                                        // on this board.
199                                        elseif($apiID = intval($apiID))
200                                        {
201                                                $qry = new DBQuery();
202                                                $qry->execute("SELECT 1 FROM kb3_kills WHERE kll_external_id = ".$apiID);
203                                                if(!$qry->recordCount())
204                                                {
205                                                        $parser = new Parser( $description );
206                                                        $killid = $parser->parse( true );
207                                                }
208                                                else $killid = -3;
209                                        }
210                                        elseif(!$apikills)
211                                        {
[380]212                                                $parser = new Parser( $description );
213                                                $killid = $parser->parse( true );
214                                        }
[438]215                                        if ( $killid <= 0 )
216                                        {
217                                                if ( $killid == 0 && config::get('fetch_verbose') )
218                                                        $html .= "Killmail ".intval($title)." is malformed. ".$uurl." Kill ID = ".$title." <br>";
219                                                if ( $killid == -1 && config::get('fetch_verbose') )
220                                                        $html .= "Killmail ".intval($title)." already posted <a href=\"?a=kill_detail&amp;kll_id=".$parser->dupeid_."\">here</a>.<br>";
221                                                if ( $killid == -2 && config::get('fetch_verbose') )
222                                                        $html .= "Killmail ".intval($title)." is not related to ".KB_TITLE.".<br>";
223                                                if ( $killid == -3 && config::get('fetch_verbose') )
224                                                        $html .= "Killmail ".intval($title)." already posted <a href=\"?a=kill_detail&amp;kll_external_id=".$apiID."\">here</a>.<br>";
225                                                if ( $killid == -4 && config::get('fetch_verbose') )
226                                                        $html .= "Killmail ".intval($title)." too old to post with current settings.<br>";
227                                        }
[389]228                                        else
[438]229                                        {
230                                                $qry = new DBQuery();
231                                                if(strpos($uurl, '?')) $logurl = substr($uurl,0,strpos($uurl, '?')).'?a=kill_detail&kll_id='.intval($title);
232                                                else $logurl = uurl.'?a=kill_detail&kll_id='.intval($title);
233                                                $qry->execute( "insert into kb3_log (log_kll_id, log_site, log_ip_address, log_timestamp) values( ".
234                                                        $killid.", '".KB_SITE."','".$logurl."',now() )" );
235                                                $html .= "Killmail ".intval($title)." successfully posted <a href=\"?a=kill_detail&kll_id=".$killid."\">here</a>.<br>";
[370]236
[438]237                                                if (config::get('fetch_comment'))
238                                                {
239                                                        $comments = new Comments($killid);
240                                                        $comments->addComment("Feed Syndication", config::get('fetch_comment')." mail fetched from: ".$uurl.")");
241                                                }
242                                                $x++;
[370]243                                        }
[438]244                                        if( $this->idordered && intval($title) > 0)
245                                        {
246                                                $this->tracklast_ = intval($title);
247                                                file_put_contents($this->feedfilename.'.stat', strval(intval($title)));
248                                        }
249                                        elseif( !$this->idordered && $killstamp > 0)
250                                        {
251                                                $this->tracktime_ = $killstamp;
252                                                file_put_contents($this->feedfilename.'.tstat', strval($killstamp));
253                                        }
[361]254                                }
255                        }
[370]256                        if($title && intval($title) > $this->lastkllid_) $this->lastkllid_ = intval($title);
257                        $title = "";
258                        $description = "";
259                        $link = "";
260                        $insideitem = false;
[380]261                        $apiID = false;
[370]262                }
[361]263        }
[370]264        //! XML character data parser.
265        function characterData($parser, $data)
266        {
[380]267                global $insideitem, $tag, $title, $description, $link, $apiID;
[370]268                if ($insideitem)
269                {
270                        switch ($tag)
271                        {
272                                case "TITLE":
273                                        $title .= $data;
274                                        break;
275                                case "DESCRIPTION":
276                                        $description .= $data;
277                                        break;
278                                case "LINK":
279                                        $link .= $data;
280                                        break;
[380]281                                case "APIID":
282                                        $apiID .= $data;
[370]283                        }
[361]284                }
[370]285                elseif($tag=="FINALKILL")
286                {
287                        if(!($this->finalkllid_ > intval($data))) $this->finalkllid_ = intval($data);
288                }
289                elseif($tag=="COMBINED")
290                {
291                        $this->combined_ = true;
292                }
[361]293        }
294
295}
296?>
Note: See TracBrowser for help on using the browser.