]> git.mxchange.org Git - friendica.git/blob - mod/notifications.php
Merge pull request #3149 from annando/1601-new-diaspora-mention
[friendica.git] / mod / notifications.php
1 <?php
2
3 /**
4  * @file mod/notifications.php
5  * @brief The notifications module
6  */
7
8 require_once("include/NotificationsManager.php");
9 require_once("include/contact_selectors.php");
10 require_once("include/network.php");
11
12 function notifications_post(App $a) {
13
14         if (! local_user()) {
15                 goaway(z_root());
16         }
17
18         $request_id = (($a->argc > 1) ? $a->argv[1] : 0);
19
20         if($request_id === "all")
21                 return;
22
23         if($request_id) {
24
25                 $r = q("SELECT * FROM `intro` WHERE `id` = %d  AND `uid` = %d LIMIT 1",
26                         intval($request_id),
27                         intval(local_user())
28                 );
29
30                 if (dbm::is_result($r)) {
31                         $intro_id = $r[0]['id'];
32                         $contact_id = $r[0]['contact-id'];
33                 }
34                 else {
35                         notice( t('Invalid request identifier.') . EOL);
36                         return;
37                 }
38
39                 // If it is a friend suggestion, the contact is not a new friend but an existing friend
40                 // that should not be deleted.
41
42                 $fid = $r[0]['fid'];
43
44                 if($_POST['submit'] == t('Discard')) {
45                         $r = q("DELETE FROM `intro` WHERE `id` = %d",
46                                 intval($intro_id)
47                         );
48                         if(! $fid) {
49
50                                 // The check for blocked and pending is in case the friendship was already approved
51                                 // and we just want to get rid of the now pointless notification
52
53                                 $r = q("DELETE FROM `contact` WHERE `id` = %d AND `uid` = %d AND `self` = 0 AND `blocked` = 1 AND `pending` = 1",
54                                         intval($contact_id),
55                                         intval(local_user())
56                                 );
57                         }
58                         goaway('notifications/intros');
59                 }
60                 if($_POST['submit'] == t('Ignore')) {
61                         $r = q("UPDATE `intro` SET `ignore` = 1 WHERE `id` = %d",
62                                 intval($intro_id));
63                         goaway('notifications/intros');
64                 }
65         }
66 }
67
68 function notifications_content(App $a) {
69
70         if (! local_user()) {
71                 notice( t('Permission denied.') . EOL);
72                 return;
73         }
74
75         $page   =       (x($_REQUEST,'page')            ? $_REQUEST['page']             : 1);
76         $show   =       (x($_REQUEST,'show')            ? $_REQUEST['show']             : 0);
77
78         nav_set_selected('notifications');
79
80         $json = (($a->argc > 1 && $a->argv[$a->argc - 1] === 'json') ? true : false);
81
82         $nm = new NotificationsManager();
83
84         $o = '';
85         // Get the nav tabs for the notification pages
86         $tabs = $nm->getTabs();
87         $notif_content = array();
88
89         // Notification results per page
90         $perpage = 20;
91         $startrec = ($page * $perpage) - $perpage;
92
93         // Get introductions
94         if( (($a->argc > 1) && ($a->argv[1] == 'intros')) || (($a->argc == 1))) {
95                 nav_set_selected('introductions');
96                 $notif_header = t('Notifications');
97
98                 $all = (($a->argc > 2) && ($a->argv[2] == 'all'));
99
100                 $notifs = $nm->introNotifs($all, $startrec, $perpage);
101
102         // Get the network notifications
103         } else if (($a->argc > 1) && ($a->argv[1] == 'network')) {
104
105                 $notif_header = t('Network Notifications');
106                 $notifs = $nm->networkNotifs($show, $startrec, $perpage);
107
108         // Get the system notifications
109         } else if (($a->argc > 1) && ($a->argv[1] == 'system')) {
110
111                 $notif_header = t('System Notifications');
112                 $notifs = $nm->systemNotifs($show, $startrec, $perpage);
113
114         // Get the personal notifications
115         } else if (($a->argc > 1) && ($a->argv[1] == 'personal')) {
116
117                 $notif_header = t('Personal Notifications');
118                 $notifs = $nm->personalNotifs($show, $startrec, $perpage);
119
120         // Get the home notifications
121         } else if (($a->argc > 1) && ($a->argv[1] == 'home')) {
122
123                 $notif_header = t('Home Notifications');
124                 $notifs = $nm->homeNotifs($show, $startrec, $perpage);
125
126         }
127
128
129         // Set the pager
130         $a->set_pager_total($notifs['total']);
131         $a->set_pager_itemspage($perpage);
132
133         // Add additional informations (needed for json output)
134         $notifs['items_page'] = $a->pager['itemspage'];
135         $notifs['page'] = $a->pager['page'];
136
137         // Json output
138         if(intval($json) === 1)
139                 json_return_and_die($notifs);
140
141         $notif_tpl = get_markup_template('notifications.tpl');
142
143         // Process the data for template creation
144         if($notifs['ident'] === 'introductions') {
145
146                 $sugg = get_markup_template('suggestions.tpl');
147                 $tpl = get_markup_template("intros.tpl");
148
149                 // The link to switch between ignored and normal connection requests
150                 $notif_show_lnk = array(
151                         'href' => (!$all ? 'notifications/intros/all' : 'notifications/intros' ),
152                         'text' => (!$all ? t('Show Ignored Requests') : t('Hide Ignored Requests'))
153                 );
154
155                 // Loop through all introduction notifications.This creates an array with the output html for each
156                 // introduction
157                 foreach ($notifs['notifications'] as $it) {
158
159                         // There are two kind of introduction. Contacts suggested by other contacts and normal connection requests.
160                         // We have to distinguish between these two because they use different data.
161                         switch ($it['label']) {
162                                 case 'friend_suggestion':
163                                         $notif_content[] = replace_macros($sugg, array(
164                                                 '$str_notifytype' => t('Notification type: '),
165                                                 '$notify_type' => $it['notify_type'],
166                                                 '$intro_id' => $it['intro_id'],
167                                                 '$madeby' => sprintf( t('suggested by %s'),$it['madeby']),
168                                                 '$contact_id' => $it['contact-id'],
169                                                 '$photo' => $it['photo'],
170                                                 '$fullname' => $it['name'],
171                                                 '$url' => $it['url'],
172                                                 '$hidden' => array('hidden', t('Hide this contact from others'), ($it['hidden'] == 1), ''),
173                                                 '$activity' => array('activity', t('Post a new friend activity'), $it['post_newfriend'], t('if applicable')),
174
175                                                 '$knowyou' => $it['knowyou'],
176                                                 '$approve' => t('Approve'),
177                                                 '$note' => $it['note'],
178                                                 '$request' => $it['request'],
179                                                 '$ignore' => t('Ignore'),
180                                                 '$discard' => t('Discard'),
181                                         ));
182                                         break;
183
184                                 // Normal connection requests
185                                 default:
186                                         $friend_selected = (($it['network'] !== NETWORK_OSTATUS) ? ' checked="checked" ' : ' disabled ');
187                                         $fan_selected = (($it['network'] === NETWORK_OSTATUS) ? ' checked="checked" disabled ' : '');
188                                         $dfrn_tpl = get_markup_template('netfriend.tpl');
189
190                                         $knowyou   = '';
191                                         $dfrn_text = '';
192
193                                         if($it['network'] === NETWORK_DFRN || $it['network'] === NETWORK_DIASPORA) {
194                                                 if($it['network'] === NETWORK_DFRN) {
195                                                         $lbl_knowyou = t('Claims to be known to you: ');
196                                                         $knowyou = (($it['knowyou']) ? t('yes') : t('no'));
197                                                         $helptext = t('Shall your connection be bidirectional or not? "Friend" implies that you allow to read and you subscribe to their posts. "Fan/Admirer" means that you allow to read but you do not want to read theirs. Approve as: ');
198                                                 } else {
199                                                         $knowyou = '';
200                                                         $helptext = t('Shall your connection be bidirectional or not? "Friend" implies that you allow to read and you subscribe to their posts. "Sharer" means that you allow to read but you do not want to read theirs. Approve as: ');
201                                                 }
202                                         }
203
204                                         $dfrn_text = replace_macros($dfrn_tpl,array(
205                                                 '$intro_id' => $it['intro_id'],
206                                                 '$friend_selected' => $friend_selected,
207                                                 '$fan_selected' => $fan_selected,
208                                                 '$approve_as' => $helptext,
209                                                 '$as_friend' => t('Friend'),
210                                                 '$as_fan' => (($it['network'] == NETWORK_DIASPORA) ? t('Sharer') : t('Fan/Admirer'))
211                                         ));
212
213                                         $header = $it["name"];
214
215                                         if ($it["addr"] != "")
216                                                 $header .= " <".$it["addr"].">";
217
218                                         $header .= " (".network_to_name($it['network'], $it['url']).")";
219
220                                         $notif_content[] = replace_macros($tpl, array(
221                                                 '$header' => htmlentities($header),
222                                                 '$str_notifytype' => t('Notification type: '),
223                                                 '$notify_type' => $it['notify_type'],
224                                                 '$dfrn_text' => $dfrn_text,
225                                                 '$dfrn_id' => $it['dfrn_id'],
226                                                 '$uid' => $it['uid'],
227                                                 '$intro_id' => $it['intro_id'],
228                                                 '$contact_id' => $it['contact_id'],
229                                                 '$photo' => $it['photo'],
230                                                 '$fullname' => $it['name'],
231                                                 '$location' => $it['location'],
232                                                 '$lbl_location' => t('Location:'),
233                                                 '$about' => $it['about'],
234                                                 '$lbl_about' => t('About:'),
235                                                 '$keywords' => $it['keywords'],
236                                                 '$lbl_keywords' => t('Tags:'),
237                                                 '$gender' => $it['gender'],
238                                                 '$lbl_gender' => t('Gender:'),
239                                                 '$hidden' => array('hidden', t('Hide this contact from others'), ($it['hidden'] == 1), ''),
240                                                 '$activity' => array('activity', t('Post a new friend activity'), $it['post_newfriend'], t('if applicable')),
241                                                 '$url' => $it['url'],
242                                                 '$zrl' => $it['zrl'],
243                                                 '$lbl_url' => t('Profile URL'),
244                                                 '$addr' => $it['addr'],
245                                                 '$lbl_knowyou' => $lbl_knowyou,
246                                                 '$lbl_network' => t('Network:'),
247                                                 '$network' => network_to_name($it['network'], $it['url']),
248                                                 '$knowyou' => $knowyou,
249                                                 '$approve' => t('Approve'),
250                                                 '$note' => $it['note'],
251                                                 '$ignore' => t('Ignore'),
252                                                 '$discard' => t('Discard'),
253
254                                         ));
255                                         break;
256                         }
257                 }
258
259                 if($notifs['total'] == 0)
260                         info( t('No introductions.') . EOL);
261
262         // Normal notifications (no introductions)
263         } else {
264
265                 // The template files we need in different cases for formatting the content
266                 $tpl_item_like = 'notifications_likes_item.tpl';
267                 $tpl_item_dislike = 'notifications_dislikes_item.tpl';
268                 $tpl_item_attend = 'notifications_attend_item.tpl';
269                 $tpl_item_attendno = 'notifications_attend_item.tpl';
270                 $tpl_item_attendmaybe = 'notifications_attend_item.tpl';
271                 $tpl_item_friend = 'notifications_friends_item.tpl';
272                 $tpl_item_comment = 'notifications_comments_item.tpl';
273                 $tpl_item_post = 'notifications_posts_item.tpl';
274                 $tpl_item_notify = 'notify.tpl';
275
276                 // Loop trough ever notification This creates an array with the output html for each
277                 // notification and apply the correct template according to the notificationtype (label).
278                 foreach ($notifs['notifications'] as $it) {
279
280                         // We use the notification label to get the correct template file
281                         $tpl_var_name = 'tpl_item_'.$it['label'];
282                         $tpl_notif = get_markup_template($$tpl_var_name);
283
284                         $notif_content[] = replace_macros($tpl_notif,array(
285                                 '$item_label' => $it['label'],
286                                 '$item_link' => $it['link'],
287                                 '$item_image' => $it['image'],
288                                 '$item_url' => $it['url'],
289                                 '$item_text' => htmlentities($it['text']),
290                                 '$item_when' => $it['when'],
291                                 '$item_ago' => $it['ago'],
292                                 '$item_seen' => $it['seen'],
293                         ));
294                 }
295
296                 // It doesn't make sense to show the Show unread / Show all link visible if the user is on the
297                 // "Show all" page and there are no notifications. So we will hide it.
298                 if($show == 0 || intval($show) && $notifs['total'] > 0) {
299                         $notif_show_lnk = array(
300                                 'href' => ($show ? 'notifications/'.$notifs['ident'] : 'notifications/'.$notifs['ident'].'?show=all' ),
301                                 'text' => ($show ? t('Show unread') : t('Show all')),
302                         );
303                 }
304
305                 // Output if there aren't any notifications available
306                 if($notifs['total'] == 0)
307                         $notif_nocontent = sprintf( t('No more %s notifications.'), $notifs['ident']);
308         }
309
310         $o .= replace_macros($notif_tpl, array(
311                 '$notif_header' => $notif_header,
312                 '$tabs' => $tabs,
313                 '$notif_content' => $notif_content,
314                 '$notif_nocontent' => $notif_nocontent,
315                 '$notif_show_lnk' => $notif_show_lnk,
316                 '$notif_paginate' => paginate($a)
317         ));
318
319         return $o;
320 }