/[drupal]/contributions/modules/ping_server/ping_server.module
ViewVC logotype

Contents of /contributions/modules/ping_server/ping_server.module

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.2 - (show annotations) (download) (as text)
Mon Oct 24 20:36:08 2005 UTC (4 years, 1 month ago) by breyten
Branch: MAIN
CVS Tags: HEAD
Branch point for: DRUPAL-4-7
Changes since 1.1: +8 -12 lines
File MIME type: text/x-php
Updated to head (incl. new forms api)
1 <?php
2 // $Id: ping_server.module,v 1.1 2005/10/24 20:16:20 breyten Exp $
3
4 function ping_server_help($section) {
5 switch ($section) {
6 case 'admin/modules#description':
7 return t('provides a ping server a la Weblogs.Com.');
8 case 'admin/help#ping_server':
9 return t('The ping_server module allows you to run a ping server like Weblogs.Com');
10 }
11 }
12
13 function ping_server_perm() {
14 return array('see latest received pings');
15 }
16
17 function ping_server_menu($may_cache) {
18 $items = array();
19 if ($may_cache) {
20 $items[] = array('path' => 'pings', 'title' => t('Recent pings'), 'callback' => 'ping_server_latest', 'access' => user_access('see latest received pings'), 'type' => MENU_NORMAL_ITEM);
21 }
22
23 return $items;
24 }
25
26 function ping_server_settings() {
27 $form = array();
28 $form['ping_server_checksum'] = array('#type' => 'checkbox', '#title' => t('Always compute checksum'), '#return_value' => 1, '#default_value' => variable_get('ping_server_checksum', 0));
29 $form['ping_server_dump_after'] = array('#type' => 'textfield', '#title' => t('Dump old data after'), '#suffix' => t('days'), '#default_value' => variable_get('ping_server_dump_after', 31), '#size' => 5, '#maxlength' => 5);
30 $form['ping_server_min_timespan'] = array('#type' => 'textfield', '#title' => t('Minimum timespan between checks'), '#suffix' => t('hours'), '#default_value' => variable_get('ping_server_min_timespan', 1), '#size' => 5, '#maxlength' => 5);
31 return $form;
32 }
33
34 function ping_server_site_load($param = array()) {
35 $sql = "SELECT * FROM {ping_server} WHERE ";
36 if (!is_array($param)) {
37 $sql .= "url = '". db_escape_string($param) ."'";
38 }
39 else {
40 $cond = array();
41 foreach ($param as $key => $val) {
42 $cond[] = db_escape_string($key) ." = '". db_escape_string($val) ."'";
43 }
44 $sql .= implode(' AND ', $cond);
45 }
46 return db_fetch_object(db_query($sql));
47 }
48
49 function ping_server_site_save(&$site) {
50 db_query("DELETE FROM {ping_server} WHERE url = '%s'", $site->url);
51 $fields = array('name', 'url', 'changeurl', 'created', 'updated', 'etag', 'modified', 'checksum', 'realm');
52 $sql = "INSERT INTO {ping_server} (". implode(',', $fields) .") VALUES (";
53 $valsd = array();
54 foreach ($fields as $field) {
55 $vals[] .= "'". db_escape_string($site->$field) ."'";
56 }
57 $sql .= implode(',', $vals) .")";
58 db_query($sql);
59 }
60
61 function _ping_server_site_check(&$site) {
62 // first check last update time
63 $old_time = time() - variable_get('ping_server_min_timespan', 1) * 3600;
64 if ($site->updated > $old_time) {
65 return t('Please only ping me once in every %hours hours.', array('%hours' => variable_get('ping_server_min_timespan', 1)));
66 }
67
68 // Generate conditional GET headers.
69 $headers = array();
70 if ($site->etag) {
71 $headers['If-None-Match'] = $site->etag;
72 }
73 if ($site->modified) {
74 $headers['If-Modified-Since'] = gmdate('D, d M Y H:i:s', $site->modified) .' GMT';
75 }
76
77 // Request feed.
78 $result = drupal_http_request($site->changeurl, $headers);
79
80 switch ($result->code) {
81 case 304: //site wasn't changed
82 return t('The site didn\'t change since your last ping ...');
83 break;
84 case 301: //permanent redirect
85 $site->changeurl = $result->redirect_url;
86 // no break
87 case 200:
88 case 302:
89 case 307:
90 if ($result->headers['Last-Modified']) {
91 $site->modified = strtotime($result->headers['Last-Modified']);
92 }
93 $site->etag = $result->headers['ETag'];
94 $make_checksum = variable_get('ping_server_checksum', 0) || (!$site->etag);
95 if ($make_checksum) {
96 $checksum = function_exists('sha1') ? sha1($response->data) : md5($response->data);
97 }
98 $is_spam = module_exist('spam') ? spam_content_filter('module', $site->url, $site->url, $site->name) : FALSE;
99 if ((!$make_checksum || ($checksum != $site->checksum)) && !$is_spam) {
100 if ($make_checksum) {
101 $site->checksum = $checksum;
102 }
103 $site->updated = time();
104 ping_server_site_save($site);
105 }
106 break;
107 default:
108 return t("The site could not be reached by this ping server.");
109 }
110 }
111
112 function ping_server_weblogs_updates_ping($name, $url, $changesurl = '', $category = 'none') {
113 $update_url = ($changesurl == '') ? $url : $changesurl;
114 $realm = ($category == 'none') ? '' : $category;
115 $site = ping_server_site_load(array("url" => $url));
116
117 if (!$site) {
118 $site = new stdClass();
119 $site->url = $url;
120 $site->name = $name;
121 $site->changeurl = $update_url;
122 $site->realm = $realm;
123 }
124
125 $result = _ping_server_site_check($site);
126
127 return array('flerror' => ($result) ? 1 : 0, 'message' => ($result) ? $result : t('Thanks for the ping.'));
128 }
129
130 function ping_server_latest($realm = '') {
131 $old_time = time() - variable_get('ping_server_time_frame', 3600);
132 $sql = "SELECT * FROM {ping_server} WHERE updated >= %d";
133 if ($realm != '') {
134 $sql .= " AND realm = '%s'";
135 $result = db_query($sql ." ORDER BY updated DESC", $old_time, $realm);
136 }
137 else {
138 $result = db_query($sql ." ORDER BY updated DESC", $old_time);
139 }
140 $sites = array();
141 while ($site = db_fetch_object($result)) {
142 $sites[] = $site;
143 }
144
145 return theme_ping_server_list($sites, $realm);
146 }
147
148 /**
149 * Themes a list of sites.
150 *
151 * @param $entries
152 * An array of sites to display.
153 * @param $realm
154 * A specific realm(category) of sites.
155 *
156 * @return
157 * The HTML to use.
158 *
159 * @ingroup Themeable
160 */
161 function theme_ping_server_list($entries = array(), $realm = '') {
162 $sites = array();
163
164 foreach ($entries as $entry) {
165 $sites[] = '<a href="'. check_url($entry->url) .'">'. check_markup($entry->name) .'</a>';
166 }
167 $header = t('Recently updated sites');
168 if ($realm != '') {
169 $header .= ' '. t('in the category') .' "'. check_markup($realm) .'"';
170 }
171 $output = theme_item_list($sites, $header);
172
173 return $output;
174 }
175
176 function ping_server_cron() {
177 $old_time = time() - variable_get('ping_server_dump_after', 31) * 86400;
178 $old_time = $old_time - ($old_time % 86400);
179 db_query("DELETE FROM {ping_server} WHERE updated < %d", $old_time);
180 }
181
182 function ping_server_xmlrpc() {
183 return array('weblogUpdates.ping' => 'ping_server_weblogs_updates_ping');
184 }

  ViewVC Help
Powered by ViewVC 1.1.2