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

Revision 380, 6.7 KB (checked in by kovell, 13 years ago)

Feedfetch 1.7 external id support. Reduces potential load problems. Feed fetcher is identified.

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;
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,'?')) $fetchurl =
62                                substr_replace($fetchurl,'?', strpos($fetchurl,'&'),0);
63                $uurl = $url;
64                $xml_parser = xml_parser_create("UTF-8");
65                xml_set_object ( $xml_parser, $this );
66                xml_set_element_handler($xml_parser, "startElement", "endElement");
67                xml_set_character_data_handler ( $xml_parser, 'characterData' );
68
69                include_once('common/includes/class.http.php');
70
71                $http = new http_request($fetchurl);
72                $http->set_useragent("EDK Feedfetcher ".$feedversion);
73                $http->set_timeout(120);
74                $http->set_cookie('PHPSESSID', 'a2bb4a7485eaba91b9d8db6aafd8ec5d');
75                $data = $http->get_content();
76//              $data = trim(preg_replace('<<!--.*?-->>', '', $data)); // remove <!-- Cached --> message, else it will break gzinflate
77                $data = preg_replace('<<!--.*?-->>', '', $data); // remove <!-- Cached --> message, else it will break gzinflate
78                if (!@gzinflate($data))
79                {
80                        $cprs = "raw HTML stream";
81                } else
82                {
83                        $data = gzinflate($data);
84                        $cprs = "GZip compressed stream";
85                }
86
87                if (!xml_parse($xml_parser, $data, true))
88                        return "<i>Error getting XML data from ".$fetchurl."</i><br><br>";
89
90                xml_parser_free($xml_parser);
91
92                if (config::get('fetch_verbose') )
93                {
94                        if ($x)
95                                $html .= "<div class=block-header2>".$x." kills added from feed: ".$url."<br>".$str." <i><br>(".$cprs.")</i><br><br></div>";
96                        else
97                                $html .= "<div class=block-header2>No kills added from feed: ".$url."<br>".$str." <i><br>(".$cprs.")</i><br><br></div>";
98                } else
99                {
100                        if ($x)
101                                $html .= "<div class=block-header2>".$x." kills added from feed: ".$url." <i>(".$cprs.")</i><br><br></div>";
102                        else
103                                $html .= "<div class=block-header2>No kills added from feed: ".$url." <i>(".$cprs.")</i><br><br></div>";
104                }
105
106                return $html;
107        }
108        //! XML start of element parser.
109        function startElement($parser, $name, $attrs)
110        {
111                global $insideitem, $tag, $title, $description, $link, $apiID;
112                //      if ($insideitem)
113                $tag = $name;
114                //else
115                if ($name == "ITEM")
116                        $insideitem = true;
117        }
118
119        //! XML end of element parser.
120        function endElement($parser, $name)
121        {
122                global $insideitem, $tag, $title, $description, $link, $html, $x, $uurl, $apiID;
123
124                if ($name == "ITEM")
125                {
126                        if ( isset( $description ) )
127                        {
128                                // If the kill has an external id then check if it is already
129                                // on this board.
130                                $apiID = intval($apiID);
131                                if( $apiID)
132                                {
133                                        $qry = new DBQuery();
134                                        $qry->execute("SELECT 1 FROM kb3_kills WHERE kll_external_id = ".$apiID);
135                                        if(!$qry->recordCount())
136                                        {
137                                                $parser = new Parser( $description );
138                                                $killid = $parser->parse( true );
139                                        }
140                                        else
141                                        {
142                                                $killid = -3;
143                                                $html .= "Killmail already posted <a href=\"?a=kill_detail&amp;kll_external_id=".$apiID."\">here</a>.<br>";
144                                        }
145                                }
146                                else
147                                {
148                                        $parser = new Parser( $description );
149                                        $killid = $parser->parse( true );
150                                }
151                                if($this->trackkey_ != '' && $this->tracklast_ < intval($title) && intval($title) > 0)
152                                {
153                                        config::set($this->trackkey_, $uurl . ':::' . intval($title) . ':::' . $this->trackfriend_);
154                                }
155                                if ( $killid == 0 || $killid == -1 || $killid == -2 || $killid == -3)
156                                {
157                                        if ( $killid == 0 && config::get('fetch_verbose') )
158                                                $html .= "Killmail is malformed. ".$uurl." Kill ID = ".$title." <br>";
159                                        if ( $killid == -2 && config::get('fetch_verbose') )
160                                                $html .= "Killmail is not related to ".KB_TITLE.".<br>";
161                                        if ( $killid == -1 && config::get('fetch_verbose') )
162                                                $html .= "Killmail already posted <a href=\"?a=kill_detail&amp;kll_id=".$parser->dupeid_."\">here</a>.<br>";
163                                }
164                                else
165                                {
166                                        $qry = new DBQuery();
167                                        $qry->execute( "insert into kb3_log (log_kll_id, log_site, log_ip_address, log_timestamp) values( ".
168                                                $killid.", '".KB_SITE."','".$_SERVER['REMOTE_ADDR']."',now() )" );
169                                        $html .= "Killmail successfully posted <a href=\"?a=kill_detail&kll_id=".$killid."\">here</a>.<br>";
170
171                                        if (config::get('fetch_comment'))
172                                        { 
173                                                $comments = new Comments($killid);
174                                                $comments->addComment("Feed Syndication", config::get('fetch_comment')." mail fetched from: ".$uurl.")");
175                                        }
176                                        $x++;
177                                }
178                        }
179                        if($title && intval($title) > $this->lastkllid_) $this->lastkllid_ = intval($title);
180                        $title = "";
181                        $description = "";
182                        $link = "";
183                        $insideitem = false;
184                        $apiID = false;
185                }
186        }
187        //! XML character data parser.
188        function characterData($parser, $data)
189        {
190                global $insideitem, $tag, $title, $description, $link, $apiID;
191                if ($insideitem)
192                {
193                        switch ($tag)
194                        {
195                                case "TITLE":
196                                        $title .= $data;
197                                        break;
198                                case "DESCRIPTION":
199                                        $description .= $data;
200                                        break;
201                                case "LINK":
202                                        $link .= $data;
203                                        break;
204                                case "APIID":
205                                        $apiID .= $data;
206                        }
207                }
208                elseif($tag=="FINALKILL")
209                {
210                        if(!($this->finalkllid_ > intval($data))) $this->finalkllid_ = intval($data);
211                }
212                elseif($tag=="COMBINED")
213                {
214                        $this->combined_ = true;
215                }
216        }
217
218}
219?>
Note: See TracBrowser for help on using the browser.