2 class UpdatePingServerModule_getFeed// extends NP_UpdatePingServer
7 function initModule($plugin)
9 $this->myPlugin = $plugin;
10 // print_r($this->myPlugin->getShortName());
13 function _getModuleTablePrefix()
15 return 'plug_' . strtolower($this->myPlugin->getShortName()) . '_';
18 function _getModuleTableName($name)
20 return sql_table($this->_getModuleTablePrefix() . $name);
23 function getModuleTableList()
29 $moduleTables = array();
30 foreach ($tables as $table) {
31 $moduleTables[] = $this->_getModuleTableName($table);
36 function installModule()
38 $table_q = 'CREATE TABLE IF NOT EXISTS ' . $this->_getModuleTableName('feeddata') . ' ('
39 . ' pingid INT(11) NOT NULL AUTO_INCREMENT, '
40 . ' pingtime TIMESTAMP NOT NULL, '
41 . ' updatetime INT(12) NOT NULL, '
42 . ' btitle VARCHAR(255) NOT NULL, '
43 . ' burl VARCHAR(255) NOT NULL, '
44 . ' feedurl VARCHAR(255) NOT NULL, '
45 . ' etitle VARCHAR(255) NOT NULL, '
46 . ' eurl VARCHAR(255) NOT NULL, '
47 . ' edesc TEXT NOT NULL, '
48 . ' UNIQUE KEY eurl (eurl), '
49 . ' PRIMARY KEY (pingid) '
54 function getModuleName()
56 return 'Get Site data';
59 function getModuleDescription()
61 return 'Get Site data via Atom or RSS feeds.';
64 function np_updatePingServerEvent_changesOutput(&$data)
72 . $this->_getModuleTableName('feeddata');
75 . ' updatetime > ' . (strtotime($data['nowTime']) - $data['last']);
77 $query .= ' ORDER BY updatetime DESC';
79 $data['query'] = $query;
82 function np_updatePingServerEvent_receivePing(&$data)
91 $plugName = str_replace('NP_', '', (get_class($this->myPlugin)));
93 ini_set('user_agent', 'NP_' . $plugName());
94 $fp = @fopen($feedURL, 'r');
96 $feedURL = $this->getAbsoluteFeedURL($feedURL, $siteURL);
102 $feedURL = $this->getFeedURL($siteURL, $plugName);
105 $feedData = $this->getFeedData($feedURL, $siteTitle);
110 $this->updateTable($feedData);
111 $data['siteTitle'] = $feedData['siteTitle'];
112 $data['siteData'] = $feedData;
113 $data['message'] = 'Thanks for your update ping.';
114 $data['response'] = TRUE;
116 $data['message'] = 'Can not read your XML feed. Please prepare RSS1.0, RSS2.0, or ATOM feeds.';
117 $data['response'] = FALSE;
121 function updateTable($data)
123 $sharedFunctions = new sharedFunctions();
126 . ' updatetime as result'
128 . $this->_getModuleTableName('feeddata')
130 . ' eurl = ' . $sharedFunctions->quoteSmart($data['entryURL']);
131 $olden = quickQuery($query);
132 if (!$olden || $olden < intval($data['entryDate'])) {
134 . $this->_getModuleTableName('feeddata')
146 . $sharedFunctions->quoteSmart($data['entryDate']) . ', '
147 . $sharedFunctions->quoteSmart($data['siteTitle']) . ', '
148 . $sharedFunctions->quoteSmart($data['siteURL']) . ', '
149 . $sharedFunctions->quoteSmart($data['feedURL']) . ', '
150 . $sharedFunctions->quoteSmart($data['entryTitle']) . ', '
151 . $sharedFunctions->quoteSmart($data['entryURL']) . ', '
152 . $sharedFunctions->quoteSmart($data['entryDesc'])
156 . ' COUNT(pingid) as result '
158 . $this->_getModuleTableName('feeddata');
159 if (quickQuery($query) > $this->myPlugin->getOption('dataMaxHold')) {
160 $query = 'DELETE FROM '
161 . $this->_getModuleTableName('feeddata')
170 function getFeedURL($url, $plugName)
172 $url = preg_replace('|[^a-zA-Z0-9-~+_.?#=&;,/:@%]|i', '', $url);
173 ini_set('user_agent', $plugName);
174 $fp = @fopen($url, 'r');
176 $sources = fread($fp, 4096);
177 if (strpos(substr($sources, 0, 250), '<rdf:RDF') !== FALSE) {
179 } elseif (strpos(substr($sources, 0, 250), '<rss version="') !== FALSE) {
181 } elseif (strpos(substr($sources, 0, 250), '<feed ') !== FALSE) {
184 preg_match_all('/<link\s+(.*?)\s*\/?>/si', $sources, $match);
185 for ($i = 0; count($match[1]) > $i; $i++) {
186 if (strpos($match[1][$i], 'alternate')) {
187 if (strpos($match[1][$i], 'application/atom+xml')) {
188 $temp = explode('href=', $match[1][$i], 2);
189 $herf = explode(' ', $temp[1], 2);
190 $atomLink = trim($herf[0], '\'"');
191 } elseif (strpos($match[1][$i], 'application/rss+xml')) {
192 $temp = explode('href=', $match[1][$i], 2);
193 $herf = explode(' ', $temp[1], 2);
194 $rssLink = trim($herf[0], '\'"');
201 $atomLink = preg_replace('|[^a-zA-Z0-9-~+_.?#=&;,/:@%]|i', '', $atomLink);
202 return $this->getAbsoluteFeedURL($atomLink, $url);
203 } elseif ($rssLink) {
204 $rssLink = preg_replace('|[^a-zA-Z0-9-~+_.?#=&;,/:@%]|i', '', $rssLink);
205 return $this->getAbsoluteFeedURL($rssLink, $url);
211 function getAbsoluteFeedURL($feedURL, $url)
213 $feedURL = preg_replace('|[^a-zA-Z0-9-~+_.?#=&;,/:@%]|i', '', $feedURL);
214 if (strpos($feedURL, 'http://') !== false) {
215 $AbsoluteFeedURL = $feedURL;
217 $parts = parse_url($url);
218 $AbsoluteFeedURL = 'http://' . $parts['host'];
219 if (isset($parts['port'])) {
220 $AbsoluteFeedURL .= ':' . $parts['port'];
222 if ($feedURL{0} != '/') {
223 if (isset($parts['path'])) {
224 $patharr = explode('/', trim($parts['path'], '/'));
225 foreach ($patharr as $val) {
226 if (!strpos(strtolower($val), '.htm')
227 && !strpos(strtolower($val), '.xml')
228 && !strpos(strtolower($val), '.aspx')) {
229 $AbsoluteFeedURL .= '/' . $val;
233 $AbsoluteFeedURL .= '/';
235 $AbsoluteFeedURL .= $feedURL;
237 $AbsoluteFeedURL = preg_replace('|[^a-zA-Z0-9-~+_.?#=&;,/:@%]|i', '', $AbsoluteFeedURL);
238 // $AbsoluteFeedURL = preg_replace("|([^:])//|", "$1", $AbsoluteFeedURL);
239 return $AbsoluteFeedURL;
242 function getFeedData($url, $title)
244 $url = preg_replace('|[^a-zA-Z0-9-~+_.?#=&;,/:@%]|i', '', $url);
245 require_once('sharedlibs/simplepie.inc');
246 $feed = new SimplePie();
247 $feed->feed_url($url);
248 $feed->enable_caching(false);
249 $feed->output_encoding(_CHARSET);
251 $feed->handle_content_type();
253 $item = $feed->get_item(0);
255 'siteTitle' => stringStripTags($feed->get_feed_title()),
256 'siteURL' => preg_replace('|[^a-zA-Z0-9-~+_.?#=&;,/:@%]|i', '', $feed->get_feed_link()),
257 'siteURL' => preg_replace('|[^a-zA-Z0-9-~+_.?#=&;,/:@%]|i', '', $feed->get_feed_link()),
258 'entryTitle' => stringStripTags($item->get_title()),
259 'entryDesc' => stringStripTags($item->get_description()),
260 'entryDate' => $item->get_date('U'),
261 'entryURL' => preg_replace('|[^a-zA-Z0-9-~+_.?#=&;,/:@%]|i', '', $item->get_permalink()),
262 'feedURL' => preg_replace('|[^a-zA-Z0-9-~+_.?#=&;,/:@%]|i', '', $feed->subscribe_url()),