]> git.mxchange.org Git - friendica.git/blob - include/group.php
8956d21c311d57df24a8a98a0704b119c5e66b45
[friendica.git] / include / group.php
1 <?php
2
3
4 function group_add($uid,$name) {
5
6         $ret = false;
7         if (x($uid) && x($name)) {
8                 $r = group_byname($uid,$name); // check for dups
9                 if ($r !== false) {
10
11                         // This could be a problem.
12                         // Let's assume we've just created a group which we once deleted
13                         // all the old members are gone, but the group remains so we don't break any security
14                         // access lists. What we're doing here is reviving the dead group, but old content which
15                         // was restricted to this group may now be seen by the new group members.
16
17                         $z = q("SELECT * FROM `group` WHERE `id` = %d LIMIT 1",
18                                 intval($r)
19                         );
20                         if (count($z) && $z[0]['deleted']) {
21                                 $r = q("UPDATE `group` SET `deleted` = 0 WHERE `uid` = %d AND `name` = '%s'",
22                                         intval($uid),
23                                         dbesc($name)
24                                 );
25                                 notice( t('A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name.') . EOL);
26                         }
27                         return true;
28                 }
29                 $r = dba::insert('group', array('uid' => $uid, 'name' => $name));
30                 $ret = $r;
31         }
32         return $ret;
33 }
34
35
36 function group_rmv($uid,$name) {
37         $ret = false;
38         if (x($uid) && x($name)) {
39                 $r = q("SELECT id FROM `group` WHERE `uid` = %d AND `name` = '%s' LIMIT 1",
40                         intval($uid),
41                         dbesc($name)
42                 );
43                 if (dbm::is_result($r))
44                         $group_id = $r[0]['id'];
45                 if (! $group_id)
46                         return false;
47
48                 // remove group from default posting lists
49                 $r = q("SELECT def_gid, allow_gid, deny_gid FROM user WHERE uid = %d LIMIT 1",
50                        intval($uid)
51                 );
52                 if ($r) {
53                         $user_info = $r[0];
54                         $change = false;
55
56                         if ($user_info['def_gid'] == $group_id) {
57                                 $user_info['def_gid'] = 0;
58                                 $change = true;
59                         }
60                         if (strpos($user_info['allow_gid'], '<' . $group_id . '>') !== false) {
61                                 $user_info['allow_gid'] = str_replace('<' . $group_id . '>', '', $user_info['allow_gid']);
62                                 $change = true;
63                         }
64                         if (strpos($user_info['deny_gid'], '<' . $group_id . '>') !== false) {
65                                 $user_info['deny_gid'] = str_replace('<' . $group_id . '>', '', $user_info['deny_gid']);
66                                 $change = true;
67                         }
68
69                         if ($change) {
70                                 q("UPDATE user SET def_gid = %d, allow_gid = '%s', deny_gid = '%s' WHERE uid = %d",
71                                   intval($user_info['def_gid']),
72                                   dbesc($user_info['allow_gid']),
73                                   dbesc($user_info['deny_gid']),
74                                   intval($uid)
75                                 );
76                         }
77                 }
78
79                 // remove all members
80                 $r = q("DELETE FROM `group_member` WHERE `uid` = %d AND `gid` = %d ",
81                         intval($uid),
82                         intval($group_id)
83                 );
84
85                 // remove group
86                 $r = q("UPDATE `group` SET `deleted` = 1 WHERE `uid` = %d AND `name` = '%s'",
87                         intval($uid),
88                         dbesc($name)
89                 );
90
91                 $ret = $r;
92
93         }
94
95         return $ret;
96 }
97
98 function group_byname($uid,$name) {
99         if ((! $uid) || (! strlen($name)))
100                 return false;
101         $r = q("SELECT * FROM `group` WHERE `uid` = %d AND `name` = '%s' LIMIT 1",
102                 intval($uid),
103                 dbesc($name)
104         );
105         if (dbm::is_result($r))
106                 return $r[0]['id'];
107         return false;
108 }
109
110 function group_rmv_member($uid,$name,$member) {
111         $gid = group_byname($uid,$name);
112         if (! $gid)
113                 return false;
114         if (! ( $uid && $gid && $member))
115                 return false;
116         $r = q("DELETE FROM `group_member` WHERE `uid` = %d AND `gid` = %d AND `contact-id` = %d",
117                 intval($uid),
118                 intval($gid),
119                 intval($member)
120         );
121         return $r;
122
123
124 }
125
126
127 function group_add_member($uid,$name,$member,$gid = 0) {
128         if (! $gid)
129                 $gid = group_byname($uid,$name);
130         if ((! $gid) || (! $uid) || (! $member))
131                 return false;
132
133         $r = q("SELECT * FROM `group_member` WHERE `uid` = %d AND `gid` = %d AND `contact-id` = %d LIMIT 1",
134                 intval($uid),
135                 intval($gid),
136                 intval($member)
137         );
138         if (dbm::is_result($r))
139                 return true;    // You might question this, but
140                                 // we indicate success because the group member was in fact created
141                                 // -- It was just created at another time
142         if (! dbm::is_result($r)) {
143                 $r = dba::insert('group_member', array('uid' => $uid, 'gid' => $gid, 'contact-id' => $member));
144         }
145         return $r;
146 }
147
148 function group_get_members($gid) {
149         $ret = array();
150         if (intval($gid)) {
151                 $r = q("SELECT `group_member`.`contact-id`, `contact`.* FROM `group_member`
152                         INNER JOIN `contact` ON `contact`.`id` = `group_member`.`contact-id`
153                         WHERE `gid` = %d AND `group_member`.`uid` = %d AND
154                                 NOT `contact`.`self` AND NOT `contact`.`blocked` AND NOT `contact`.`pending`
155                                 ORDER BY `contact`.`name` ASC ",
156                         intval($gid),
157                         intval(local_user())
158                 );
159                 if (dbm::is_result($r))
160                         $ret = $r;
161         }
162         return $ret;
163 }
164
165 function group_public_members($gid) {
166         $ret = 0;
167         if (intval($gid)) {
168                 $r = q("SELECT `contact`.`id` AS `contact-id` FROM `group_member`
169                         INNER JOIN `contact` ON `contact`.`id` = `group_member`.`contact-id`
170                         WHERE `gid` = %d AND `group_member`.`uid` = %d
171                         AND  `contact`.`network` = '%s' AND `contact`.`notify` != '' ",
172                         intval($gid),
173                         intval(local_user()),
174                         dbesc(NETWORK_OSTATUS)
175                 );
176                 if (dbm::is_result($r))
177                         $ret = count($r);
178         }
179         return $ret;
180 }
181
182
183 function mini_group_select($uid,$gid = 0, $label = "") {
184
185         $grps = array();
186         $o = '';
187
188         $r = q("SELECT * FROM `group` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC",
189                 intval($uid)
190         );
191         $grps[] = array('name' => '', 'id' => '0', 'selected' => '');
192         if (dbm::is_result($r)) {
193                 foreach ($r as $rr) {
194                         $grps[] = array('name' => $rr['name'], 'id' => $rr['id'], 'selected' => (($gid == $rr['id']) ? 'true' : ''));
195                 }
196
197         }
198         logger('groups: ' . print_r($grps,true));
199
200         if ($label == "")
201                 $label = t('Default privacy group for new contacts');
202
203         $o = replace_macros(get_markup_template('group_selection.tpl'), array(
204                 '$label' => $label,
205                 '$groups' => $grps
206         ));
207         return $o;
208 }
209
210
211 /**
212  * @brief Create group sidebar widget
213  *
214  * @param string $every
215  * @param string $each
216  * @param string $editmode
217  *      'standard' => include link 'Edit groups'
218  *      'extended' => include link 'Create new group'
219  *      'full' => include link 'Create new group' and provide for each group a link to edit this group
220  * @param int $group_id
221  * @param int $cid
222  * @return string
223  */
224 function group_side($every="contacts",$each="group",$editmode = "standard", $group_id = 0, $cid = 0) {
225
226         $o = '';
227
228         if (! local_user())
229                 return '';
230
231         $groups = array();
232
233         $groups[] = array(
234                 'text'  => t('Everybody'),
235                 'id' => 0,
236                 'selected' => (($group_id == 0) ? 'group-selected' : ''),
237                 'href'  => $every,
238         );
239
240
241
242         $r = q("SELECT * FROM `group` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC",
243                 intval($_SESSION['uid'])
244         );
245         $member_of = array();
246         if ($cid) {
247                 $member_of = groups_containing(local_user(),$cid);
248         }
249
250         if (dbm::is_result($r)) {
251                 foreach ($r as $rr) {
252                         $selected = (($group_id == $rr['id']) ? ' group-selected' : '');
253
254                         if ($editmode == "full") {
255                                 $groupedit = array(
256                                         'href' => "group/".$rr['id'],
257                                         'title' => t('edit'),
258                                 );
259                         } else {
260                                 $groupedit = null;
261                         }
262
263                         $groups[] = array(
264                                 'id'            => $rr['id'],
265                                 'cid'           => $cid,
266                                 'text'          => $rr['name'],
267                                 'selected'      => $selected,
268                                 'href'          => $each."/".$rr['id'],
269                                 'edit'          => $groupedit,
270                                 'ismember'      => in_array($rr['id'],$member_of),
271                         );
272                 }
273         }
274
275
276         $tpl = get_markup_template("group_side.tpl");
277         $o = replace_macros($tpl, array(
278                 '$title'        => t('Groups'),
279                 'newgroup'      => (($editmode == "extended") || ($editmode == "full") ? 1 : ''),
280                 '$editgroupstext' => t('Edit groups'),
281                 'grouppage'     => "group/",
282                 '$edittext'     => t('Edit group'),
283                 '$createtext'   => t('Create a new group'),
284                 '$creategroup'  => t('Group Name: '),
285                 '$form_security_token' => get_form_security_token("group_edit"),
286                 '$ungrouped'    => (($every === 'contacts') ? t('Contacts not in any group') : ''),
287                 '$groups'       => $groups,
288                 '$add'          => t('add'),
289         ));
290
291
292         return $o;
293 }
294
295 function expand_groups($a,$check_dead = false, $use_gcontact = false) {
296         if (! (is_array($a) && count($a)))
297                 return array();
298         $groups = implode(',', $a);
299         $groups = dbesc($groups);
300
301         if ($use_gcontact)
302                 $r = q("SELECT `gcontact`.`id` AS `contact-id` FROM `group_member`
303                                 INNER JOIN `contact` ON `contact`.`id` = `group_member`.`contact-id`
304                                 INNER JOIN `gcontact` ON `gcontact`.`nurl` = `contact`.`nurl`
305                         WHERE `gid` IN ($groups)");
306         else
307                 $r = q("SELECT `contact-id` FROM `group_member` WHERE `gid` IN ( $groups )");
308
309
310         $ret = array();
311         if (dbm::is_result($r))
312                 foreach ($r as $rr)
313                         $ret[] = $rr['contact-id'];
314         if ($check_dead && !$use_gcontact) {
315                 require_once('include/acl_selectors.php');
316                 $ret = prune_deadguys($ret);
317         }
318         return $ret;
319 }
320
321
322 function member_of($c) {
323
324         $r = q("SELECT `group`.`name`, `group`.`id` FROM `group` INNER JOIN `group_member` ON `group_member`.`gid` = `group`.`id` WHERE `group_member`.`contact-id` = %d AND `group`.`deleted` = 0 ORDER BY `group`.`name`  ASC ",
325                 intval($c)
326         );
327
328         return $r;
329
330 }
331
332 function groups_containing($uid,$c) {
333
334         $r = q("SELECT `gid` FROM `group_member` WHERE `uid` = %d AND `group_member`.`contact-id` = %d ",
335                 intval($uid),
336                 intval($c)
337         );
338
339         $ret = array();
340         if (dbm::is_result($r)) {
341                 foreach ($r as $rr) {
342                         $ret[] = $rr['gid'];
343                 }
344         }
345
346         return $ret;
347 }
348 /**
349  * @brief count unread group items
350  *
351  * Count unread items of each groups
352  *
353  * @return array
354  *      'id' => group id
355  *      'name' => group name
356  *      'count' => counted unseen group items
357  *
358  */
359 function groups_count_unseen() {
360
361         $r = q("SELECT `group`.`id`, `group`.`name`,
362                         (SELECT COUNT(*) FROM `item` FORCE INDEX (`uid_unseen_contactid`)
363                                 WHERE `uid` = %d AND `unseen` AND
364                                         `contact-id` IN (SELECT `contact-id` FROM `group_member`
365                                                                 WHERE `group_member`.`gid` = `group`.`id` AND `group_member`.`uid` = %d)) AS `count`
366                         FROM `group` WHERE `group`.`uid` = %d;",
367                 intval(local_user()),
368                 intval(local_user()),
369                 intval(local_user())
370         );
371
372         return $r;
373 }
374
375 /**
376  * @brief Returns the default group for a given user and network
377  *
378  * @param int $uid User id
379  * @param string $network network name
380  *
381  * @return int group id
382  */
383 function get_default_group($uid, $network = "") {
384
385         $default_group = 0;
386
387         if ($network == NETWORK_OSTATUS)
388                 $default_group = get_pconfig($uid, "ostatus", "default_group");
389
390         if ($default_group != 0)
391                 return $default_group;
392
393         $g = q("SELECT `def_gid` FROM `user` WHERE `uid` = %d LIMIT 1", intval($uid));
394         if ($g && intval($g[0]["def_gid"]))
395                 $default_group = $g[0]["def_gid"];
396
397         return $default_group;
398 }