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