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.

Line 
1<?php
2/*
3 * EDK Feed Syndication v1.7
4 * based on liq's feed syndication mod v1.5
5 *
6 */
7
8@set_time_limit(0);
9@ini_set('memory_limit',999999999);
10$feedversion = "v1.7";
11
12require_once( "common/includes/class.kill.php" );
13require_once( "common/includes/class.parser.php" );
14require_once( "common/includes/class.comments.php" );
15
16$insideitem = false;
17$tag = "";
18$title = "";
19$description = "";
20$link = "";
21$x=0;
22//! EDK Feed Syndication fetcher class.
23
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.
41
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        {
55                global $x, $uurl, $feedversion, $apikills;
56                //                $this->trackurl_ = $trackurl;
57                $this->trackfriend_ = $trackfriend;
58                $this->trackkey_ = $trackkey;
59                $x=0;
60                $fetchurl = $url.$str."&board=".urlencode(KB_TITLE);
61                if(strpos($fetchurl, 'apikills=1')) $apikills = true;
62                else $apikills = false;
63                if(!strpos($fetchurl,'?')) $fetchurl =
64                                substr_replace($fetchurl,'?', strpos($fetchurl,'&'),0);
65                $uurl = $url;
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';
70                $xml_parser = xml_parser_create("UTF-8");
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
75                if(file_exists($this->feedfilename))
76                {
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))
86                {
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);
105                }
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                }
125                if (!xml_parse($xml_parser, $data, true))
126                {
127                        unlink($this->feedfilename);
128                        @unlink($this->feedfilename.'.stat');
129                        @unlink($this->feedfilename.'.tstat');
130                        return "<i>Error getting XML data from ".$fetchurl."</i><br><br>";
131                }
132
133                xml_parser_free($xml_parser);
134                unlink($this->feedfilename);
135                @unlink($this->feedfilename.'.stat');
136                @unlink($this->feedfilename.'.tstat');
137               
138                if (config::get('fetch_verbose') )
139                {
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>";
144                }
145                else
146                {
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
153                return $html;
154        }
155        //! XML start of element parser.
156        function startElement($parser, $name, $attrs)
157        {
158                global $insideitem, $tag, $title, $description, $link, $apiID;
159                //      if ($insideitem)
160                $tag = $name;
161                //else
162                if ($name == "ITEM")
163                        $insideitem = true;
164        }
165
166        //! XML end of element parser.
167        function endElement($parser, $name)
168        {
169                global $insideitem, $tag, $title, $description, $link, $html, $x, $uurl, $apiID, $apikills;
170
171                if ($name == "ITEM")
172                {
173                        if ( $description != "")
174                        {
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))
181                                {
182                                        $html .= "Killmail ".intval($title)." already processed <br>";
183                                }
184                                elseif (!$this->idordered && $this->tracktime_ > $killstamp)
185                                {
186                                        $html .= "Killmail ".intval($title)." already processed. <br>";
187                                }
188                                else
189                                {
190                                        //Check age of mail
191                                        if(config::get('filter_apply'))
192                                        {
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                                        {
212                                                $parser = new Parser( $description );
213                                                $killid = $parser->parse( true );
214                                        }
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                                        }
228                                        else
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>";
236
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++;
243                                        }
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                                        }
254                                }
255                        }
256                        if($title && intval($title) > $this->lastkllid_) $this->lastkllid_ = intval($title);
257                        $title = "";
258                        $description = "";
259                        $link = "";
260                        $insideitem = false;
261                        $apiID = false;
262                }
263        }
264        //! XML character data parser.
265        function characterData($parser, $data)
266        {
267                global $insideitem, $tag, $title, $description, $link, $apiID;
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;
281                                case "APIID":
282                                        $apiID .= $data;
283                        }
284                }
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                }
293        }
294
295}
296?>
Note: See TracBrowser for help on using the browser.