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