]> git.mxchange.org Git - friendica.git/blob - include/queue.php
Relocate class files from /include to /src/
[friendica.git] / include / queue.php
1 <?php
2
3 use Friendica\Core\Config;
4 use Friendica\Core\Worker;
5 use Friendica\Protocol\Diaspora;
6 use Friendica\Protocol\Dfrn;
7
8 require_once 'include/queue_fn.php';
9 require_once 'include/datetime.php';
10 require_once 'include/items.php';
11 require_once 'include/bbcode.php';
12 require_once 'include/socgraph.php';
13 require_once 'include/cache.php';
14
15 function queue_run(&$argv, &$argc) {
16         global $a;
17
18         if ($argc > 1) {
19                 $queue_id = intval($argv[1]);
20         } else {
21                 $queue_id = 0;
22         }
23
24         $cachekey_deadguy = 'queue_run:deadguy:';
25         $cachekey_server = 'queue_run:server:';
26
27         if (!$queue_id) {
28
29                 logger('queue: start');
30
31                 // Handling the pubsubhubbub requests
32                 Worker::add(array('priority' => PRIORITY_HIGH, 'dont_fork' => true), 'pubsubpublish');
33
34                 $r = q("SELECT `queue`.*, `contact`.`name`, `contact`.`uid` FROM `queue`
35                         INNER JOIN `contact` ON `queue`.`cid` = `contact`.`id`
36                         WHERE `queue`.`created` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
37
38                 if (dbm::is_result($r)) {
39                         foreach ($r as $rr) {
40                                 logger('Removing expired queue item for ' . $rr['name'] . ', uid=' . $rr['uid']);
41                                 logger('Expired queue data: ' . $rr['content'], LOGGER_DATA);
42                         }
43                         q("DELETE FROM `queue` WHERE `created` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
44                 }
45
46                 /*
47                  * For the first 12 hours we'll try to deliver every 15 minutes
48                  * After that, we'll only attempt delivery once per hour.
49                  */
50                 $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`");
51
52                 call_hooks('queue_predeliver', $a, $r);
53
54                 if (dbm::is_result($r)) {
55                         foreach ($r as $q_item) {
56                                 logger('Call queue for id '.$q_item['id']);
57                                 Worker::add(array('priority' => PRIORITY_LOW, 'dont_fork' => true), "queue", (int)$q_item['id']);
58                         }
59                 }
60                 return;
61         }
62
63
64         // delivering
65
66         require_once 'include/salmon.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 }