diff options
Diffstat (limited to 'modules/backend.class')
-rw-r--r-- | modules/backend.class | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/modules/backend.class b/modules/backend.class new file mode 100644 index 000000000..b564344d5 --- /dev/null +++ b/modules/backend.class @@ -0,0 +1,185 @@ +<? + +class backend { + + // Channel properties: + var $id; + var $url; + var $site; + var $file; + var $contact; + var $timestamp; + + // Contains the raw rdf/rss/xml file: + var $data; + + // Contains the parsed rdf/rss/xml file: + var $headlines = array(); // latest headlines + + function backend($id, $site, $url, $file, $contact, $timout = 1800) { + // Get channel info: + $result = db_query("SELECT * FROM channel WHERE id = '$id' OR site = '$site'"); + + if ($channel = db_fetch_object($result)) { + // Initialize internal variables: + $this->id = $channel->id; + $this->site = $channel->site; + $this->file = $channel->file; + $this->url = $channel->url; + $this->contact = $channel->contact; + $this->timestamp = $channel->timestamp; + + // Check to see whether we have to update our headlines first: + if (time() - $this->timestamp > $timout) $this->url2sql(); + + // Read headlines: + $result = db_query("SELECT * FROM headlines WHERE id = $this->id ORDER BY number"); + while ($headline = db_fetch_object($result)) { + array_push($this->headlines, "<A HREF=\"$headline->link\">$headline->title</A>"); + } + + } + else { + $this->site = $site; + $this->url = $url; + $this->file = $file; + $this->contact = $contact; + } + } + + function rdf2sql($timout = 10) { + if ($this->file) { + // Decode URL: + $url = parse_url($this->file); + $host = $url[host]; + $port = $url[port] ? $url[port] : 80; + $path = $url[path]; + + // print "<PRE><B>Debug:</B> $url - $host - $port - $path</PRE>"; + + // Retrieve data from website: + $fp = fsockopen($host, $port, &$errno, &$errstr, $timout); + + if ($fp) { + // Get data from URL: + fputs($fp, "GET $path HTTP/1.0\n"); + fputs($fp, "User-Agent: headline grabber\n"); + fputs($fp, "Host: ". $host ."\n"); + fputs($fp, "Accept: */*\n\n"); + + while(!feof($fp)) $data .= fgets($fp, 128); + + // print "<PRE>$data</PRE><HR>"; + + if (strstr($data, "200 OK")) { + + // Remove existing entries: + $result = db_query("DELETE FROM headlines WHERE id = $this->id"); + + // Strip all 'junk': + $data = ereg_replace("<?xml.*/image>", "", $data); + $data = ereg_replace("</rdf.*", "", $data); + $data = chop($data); + + // Iterating through our data processing each entry/item: + $items = explode("</item>", $data); + $number = 0; + + for (reset($items); $item = current($items); next($items)) { + // Extract data: + $link = ereg_replace(".*<link>", "", $item); + $link = ereg_replace("</link>.*", "", $link); + $title = ereg_replace(".*<title>", "", $item); + $title = ereg_replace("</title>.*", "", $title); + + // Clean headlines: + $title = stripslashes($title); + + // Count the number of stories: + $number += 1; + + // Insert item in database: + $result = db_query("INSERT INTO headlines (id, title, link, number) VALUES('". check_input($this->id) ."', '". check_input($title) ."', '". check_input($link) ."', '". check_input($number) ."')"); + } + + // Mark channels as being updated: + $result = db_query("UPDATE channel SET timestamp = '". time() ."' WHERE id = $this->id"); + $this->timestamp = time(); + } + else print "<HR>RDF parser: 404 error?<BR><BR><PRE>$data</PRE><HR>"; + } + } + } + + function rss2sql($timout = 10) { + print "backend->rss2sql : TODO<BR>"; + } + + function xml2sql($timout = 10) { + print "backend->xml2sql : TODO<BR>"; + } + + function url2sql($timout = 10) { + if (strstr($this->file, ".rdf")) $this->rdf2sql($timout); + if (strstr($this->file, ".rss")) $this->rss2sql($timout); + if (strstr($this->file, ".xml")) $this->xml2sql($timout); + } + + function displayHeadlines($timout = 1800) { + global $theme; + + // Get channel info: + $result = db_query("SELECT * FROM channel WHERE site = '$this->site'"); + + if ($this->id) { + + // Check to see whether we have to update our headlines first: + if (time() - $this->timestamp > $timout) $this->url2sql(); + + // Grab headlines from database: + $result = db_query("SELECT * FROM headlines WHERE id = $this->id ORDER BY number"); + while ($headline = db_fetch_object($result)) { + $content .= "<LI><A HREF=\"$headline->link\">$headline->title</A></LI>"; + } + // Add timestamp: + $update = round((time() - $this->timestamp) / 60); + $content .= "<P ALIGN=\"right\">[ <A HREF=\"backend.php?op=reset&site=$this->site\"><FONT COLOR=\"$theme->hlcolor2\">reset</FONT></A> | updated $update min. ago ]</P>"; + + // Display box: + $theme->box("$this->site", $content); + } + else print "<P>Warning: something whiched happened: specified channel could not be found in database.</P>"; + } + + function add() { + // Add channel: + $result = db_query("INSERT INTO channel (site, file, url, contact, timestamp) VALUES ('". check_input($this->site) ."', '". check_input($this->file) ."', '". check_input($this->url) ."', '". check_input($this->contact) ."', 42)"); + } + + function delete() { + // Delete channel: + $result = db_query("DELETE FROM channel WHERE id = $this->id"); + + // Delete headlines: + $result = db_query("DELETE FROM headlines WHERE id = $this->id"); + } + + function refresh() { + // Delete headlines: + $result = db_query("DELETE FROM headlines WHERE id = $this->id"); + + // Mark channel as invalid to enforce an update: + $result = db_query("UPDATE channel SET timestamp = 42 WHERE id = $this->id"); + } + + function dump() { + print "<B>Dump backend:</B><BR>"; + print "Id: $this->id<BR>"; + print "Site: $this->site<BR>"; + print "URL: $this->url<BR>"; + print "File: $this->file<BR>"; + print "Contact: $this->contact<BR>"; + } +} + +?> |