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

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

Installation packages updated. Fetcher does not set session ID. DB queries check if charset method exists before use. History mod is history.

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                        $data = $http->get_content();
93        //              $data = trim(preg_replace('<<!--.*?-->>', '', $data)); // remove <!-- Cached --> message, else it will break gzinflate
94                        $data = preg_replace('<<!--.*?-->>', '', $data); // remove <!-- Cached --> message, else it will break gzinflate
95                        if (!@gzinflate($data))
96                        {
97                                $cprs = "raw HTML stream";
98                        } else
99                        {
100                                $data = gzinflate($data);
101                                $cprs = "GZip compressed stream";
102                        }
103                        file_put_contents($this->feedfilename, $data);
[361]104                }
[438]105                else
106                {
107                        $data = file_get_contents($this->feedfilename);
108                        if(file_exists($this->feedfilename.'.stat'))
109                        {
110                                $this->tracklast_ = intval(file_get_contents($this->feedfilename.'.stat'));
111                                $this->tracktime_ = 0;
112                        }
113                        elseif(file_exists($this->feedfilename.'.tstat'))
114                        {
115                                $this->tracklast_ = 0;
116                                $this->tracktime_ = intval(file_get_contents($this->feedfilename.'.tstat'));
117                        }
118                        else
119                        {
120                                $this->tracklast_ = 0;
121                                $this->tracktime_ = 0;
122                        }
123                }
[361]124                if (!xml_parse($xml_parser, $data, true))
[438]125                {
126                        unlink($this->feedfilename);
127                        @unlink($this->feedfilename.'.stat');
128                        @unlink($this->feedfilename.'.tstat');
[361]129                        return "<i>Error getting XML data from ".$fetchurl."</i><br><br>";
[438]130                }
[361]131
132                xml_parser_free($xml_parser);
[438]133                unlink($this->feedfilename);
134                @unlink($this->feedfilename.'.stat');
135                @unlink($this->feedfilename.'.tstat');
136               
[370]137                if (config::get('fetch_verbose') )
138                {
[361]139                        if ($x)
140                                $html .= "<div class=block-header2>".$x." kills added from feed: ".$url."<br>".$str." <i><br>(".$cprs.")</i><br><br></div>";
141                        else
142                                $html .= "<div class=block-header2>No kills added from feed: ".$url."<br>".$str." <i><br>(".$cprs.")</i><br><br></div>";
[438]143                }
144                else
[370]145                {
[361]146                        if ($x)
147                                $html .= "<div class=block-header2>".$x." kills added from feed: ".$url." <i>(".$cprs.")</i><br><br></div>";
148                        else
149                                $html .= "<div class=block-header2>No kills added from feed: ".$url." <i>(".$cprs.")</i><br><br></div>";
150                }
151
[370]152                return $html;
153        }
154        //! XML start of element parser.
155        function startElement($parser, $name, $attrs)
156        {
[380]157                global $insideitem, $tag, $title, $description, $link, $apiID;
[370]158                //      if ($insideitem)
[361]159                $tag = $name;
[370]160                //else
161                if ($name == "ITEM")
162                        $insideitem = true;
163        }
[361]164
[370]165        //! XML end of element parser.
166        function endElement($parser, $name)
167        {
[386]168                global $insideitem, $tag, $title, $description, $link, $html, $x, $uurl, $apiID, $apikills;
[361]169
[370]170                if ($name == "ITEM")
171                {
[450]172                        if ( $description != "")
[370]173                        {
[438]174                                $description = trim(str_replace("\r", '', $description));
175                                $year = substr($description, 0, 4);
176                                $month = substr($description, 5, 2);
177                                $day = substr($description, 8, 2);
178                                $killstamp = mktime(0, 0, 0, $month, $day, $year);
179                                if ( $this->idordered && $this->tracklast_ > intval($title))
[404]180                                {
[438]181                                        $html .= "Killmail ".intval($title)." already processed <br>";
[404]182                                }
[438]183                                elseif (!$this->idordered && $this->tracktime_ > $killstamp)
[380]184                                {
[438]185                                        $html .= "Killmail ".intval($title)." already processed. <br>";
186                                }
187                                else
188                                {
189                                        //Check age of mail
190                                        if(config::get('filter_apply'))
[380]191                                        {
[438]192                                                $filterdate = config::get('filter_date');
193                                                if ($killstamp < $filterdate) $killid = -4;
194                                        }
195                                        if(config::get('filter_apply') && $killid == -4);
196                                        // If the kill has an external id then check if it is already
197                                        // on this board.
198                                        elseif($apiID = intval($apiID))
199                                        {
200                                                $qry = new DBQuery();
201                                                $qry->execute("SELECT 1 FROM kb3_kills WHERE kll_external_id = ".$apiID);
202                                                if(!$qry->recordCount())
203                                                {
204                                                        $parser = new Parser( $description );
205                                                        $killid = $parser->parse( true );
206                                                }
207                                                else $killid = -3;
208                                        }
209                                        elseif(!$apikills)
210                                        {
[380]211                                                $parser = new Parser( $description );
212                                                $killid = $parser->parse( true );
213                                        }
[438]214                                        if ( $killid <= 0 )
215                                        {
216                                                if ( $killid == 0 && config::get('fetch_verbose') )
217                                                        $html .= "Killmail ".intval($title)." is malformed. ".$uurl." Kill ID = ".$title." <br>";
218                                                if ( $killid == -1 && config::get('fetch_verbose') )
219                                                        $html .= "Killmail ".intval($title)." already posted <a href=\"?a=kill_detail&amp;kll_id=".$parser->dupeid_."\">here</a>.<br>";
220                                                if ( $killid == -2 && config::get('fetch_verbose') )
221                                                        $html .= "Killmail ".intval($title)." is not related to ".KB_TITLE.".<br>";
222                                                if ( $killid == -3 && config::get('fetch_verbose') )
223                                                        $html .= "Killmail ".intval($title)." already posted <a href=\"?a=kill_detail&amp;kll_external_id=".$apiID."\">here</a>.<br>";
224                                                if ( $killid == -4 && config::get('fetch_verbose') )
225                                                        $html .= "Killmail ".intval($title)." too old to post with current settings.<br>";
226                                        }
[389]227                                        else
[438]228                                        {
229                                                $qry = new DBQuery();
230                                                if(strpos($uurl, '?')) $logurl = substr($uurl,0,strpos($uurl, '?')).'?a=kill_detail&kll_id='.intval($title);
231                                                else $logurl = uurl.'?a=kill_detail&kll_id='.intval($title);
232                                                $qry->execute( "insert into kb3_log (log_kll_id, log_site, log_ip_address, log_timestamp) values( ".
233                                                        $killid.", '".KB_SITE."','".$logurl."',now() )" );
234                                                $html .= "Killmail ".intval($title)." successfully posted <a href=\"?a=kill_detail&kll_id=".$killid."\">here</a>.<br>";
[370]235
[438]236                                                if (config::get('fetch_comment'))
237                                                {
238                                                        $comments = new Comments($killid);
239                                                        $comments->addComment("Feed Syndication", config::get('fetch_comment')." mail fetched from: ".$uurl.")");
240                                                }
241                                                $x++;
[370]242                                        }
[438]243                                        if( $this->idordered && intval($title) > 0)
244                                        {
245                                                $this->tracklast_ = intval($title);
246                                                file_put_contents($this->feedfilename.'.stat', strval(intval($title)));
247                                        }
248                                        elseif( !$this->idordered && $killstamp > 0)
249                                        {
250                                                $this->tracktime_ = $killstamp;
251                                                file_put_contents($this->feedfilename.'.tstat', strval($killstamp));
252                                        }
[361]253                                }
254                        }
[370]255                        if($title && intval($title) > $this->lastkllid_) $this->lastkllid_ = intval($title);
256                        $title = "";
257                        $description = "";
258                        $link = "";
259                        $insideitem = false;
[380]260                        $apiID = false;
[370]261                }
[361]262        }
[370]263        //! XML character data parser.
264        function characterData($parser, $data)
265        {
[380]266                global $insideitem, $tag, $title, $description, $link, $apiID;
[370]267                if ($insideitem)
268                {
269                        switch ($tag)
270                        {
271                                case "TITLE":
272                                        $title .= $data;
273                                        break;
274                                case "DESCRIPTION":
275                                        $description .= $data;
276                                        break;
277                                case "LINK":
278                                        $link .= $data;
279                                        break;
[380]280                                case "APIID":
281                                        $apiID .= $data;
[370]282                        }
[361]283                }
[370]284                elseif($tag=="FINALKILL")
285                {
286                        if(!($this->finalkllid_ > intval($data))) $this->finalkllid_ = intval($data);
287                }
288                elseif($tag=="COMBINED")
289                {
290                        $this->combined_ = true;
291                }
[361]292        }
293
294}
295?>
Note: See TracBrowser for help on using the browser.