summaryrefslogtreecommitdiff
path: root/modules/backend.class
diff options
context:
space:
mode:
Diffstat (limited to 'modules/backend.class')
-rw-r--r--modules/backend.class185
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>";
+ }
+}
+
+?>