]> git.mxchange.org Git - friendica.git/blob - include/queue.php
509fb19d2611e2721d35ddca7eb32f7525400c0f
[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
12 function queue_run(&$argv, &$argc){
13         global $a;
14
15         if ($argc > 1)
16                 $queue_id = intval($argv[1]);
17         else
18                 $queue_id = 0;
19
20         if (!$queue_id) {
21
22                 logger('queue: start');
23
24                 // Handling the pubsubhubbub requests
25                 proc_run(PRIORITY_HIGH,'include/pubsubpublish.php');
26
27                 $r = q("select * from deliverq where 1");
28                 if ($r) {
29                         foreach ($r as $rr) {
30                                 logger('queue: deliverq');
31                                 proc_run(PRIORITY_HIGH,'include/delivery.php', $rr['cmd'], $rr['item'], $rr['contact']);
32                         }
33                 }
34
35                 $r = q("SELECT `queue`.*, `contact`.`name`, `contact`.`uid` FROM `queue`
36                         INNER JOIN `contact` ON `queue`.`cid` = `contact`.`id`
37                         WHERE `queue`.`created` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
38                 if ($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                 // 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 && `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) {
54                         foreach ($r as $q_item) {
55                                 logger('Call queue for id '.$q_item['id']);
56                                 proc_run(PRIORITY_LOW, "include/queue.php", $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         $server = poco_detect_server($c[0]['url']);
87
88         if ($server != "") {
89                 logger("Check server ".$server." (".$c[0]["network"].")");
90
91                 if (!poco_check_server($server, $c[0]["network"], true)) {
92                         logger('queue: skipping dead server: '.$server);
93                         update_queue_time($q_item['id']);
94                         return;
95                 }
96         }
97
98         $u = q("SELECT `user`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey`
99                 FROM `user` WHERE `uid` = %d LIMIT 1",
100                 intval($c[0]['uid'])
101         );
102         if (!dbm::is_result($u)) {
103                 remove_queue_item($q_item['id']);
104                 return;
105         }
106
107         $data      = $q_item['content'];
108         $public    = $q_item['batch'];
109         $contact   = $c[0];
110         $owner     = $u[0];
111
112         $deliver_status = 0;
113
114         switch ($contact['network']) {
115                 case NETWORK_DFRN:
116                         logger('queue: dfrndelivery: item '.$q_item['id'].' for '.$contact['name'].' <'.$contact['url'].'>');
117                         $deliver_status = dfrn::deliver($owner, $contact, $data);
118
119                         if ($deliver_status == (-1)) {
120                                 update_queue_time($q_item['id']);
121                         } else {
122                                 remove_queue_item($q_item['id']);
123                         }
124                         break;
125                 case NETWORK_OSTATUS:
126                         if ($contact['notify']) {
127                                 logger('queue: slapdelivery: item '.$q_item['id'].' for '.$contact['name'].' <'.$contact['url'].'>');
128                                 $deliver_status = slapper($owner, $contact['notify'], $data);
129
130                                 if ($deliver_status == (-1)) {
131                                         update_queue_time($q_item['id']);
132                                 } else {
133                                         remove_queue_item($q_item['id']);
134                                 }
135                         }
136                         break;
137                 case NETWORK_DIASPORA:
138                         if ($contact['notify']) {
139                                 logger('queue: diaspora_delivery: item '.$q_item['id'].' for '.$contact['name'].' <'.$contact['url'].'>');
140                                 $deliver_status = Diaspora::transmit($owner, $contact, $data, $public, true);
141
142                                 if ($deliver_status == (-1)) {
143                                         update_queue_time($q_item['id']);
144                                 } else {
145                                         remove_queue_item($q_item['id']);
146                                 }
147                         }
148                         break;
149
150                 default:
151                         $params = array('owner' => $owner, 'contact' => $contact, 'queue' => $q_item, 'result' => false);
152                         call_hooks('queue_deliver', $a, $params);
153
154                         if ($params['result'])
155                                 remove_queue_item($q_item['id']);
156                         else
157                                 update_queue_time($q_item['id']);
158
159                         break;
160
161         }
162         logger('Deliver status '.$deliver_status.' for item '.$q_item['id'].' to '.$contact['name'].' <'.$contact['url'].'>');
163
164         return;
165 }