]> git.mxchange.org Git - friendica.git/blob - include/queue.php
Merge branch 'master' into develop
[friendica.git] / include / queue.php
1 <?php
2
3 use Friendica\Core\Config;
4
5 require_once('include/queue_fn.php');
6 require_once('include/dfrn.php');
7 require_once("include/datetime.php");
8 require_once('include/items.php');
9 require_once('include/bbcode.php');
10 require_once('include/socgraph.php');
11 require_once('include/cache.php');
12
13 function queue_run(&$argv, &$argc){
14         global $a;
15
16         if ($argc > 1) {
17                 $queue_id = intval($argv[1]);
18         } else {
19                 $queue_id = 0;
20         }
21
22         $cachekey_deadguy = 'queue_run:deadguy:';
23         $cachekey_server = 'queue_run:server:';
24
25         if (!$queue_id) {
26
27                 logger('queue: start');
28
29                 // Handling the pubsubhubbub requests
30                 proc_run(PRIORITY_HIGH,'include/pubsubpublish.php');
31
32                 $r = q("SELECT `queue`.*, `contact`.`name`, `contact`.`uid` FROM `queue`
33                         INNER JOIN `contact` ON `queue`.`cid` = `contact`.`id`
34                         WHERE `queue`.`created` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
35
36                 if (dbm::is_result($r)) {
37                         foreach ($r as $rr) {
38                                 logger('Removing expired queue item for ' . $rr['name'] . ', uid=' . $rr['uid']);
39                                 logger('Expired queue data: ' . $rr['content'], LOGGER_DATA);
40                         }
41                         q("DELETE FROM `queue` WHERE `created` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
42                 }
43
44                 // For the first 12 hours we'll try to deliver every 15 minutes
45                 // After that, we'll only attempt delivery once per hour.
46
47                 $r = q("SELECT `id` FROM `queue` WHERE ((`created` > UTC_TIMESTAMP() - INTERVAL 12 HOUR && `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE) OR (`last` < UTC_TIMESTAMP() - INTERVAL 1 HOUR)) ORDER BY `cid`, `created`");
48
49                 call_hooks('queue_predeliver', $a, $r);
50
51                 if (dbm::is_result($r)) {
52                         foreach ($r as $q_item) {
53                                 logger('Call queue for id '.$q_item['id']);
54                                 proc_run(PRIORITY_LOW, "include/queue.php", $q_item['id']);
55                         }
56                 }
57                 return;
58         }
59
60
61         // delivering
62
63         require_once('include/salmon.php');
64         require_once('include/diaspora.php');
65
66         $r = q("SELECT * FROM `queue` WHERE `id` = %d LIMIT 1",
67                 intval($queue_id));
68
69         if (!dbm::is_result($r)) {
70                 return;
71         }
72
73         $q_item = $r[0];
74
75         $c = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1",
76                 intval($q_item['cid'])
77         );
78
79         if (!dbm::is_result($c)) {
80                 remove_queue_item($q_item['id']);
81                 return;
82         }
83
84         $dead = Cache::get($cachekey_deadguy.$c[0]['notify']);
85
86         if (!is_null($dead) AND $dead) {
87                 logger('queue: skipping known dead url: '.$c[0]['notify']);
88                 update_queue_time($q_item['id']);
89                 return;
90         }
91
92         $server = poco_detect_server($c[0]['url']);
93
94         if ($server != "") {
95                 $vital = Cache::get($cachekey_server.$server);
96
97                 if (is_null($vital)) {
98                         logger("Check server ".$server." (".$c[0]["network"].")");
99
100                         $vital = poco_check_server($server, $c[0]["network"], true);
101                         Cache::set($cachekey_server.$server, $vital, CACHE_QUARTER_HOUR);
102                 }
103
104                 if (!is_null($vital) AND !$vital) {
105                         logger('queue: skipping dead server: '.$server);
106                         update_queue_time($q_item['id']);
107                         return;
108                 }
109         }
110
111         $u = q("SELECT `user`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey`
112                 FROM `user` WHERE `uid` = %d LIMIT 1",
113                 intval($c[0]['uid'])
114         );
115         if (!dbm::is_result($u)) {
116                 remove_queue_item($q_item['id']);
117                 return;
118         }
119
120         $data      = $q_item['content'];
121         $public    = $q_item['batch'];
122         $contact   = $c[0];
123         $owner     = $u[0];
124
125         $deliver_status = 0;
126
127         switch ($contact['network']) {
128                 case NETWORK_DFRN:
129                         logger('queue: dfrndelivery: item '.$q_item['id'].' for '.$contact['name'].' <'.$contact['url'].'>');
130                         $deliver_status = dfrn::deliver($owner, $contact, $data);
131
132                         if ($deliver_status == (-1)) {
133                                 update_queue_time($q_item['id']);
134                                 Cache::set($cachekey_deadguy.$contact['notify'], true, CACHE_QUARTER_HOUR);
135                         } else {
136                                 remove_queue_item($q_item['id']);
137                         }
138                         break;
139                 case NETWORK_OSTATUS:
140                         if ($contact['notify']) {
141                                 logger('queue: slapdelivery: item '.$q_item['id'].' for '.$contact['name'].' <'.$contact['url'].'>');
142                                 $deliver_status = slapper($owner, $contact['notify'], $data);
143
144                                 if ($deliver_status == (-1)) {
145                                         update_queue_time($q_item['id']);
146                                         Cache::set($cachekey_deadguy.$contact['notify'], true, CACHE_QUARTER_HOUR);
147                                 } else {
148                                         remove_queue_item($q_item['id']);
149                                 }
150                         }
151                         break;
152                 case NETWORK_DIASPORA:
153                         if ($contact['notify']) {
154                                 logger('queue: diaspora_delivery: item '.$q_item['id'].' for '.$contact['name'].' <'.$contact['url'].'>');
155                                 $deliver_status = Diaspora::transmit($owner, $contact, $data, $public, true);
156
157                                 if ($deliver_status == (-1)) {
158                                         update_queue_time($q_item['id']);
159                                         Cache::set($cachekey_deadguy.$contact['notify'], true, CACHE_QUARTER_HOUR);
160                                 } else {
161                                         remove_queue_item($q_item['id']);
162                                 }
163                         }
164                         break;
165
166                 default:
167                         $params = array('owner' => $owner, 'contact' => $contact, 'queue' => $q_item, 'result' => false);
168                         call_hooks('queue_deliver', $a, $params);
169
170                         if ($params['result']) {
171                                 remove_queue_item($q_item['id']);
172                         } else {
173                                 update_queue_time($q_item['id']);
174                         }
175                         break;
176
177         }
178         logger('Deliver status '.(int)$deliver_status.' for item '.$q_item['id'].' to '.$contact['name'].' <'.$contact['url'].'>');
179
180         return;
181 }