summaryrefslogtreecommitdiff
path: root/modules/backend.class
blob: 9e505f70e513413f2d797aa6b9ebd9606caab5fa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<?php
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 = 10800) {
    // 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 url2sql($timout = 10) {
    global $site_name;

    if ($this->file) {
      // Decode URL:
      $url = parse_url($this->file);

      // Retrieve data from website:
      $fp = fsockopen($url[host], ($url[port] ? $url[port] : 80), &$errno, &$errstr, $timout);

      if ($fp) {
        // Request data via URL:
        fputs($fp, "GET $url[path]?$url[query] HTTP/1.0\nUser-Agent: $site_name\nHost: $url[host]\nAccept: */*\n\n");

        // Read data from socket:
        while(!feof($fp)) $data .= fgets($fp, 128);

        if (strstr($data, "200 OK")) {

          // Remove existing entries:
          $result = db_query("DELETE FROM headlines WHERE id = '$this->id'");

          // Strip all 'junk':
          $data = ereg_replace("<?phpxml.*/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);

            // Increase the number of headlines:
            $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 {
          watchdog("error", "failed to retrieve headline data from '$this->site': <PRE>$data</PRE>");
        }
      }
    }
  }

  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);

      // 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) ."', 1)");
  }

  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 = 1 WHERE id = '$this->id'");
  }
}

?>