summaryrefslogtreecommitdiff
path: root/modules/ping/ping.module
blob: 880886c5a7c6f93efa5150a91745bcfce0c88c60 (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
<?php
// $Id$

/**
 * Implementation of hook_help().
 */
function ping_help($section) {
  switch ($section) {
    case 'admin/help#ping':
      $output .= t("
      <p>Drupal can pings sites automatically to notify them that your site has changed. It can ping the following sites:</p>
      <p>%weblogs, a web site that tracks and displays links to changed weblogs and news-oriented web sites. To get your Drupal site listed, weblogs.com must be informed about your site's updates.  This is the job of the ping module and when installed, the administrator doesn't have to do anything to participate in the %weblogs system. The ping module automatically notifies weblogs.com when your site is updated.  To do so, Drupal implements the %weblogs-XML.</p>
      <p>%weblogs-RSS, a web site that tracks and displays links to recently changed RSS feeds in XML format. To get your Drupal site listed, %weblogs-RSS must be informed about updates to your RSS feed.  This is the job of the ping module and when installed, the administrator doesn't have to do anything to participate in the %weblogs-RSS-changes system. The ping module automatically notifies %weblogs-RSS when your site is updated.</p>
      <p>%blo-gs, a directory of recently updated weblogs and tools for tracking interesting weblogs, in the spirit of services like %weblogs, %blogtracker and %blogrolling. To get your Drupal site listed, %blo-gs must be informed about your site's updates.  This is the job of the ping module and when installed, the administrator doesn't have to do anything to participate in the %blo-gs system. The ping module automatically notifies blo.gs when your site is updated.  To do so, Drupal implements the %blo-gs-XML.</p>
      <p>The ping feature requires crontab.</p>", array('%weblogs' => '<a href="http://www.weblogs.com/">Weblogs.com</a>', '%weblogs-XML' => '<a href="http://www.xmlrpc.com/weblogsCom/">'. t('XML-RPC interface of weblogs.com') .'</a>', '%weblogs-RSS' => '<a href="http://www.xmlrpc.com/weblogsComForRSS">'. t('Weblogs.Com for RSS') .'</a>', '%weblogs-RSS-changes' => '<a href="http://www.weblogs.com/rssUpdates/changes.xml">'. t('the weblogs.com for RSS') .'</a>', '%blo-gs' => '<a href="http://blo.gs/">blo.gs</a>', '%blogtracker' => '<a href="http://www.dansanderson.com/blogtracker">blogtracker</a>', '%blogrolling' => '<a href="http://www.blogrolling.com">blogrolling.com</a>', '%blo-gs-XML' => '<a href="http://blo.gs/ping.php">'. t('XML-RPC interface of blo.gs') .'</a>'));
      break;

    case 'admin/modules#description':
      $output = t('Alerts other sites that your site has been updated.');
      break;
  }

  return $output;
}

/**
 * Implementation of hook_cron().
 *
 * Fire off notifications of updates to remote sites.
 */
function ping_cron() {
  global $base_url;

  if (variable_get('site_name', 0) && variable_get('site_slogan', 0)) {
    if (db_num_rows(db_query("SELECT nid FROM {node} WHERE status = 1 AND moderate = 0 AND (created > '". variable_get('ping_cron_last', time()) ."' OR changed > '". variable_get('ping_cron_last', time()) ."')"), 1)) {
      _ping_notify(variable_get('site_name', '') .' - '. variable_get('site_slogan', ''), $base_url);
    }

    variable_set('ping_cron_last', time());
  }
}

/**
 * Call hook_ping() in all modules to notify remote sites that there is
 * new content at this one.
 */
function _ping_notify($name, $url) {
  module_invoke_all('ping', $name, $url);
}

/**
 * Implementation of hook_ping().
 *
 * Notifies weblogs.com, blo.gs, and technorati.com of changes at this site.
 */
function ping_ping($name = '', $url = '') {
  $feed = url('node/feed');

  $client = new xmlrpc_client('/RPC2', 'rpc.weblogs.com', 80);

  $message = new xmlrpcmsg('weblogUpdates.ping', array(new xmlrpcval($name), new xmlrpcval($url)));

  $result = $client->send($message);

  if (!$result || $result->faultCode()) {
    watchdog('error', t('failed to notify "weblogs.com" (site)'));
  }

  unset($client);

  $client = new xmlrpc_client('/RPC2', 'rssrpc.weblogs.com', 80);

  $message = new xmlrpcmsg('rssUpdate', array(new xmlrpcval($name), new xmlrpcval($feed)));

  $result = $client->send($message);

  if (!$result || $result->faultCode()) {
    watchdog('error', t('failed to notify "weblogs.com" (RSS)'));
  }

  unset($client);

  $client = new xmlrpc_client('/', 'ping.blo.gs', 80);

  $message = new xmlrpcmsg('weblogUpdates.extendedPing', array(new xmlrpcval($name), new xmlrpcval($url), new xmlrpcval($url), new xmlrpcval($feed)));

  $result = $client->send($message);

  if (!$result || $result->faultCode()) {
    watchdog('error', t('failed to notify "blo.gs"'));
  }

  unset($client);

  $client = new xmlrpc_client('/rpc/ping', 'rpc.technorati.com', 80);

  $message = new xmlrpcmsg('weblogUpdates.ping', array(new xmlrpcval($name), new xmlrpcval($url)));

  $result = $client->send($message);

  if (!$result || $result->faultCode()) {
    watchdog('error', t('failed to notify "technorati.com"'));
  }
}
?>